OpenSSH의 AuthorizedPrincipalsCommand를 통한 사용자 조회

Tier: Free, Premium, Ultimate Offering: Self-Managed

GitLab의 기본 SSH 인증은 사용자가 SSH 전송을 사용하기 전에 SSH 공개 키를 업로드해야합니다.

중앙집중식(예: 기업) 환경에서는 특히 임시 키(발급 후 24시간 후 만료되는 키 포함)를 사용자에게 발급하는 경우 운영 측면에서 불편할 수 있습니다.

이러한 설정에서는 새 키를 지속적으로 GitLab에 업로드해야하는 외부 자동화 프로세스가 필요합니다.

경고: AuthorizedKeysCommand가 지문을 허용해야하기 때문에 OpenSSH 버전 6.9+이 필요합니다. 서버의 OpenSSH 버전을 확인하세요.

OpenSSH 인증서 사용의 이점

OpenSSH 인증서를 사용하면 GitLab에서 키를 소유한 사용자에 대한 모든 정보가 키 자체에 인코딩되며, OpenSSH 자체가 사용자가 이를 조작할 수 없도록 보장합니다. 사용자는 프라이빗 CA 서명 키에 액세스해야하므로이를 위조할 수 없습니다.

올바르게 설정하면 이를 통해 사용자의 SSH 키를 GitLab에 업로드 할 필요가 없어집니다.

GitLab Shell을 통한 SSH 인증서 조회 설정

SSH 인증서를 완전히 설정하는 방법은 이 문서의 범위를 벗어납니다. 예를 들어 이것이 어떻게 작동하는지 알아보려면 OpenSSH의PROTOCOL.certkeys를 참조하거나, RedHat의 문서를 참조하세요.

이미 SSH 인증서가 설정되어 있고 TrustedUserCAKeyssshd_config에 추가했다고 가정합니다. 예를 들어:

TrustedUserCAKeys /etc/security/mycompany_user_ca.pub

일반적으로 이러한 설정에서 TrustedUserCAKeysMatch User git에 속하지 않을 것입니다. 왜냐하면 이것은 GitLab 서버 자체로의 시스템 로그인에도 사용되기 때문입니다. 그러나 설정은 달라질 수 있습니다. 만약 CA가 GitLab에만 사용되는 경우 Match User git 섹션에 이를 넣는 것을 고려해보세요 (아래 설명 참조).

해당 CA에서 발급된 SSH 인증서는 해당 사용자의 GitLab 사용자 이름에 해당하는 “키 ID”를 반드시 가져야합니다. 예를들어 (간략화를 위해 일부 출력 생략):

$ ssh-add -L | grep cert | ssh-keygen -L -f -

(stdin):1:
        Type: ssh-rsa-cert-v01@openssh.com user certificate
        Public key: RSA-CERT SHA256:[...]
        Signing CA: RSA SHA256:[...]
        Key ID: "aearnfjord"
        Serial: 8289829611021396489
        Valid: from 2018-07-18T09:49:00 to 2018-07-19T09:50:34
        Principals:
                sshUsers
                [...]
        [...]

기술적으로 엄밀하게는 그렇지 않습니다. 예를들어, 서버에 prod-aearnfjord 사용자로 로그인하는 SSH 인증서라면 prod-aearnfjord일 수 있지만, 이 경우 우리가 제공하는 기본 설정이 아닌 고유의 AuthorizedPrincipalsCommnad를 지정해야합니다.

중요한 점은 AuthorizedPrincipalsCommand가 “키 ID”에서 GitLab 사용자 이름으로 매핑할 수 있어야하며, 우리가 제공하는 기본 명령은 두 가지 간에 1대1의 매핑이 있다고 가정합니다. 그 이유는 키 자체에서 GitLab 사용자 이름을 추출할 수 있도록하는 것이 목적이기 때문입니다.

그런 다음 sshd_config에서 git 사용자를 위해AuthorizedPrincipalsCommand를 설정하세요. 희망적으로는 GitLab에 기본으로 제공되는 것을 사용할 수 있을 것입니다:

Match User git
    AuthorizedPrincipalsCommandUser root
    AuthorizedPrincipalsCommand /opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell-authorized-principals-check %i sshUsers

이 명령은 다음과 같이 출력됩니다:

command="/opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell username-{KEY_ID}",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty {PRINCIPAL}

