OpenSSH의 AuthorizedPrincipalsCommand를 사용한 사용자 조회

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

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

중앙 집중식 (예: 기업) 환경에서는 특히 임시로 발급된 키, 예를 들어 발급 후 24시간 후에 만료되는 키를 사용자가 업로드하는 것이 운영상의 문제가 될 수 있습니다.

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

caution
AuthorizedKeysCommand가 지문을 수락해야 하므로 OpenSSH 버전 6.9+이 필요합니다. 서버에서 OpenSSH 버전을 확인하세요.

OpenSSH 인증서 사용 이유

OpenSSH 인증서를 사용하면 GitLab 사용자에 대한 모든 정보가 키 자체에 인코딩되며, OpenSSH 자체에서 사용자가 이를 위조할 수 없도록 보장합니다. 올바르게 설정하면 사용자 SSH 키를 GitLab에 업로드할 필요가 없어집니다.

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

SSH 인증서를 완전히 설정하는 방법은 이 문서의 범위를 벗어납니다. 예를 들어 이 작업 방식을 알아보려면 OpenSSH의 PROTOCOL.certkeys를 참조하세요. 예를 들어 RedHat 문서를 참조하세요.

이미 SSH 인증서를 사용하고 있고 sshd_config에 CA의 TrustedUserCAKeys를 추가했다고 가정합니다. 예를 들어:

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’ 같이 일반적으로 prod-aearnfjord 사용자로 서버에 로그인 하는 SSH 인증서라면 이 부분이 엄격하게 참이라고는 말할 수 없습니다. 그렇다면 기본 공개 키에서 사용자 이름 매핑 대신 사용자 지정 AuthorizedPrincipalsCommand을 지정해야 합니다.

중요한 점은 AuthorizedPrincipalsCommand가 “키 ID”를 GitLab 사용자 이름으로 매핑할 수 있어야 한다는 것입니다. 우리가 제공한 기본 명령어는 둘 사이에 1대1 매핑이 있다고 가정합니다. 왜냐하면 이것의 목적은 키 자체에서 GitLab 사용자 이름을 추출하여 기본 공개 키에서 사용자 이름 매핑과 같은 것에 의존하는 것이 아니기 때문입니다.

그리고 sshd_config에서 git 사용자를 위해 AuthorizedPrincipalsCommand를 설정하세요. 기본 명령어를 사용할 수 있었으면 좋겠습니다:

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}은 전달되는 프린시펄 입니다 (예: sshUsers).

sshUsers 부분을 사용자가 전부 GitLab에 접속할 수 있는 키의 일부로 보장하는 프린시펄로 사용자 정의해야합니다. 또는 사용자가 사용 가능하도록 보장하는 프린시펄의 디렉터리을 제공해야합니다. 예를 들어:

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

원칙과 보안

원하는만큼 많은 프린시펄들을 제공할 수 있으며 이것들은 sshd_config(5)AuthorizedPrincipalsFile 설명에 명시된 대로 authorized_keys 출력의 여러 줄로 변환됩니다.

OpenSSH와 함께 AuthorizedKeysCommand를 사용할 때 일반적인 사용자 그룹에 대한 “그룹”인 프린시펄을 제공합니다. 그러나 GitLab에서는 OpenSSH의 요구에 충족시키기 위해서만 사용됩니다. 우리는 단순히 “키 ID”가 올바른지 만을 중요시하기 때문입니다. 일단 추출되면 GitLab은 해당 사용자에 대한 자체 ACL을 강제합니다 (예: 사용자가 액세스할 수 있는 프로젝트).

따라서 받아들이는 것에 있어서 지나치게 관대한 것이 문제가 되지 않습니다. 예를 들어, 사용자가 GitLab에 액세스할 수 없는 경우, 유효하지 않은 사용자에 대한 메시지가 생성됩니다.

authorized_keys 파일과의 상호 작용

SSH 인증서는 authorized_keys 파일과 함께 사용될 수 있으며 위에서 구성한 대로 AuthorizedPrincipalsCommand로 사용자를 인증할 수 없을 경우 ~/.ssh/authorized_keys 파일을 여전히 대체로 사용합니다.

따라서 이 방법과 함께 데이터베이스에서 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 인증서 사용을 위해 추가되었지만, 만약 다른 이유로 경고를 숨기고 싶다면 인증서를 사용하지 않고 끌 수 있습니다.