여기서 {KEY_ID}는 스크립트로 전달된 %i 인수 (예: aeanfjord)이고{PRINCIPAL}는 해당하는 principal(예: sshUsers)입니다.

sshUsers의 일부 중요한 위치에 있어야합니다. 이 위치에는 GitLab에 로그인 할 수 있는 모든 사용자의 키에 보증되는 명칭이 있어야하며, 사용자를 위한 목록을 제공해야합니다. 예를 들어:

    [...]
    AuthorizedPrincipalsCommand /opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell-authorized-principals-check %i sshUsers windowsUsers

원칙 및 보안

원하는 만큼 다수의 주체를 제공할 수 있으며, 이들은 AuthorizedPrincipalsFile 문서에 설명된 대로 authorized_keys 출력의 여러 줄로 변환됩니다.

일반적으로 OpenSSH와 AuthorizedKeysCommand를 사용할 때, 주체는 해당 서버에 로그인할 수 있는 “그룹”입니다. 그러나 GitLab에서는 OpenSSH의 요구사항을 만족시키기 위해 사용되며 결국 “키 ID”가 올바른지에만 관심이 있습니다. 이것이 추출되면 GitLab은 해당 사용자에 대한 자체 ACL을 강제합니다(예: 사용자가 액세스할 수 있는 프로젝트).

따라서 받아들이는 것이 지나치게 관대해도 괜찮습니다. 예를 들어, 사용자가 GitLab에 액세스할 수 없는 경우에는 잘못된 사용자에 대한 메시지가 포함된 오류가 발생합니다.

authorized_keys 파일과의 상호 작용

SSH 인증서는 authorized_keys 파일과 함께 사용할 수 있으며, 위에서 구성한 대로 설정된 경우 authorized_keys 파일은 여전히 대체 수단으로 작동합니다.

이는 AuthorizedPrincipalsCommand가 사용자를 인증할 수 없는 경우에 OpenSSH가 ~/.ssh/authorized_keys(또는 AuthorizedKeysCommand)로 대체할 수 있기 때문입니다.

따라서 이와 함께 데이터베이스에서 SSH 키를 빠르게 조회하는 방법을 사용하는 이유가 여전히 있을 수 있습니다. 일반 사용자가 모두 SSH 인증서를 사용하고, ~/.ssh/authorized_keys를 대체 수단으로 사용하는 경우, 특히 배포 키의 경우 사용할 수 있습니다.

그러나 이를 할 이유가 없을 수도 있습니다. 일반 사용자가 빠른 AuthorizedPrincipalsCommand 경로를 사용하고, 자동화된 배포 키 액세스만이 ~/.ssh/authorized_keys를 대체하는 경우, 또는 일반 사용자에 대해 (특히 갱신된 경우) 배포 키보다 더 많은 키가 있을 때 등.

기타 보안 주의사항

사용자는 여전히 SSH 인증서 인증을 우회하여 SSH 공개 키를 프로필에 수동으로 업로드하여 ~/.ssh/authorized_keys 대체 수단으로 이것을 인증할 수 있습니다. 현재 이를 방지하는 기능은 없지만 추가 요청이 있습니다.

현재 이러한 제한은 예를 들어 gitlab-shell-authorized-keys-check에서 반환된 발견된 키 ID가 배포 키인지 여부를 확인하는 사용자 정의 AuthorizedKeysCommand를 제공하여 해킹될 수 있습니다(배포 키가 아닌 경우 모두 거부해야 함).

SSH 키가 없는 사용자에 대한 전역 경고 해제

기본적으로 GitLab은 프로필에 SSH 키를 업로드하지 않은 사용자에게 “프로젝트 코드를 SSH로 끌어오거나 밀어넣을 수 없습니다”는 경고를 표시합니다.

이것은 SSH 인증서를 사용하는 경우에는 비생산적인데, 사용자가 자신의 키를 업로드할 것으로 기대되지 않기 때문입니다.

이 경고를 전역적으로 비활성화하려면 “응용 프로그램 설정 -> 계정 및 제한 설정”으로 이동하여 “사용자 추가 SSH 키 메시지 표시” 설정을 비활성화하십시오.

이 설정은 목적은 SSH 인증서를 사용하기 위해 구체적으로 추가되었지만, 경고를 숨기고 싶은 다른 이유가 있다면 사용하지 않아도 됩니다.