GitLab과 통신하기 위해 SSH 키 사용하기

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

Git은 분산 버전 관리 시스템으로, 로컬에서 작업한 다음 변경 사항을 서버에 공유하거나 push할 수 있습니다. 이 경우, push하는 서버는 GitLab입니다.

GitLab은 SSH 프로토콜을 사용하여 Git과 안전하게 통신합니다. GitLab 원격 서버에 인증하기 위해 SSH 키를 사용하면 매번 사용자 이름과 암호를 제공할 필요가 없습니다.

SSH 키란

SSH는 공개 키와 개인 키 두 개의 키를 사용합니다.

  • 공개 키는 공개될 수 있습니다.
  • 개인 키는 보호해야 합니다.

비밀 데이터를 공개 키로 공개할 수 없습니다. SSH 공개 키를 복사하거나 업로드해야 하는 경우 실수로 개인 키를 복사하거나 업로드하지 않도록 주의하십시오.

귀하의 개인 키를 사용하여 커밋에 서명함으로써 GitLab 사용 및 데이터 사용을 더욱 안전하게 할 수 있습니다. 그런 다음이 서명은 귀하의 공개 키를 사용하여 누구든 확인할 수 있습니다.

자세한 내용은 비대칭 암호화, 일명 공개 키 암호화를 참조하십시오.

사전 요구 사항

GitLab과 통신하기 위해 SSH를 사용하려면 다음이 필요합니다.

  • GNU/Linux, macOS 및 Windows 10에 미리 설치된 OpenSSH 클라이언트
  • SSH 버전 6.5 이상. 이전 버전에서는 안전하지 않은 MD5 서명이 사용되었습니다.

시스템에 설치된 SSH 버전을 보려면 ssh -V를 실행하십시오.

지원되는 SSH 키 유형

GitLab과 통신하기 위해 다음 SSH 키 유형을 사용할 수 있습니다.

관리자는 허용된 키 및 최소 길이를 제한할 수 있습니다.

ED25519 SSH 키

Practical Cryptography With Go에 따르면 ED25519 키가 RSA 키보다 더 안전하고 성능이 우수하다고 합니다.

OpenSSH 6.5에서 2014년에 도입된 ED25519 SSH 키는 대부분의 운영 체제에서 사용할 수 있어야 합니다.

ED25519_SK SSH 키

GitLab에서 ED25519_SK SSH 키를 사용하려면 로컬 클라이언트 및 GitLab 서버에 OpenSSH 8.2 이상이 설치되어 있어야 합니다.

ECDSA_SK SSH 키

GitLab에서 ECDSA_SK SSH 키를 사용하려면 로컬 클라이언트 및 GitLab 서버에 OpenSSH 8.2 이상이 설치되어 있어야 합니다.

RSA SSH 키

  • GitLab 16.3에서 최대 RSA 키 길이가 변경되었습니다.

사용 가능한 문서에서 ED25519이 RSA보다 더 안전하다고 합니다.

RSA 키를 사용하는 경우 미국 국립 표준 기술 연구소(NIST)는 2048비트 이상의 키 크기를 권장합니다. Go의 제한으로 인해 RSA 키는 8192비트를 초과할 수 없습니다.

기본 키 크기는 사용 중인 ssh-keygen 버전에 따라 다릅니다. 자세한 내용은 설치된 ssh-keygen 명령의 man 페이지를 참조하십시오.

기존 SSH 키 쌍 확인하기

키 쌍을 생성하기 전에 이미 키 쌍이 있는지 확인하세요.

  1. 홈 디렉토리로 이동합니다.
  2. .ssh/ 하위 디렉토리로 이동합니다. .ssh/ 하위 디렉토리가 없다면, 홈 디렉토리에 있지 않거나 이전에 ssh를 사용한 적이 없는 것입니다. 후자의 경우, SSH 키 쌍을 생성해야 합니다.
  3. 다음과 같은 형식의 파일이 있는지 확인합니다:

    알고리즘 공개 키 개인 키
    ED25519 (권장) id_ed25519.pub id_ed25519
    ED25519_SK id_ed25519_sk.pub id_ed25519_sk
    ECDSA_SK id_ecdsa_sk.pub id_ecdsa_sk
    RSA (최소 2048비트 키 사이즈) id_rsa.pub id_rsa
    DSA (사용 중지) id_dsa.pub id_dsa
    ECDSA id_ecdsa.pub id_ecdsa

SSH 키 쌍 생성하기

기존 SSH 키 쌍이 없다면, 새로 생성하세요:

  1. 터미널을 엽니다.
  2. ssh-keygen -t 다음에 키 유형 및 선택 사항 주석을 입력합니다. 이 주석은 생성된 .pub 파일에 포함됩니다. 주석으로 이메일 주소를 사용하는 것이 좋습니다.

    예를 들어, ED25519의 경우:

    ssh-keygen -t ed25519 -C "<comment>"
    

    2048비트 RSA의 경우:

    ssh-keygen -t rsa -b 2048 -C "<comment>"
    
  3. Enter 키를 누릅니다. 다음과 유사한 출력이 표시됩니다:

    공개/개인 ed25519 키 쌍을 생성합니다.
    키를 저장할 파일 이름을 입력하십시오(/home/user/.ssh/id_ed25519):
    
  4. 제안된 파일 이름과 디렉토리를 수락합니다. 배포 키를 생성하는 경우나 다른 키를 저장하는 특정 디렉토리에 저장하려는 경우를 제외하고는 기본값을 사용하세요.

    또한 SSH 키 쌍을 특정 호스트에 지정할 수 있습니다.

  5. 암호 구문을 지정합니다:

    암호를 입력하십시오(입력하지 않으려면 빈칸으로 두십시오):
    동일한 암호를 다시 입력하십시오:
    

    파일이 저장된 위치에 대한 정보를 포함한 확인이 표시됩니다.

공개 및 개인 키가 생성됩니다. 공개 SSH 키를 GitLab 계정에 추가하고, 개인 키를 안전하게 보관하세요.

SSH를 다른 디렉토리를 가리키도록 구성하기

기본 디렉토리에 SSH 키 쌍을 저장하지 않았다면, SSH 클라이언트를 개인 키가 저장된 디렉토리를 가리키도록 구성하세요.

  1. 터미널을 열고 다음 명령을 실행합니다:

    eval $(ssh-agent -s)
    ssh-add <개인 SSH 키가 있는 디렉토리>
    
  2. 이러한 설정을 ~/.ssh/config 파일에 저장합니다. 예를 들어:

    # GitLab.com
    Host gitlab.com
      PreferredAuthentications publickey
      IdentityFile ~/.ssh/gitlab_com_rsa
    
    # 개인 GitLab 인스턴스
    Host gitlab.company.com
      PreferredAuthentications publickey
      IdentityFile ~/.ssh/example_com_rsa
    

이러한 설정에 대한 자세한 정보는 SSH 구성 매뉴얼의 man ssh_config 페이지를 참조하십시오.

GitLab에서 공개 SSH 키는 고유해야 하며, 계정에 바인딩됩니다. SSH로 코드를 푸시할 때 SSH 키가 유일한 식별자이며, 단일 사용자에 대해 고유해야 합니다.

SSH 키 암호 업데이트하기

SSH 키의 암호를 업데이트할 수 있습니다:

  1. 터미널을 열고 다음 명령을 실행합니다:

    ssh-keygen -p -f /path/to/ssh_key
    
  2. 프롬프트에 암호를 입력한 후 Enter 키를 누릅니다.

RSA 키 쌍을 보다 안전한 형식으로 업그레이드하기

OpenSSH 버전이 6.5에서 7.8 사이인 경우, 터미널을 열고 다음 명령을 실행하여 개인 RSA SSH 키를 더 안전한 OpenSSH 형식으로 저장할 수 있습니다:

ssh-keygen -o -f ~/.ssh/id_rsa

또는 다음 명령을 사용하여 보다 안전한 암호화 형식의 새 RSA 키를 생성할 수 있습니다:

ssh-keygen -o -t rsa -b 4096 -C "<comment>"

FIDO2 하드웨어 보안 키용 SSH 키 쌍 생성

ED25519_SK 또는 ECDSA_SK SSH 키를 생성하려면 OpenSSH 8.2 이상을 사용해야 합니다:

  1. 컴퓨터에 하드웨어 보안 키를 연결합니다.
  2. 터미널을 엽니다.
  3. ssh-keygen -t 다음에 키 유형과 선택 사항으로 주석을 붙여 실행합니다.
    이 주석은 생성된 .pub 파일에 포함됩니다.
    주석으로 이메일 주소를 사용하는 것이 좋습니다.

    예를 들어, ED25519_SK의 경우:

    ssh-keygen -t ed25519-sk -C "<주석>"
    

    ECDSA_SK의 경우:

    ssh-keygen -t ecdsa-sk -C "<주석>"
    

    보안 키가 FIDO2 보존 키를 지원하는 경우 SSH 키를 생성하는 동안 이 기능을 활성화할 수 있습니다:

    ssh-keygen -t ed25519-sk -O resident -C "<주석>"
    

    -O resident는 키가 FIDO 인증기 자체에 저장되어야 함을 나타냅니다.
    보존 키는 새 컴퓨터로 가져오기가 더 쉽습니다.
    보안 키에서 직접로드할 수 있기 때문에 ssh-add -K 또는 ssh-keygen -K로 등록할 필요가 없습니다.

  4. Enter을 누릅니다. 다음과 유사한 출력이 표시됩니다:

    공개/개인 ed25519-sk 키 쌍을 생성하는 중입니다.
    귀하의 인증서에 터치해 키 생성을 승인할 수 있을지도 모릅니다.
    
  5. 하드웨어 보안 키의 버튼을 누릅니다.

  6. 제안된 파일 이름과 디렉터리를 수락합니다:

    키를 저장할 파일 입력(예: /home/user/.ssh/id_ed25519_sk):
    
  7. 암호를 지정합니다:

    암호 입력(입력하지 않으려면 비워 두십시오):
    동일한 암호를 다시 입력하십시오:
    

    파일 저장 위치에 대한 정보를 포함한 확인이 표시됩니다.

공개 및 개인 키가 생성됩니다.
공개 SSH 키를 GitLab 계정에 추가하세요.

패스워드 관리자를 사용하여 SSH 키 쌍 생성

1Password를 사용하여 SSH 키 쌍 생성

1Password1Password 브라우저 확장 프로그램을 사용하여 다음 중 하나를 수행할 수 있습니다:

  • 자동으로 새 SSH 키를 생성합니다.
  • 1Password 보관함에 있는 기존 SSH 키를 사용하여 GitLab을 인증합니다.
  1. GitLab에 로그인합니다.
  2. 왼쪽 사이드바에서 아바타를 선택합니다.
  3. 프로필 편집을 선택합니다.
  4. 왼쪽 사이드바에서 SSH 키를 선택합니다.
  5. 새 키 추가를 선택합니다.
  6. 를 선택하고, 1Password 도우미가 표시됩니다.
  7. 1Password 아이콘을 선택하고 1Password를 잠금해제합니다.
  8. 그런 다음 SSH 키 생성을 선택하거나 기존 SSH 키를 선택하여 공개 키를 채울 수 있습니다.
  9. 제목 상자에 Work Laptop 또는 Home Workstation 같은 설명을 입력합니다.
  10. 선택 사항. 키의 사용 유형을 지정합니다. Authentication 또는 Signing 또는 둘 다에 사용할 수 있습니다. Authentication & Signing이 기본값입니다.
  11. 선택 사항. 기본 만료 날짜를 수정하려면 만료 날짜를 업데이트합니다.
  12. 키 추가를 선택합니다.

SSH 키와 1Password의 사용에 대한 자세한 내용은 1Password 문서를 참조하십시오.

GitLab 계정에 SSH 키 추가

GitLab에서 SSH를 사용하려면 공개 키를 GitLab 계정으로 복사합니다:

  1. 공개 키 파일의 내용을 복사합니다. 수동으로 수행하거나 스크립트를 사용할 수 있습니다. 예를 들어, ED25519 키를 클립 보드로 복사하려면:

    macOS

    tr -d '\n' < ~/.ssh/id_ed25519.pub | pbcopy
    

    Linux (xclip 패키지가 필요합니다)

    xclip -sel clip < ~/.ssh/id_ed25519.pub
    

    Windows의 Git Bash

    cat ~/.ssh/id_ed25519.pub | clip
    

    파일 이름을 id_rsa.pub로 사용하여 RSA의 경우와 같이 파일 이름을 바꿉니다.

  2. GitLab에 로그인합니다.
  3. 왼쪽 사이드바에서 아바타를 선택합니다.
  4. 프로필 편집을 선택합니다.
  5. 왼쪽 사이드바에서 SSH 키를 선택합니다.
  6. 새 키 추가를 선택합니다.
  7. 상자에 공개 키의 내용을 붙여넣습니다. 수동으로 키를 복사했다면 시작이 ssh-rsa, ssh-dss, ecdsa-sha2-nistp256, ecdsa-sha2-nistp384, ecdsa-sha2-nistp521, ssh-ed25519, sk-ecdsa-sha2-nistp256@openssh.com, 또는 sk-ssh-ed25519@openssh.com인 전체 키를 복사하는 것을 확인합니다. 필요한 경우 주석으로 끝날 수 있습니다.
  8. 제목 상자에 Work Laptop 또는 Home Workstation과 같은 설명을 입력합니다.
  9. 선택 사항. 키의 사용 유형을 지정합니다. Authentication 또는 Signing 또는 둘 다에 사용할 수 있습니다. Authentication & Signing이 기본값입니다.
  10. 선택 사항. 기본 만료 날짜를 수정하려면 만료 날짜를 업데이트합니다. - GitLab 13.12 이전 버전에서는 만료 날짜는 정보 제공만 하는 것입니다. 키 사용을 막지는 않습니다. 관리자는 만료 날짜를 확인하고 키 삭제 시에 이를 가이드로 사용할 수 있습니다. - GitLab은 매일 UTC 오전 2시에 모든 SSH 키를 확인합니다. 현재 날짜에 만료되는 모든 SSH 키에 대한 만료 알림 이메일을 보냅니다. (GitLab 13.11에서 도입됨.) - GitLab은 매일 UTC 오전 1시에 만료 예정일이 일주일 후인 모든 SSH 키에 대한 만료 알림 이메일을 보냅니다. (GitLab 13.11에서 도입됨.)
  11. 키 추가를 선택합니다.

연결할 수 있는지 확인

SSH 키가 올바르게 추가되었는지 확인합니다.

다음 명령은 예시 호스트 이름인 gitlab.example.com을 사용합니다. 해당 예시 호스트 이름을 GitLab 인스턴스의 호스트 이름으로 바꿔야 합니다. 예를 들어 gitlab.com과 같이요.

기본적으로 GitLab은 git 사용자 이름을 사용하여 인증합니다. 만약 관리자에의해 변경되었다면 다를 수 있습니다.

  1. 올바른 서버에 연결하는지 확인하려면, 서버의 SSH 호스트 키 지문을 확인하세요.:
    • GitLab.com의 경우 SSH 호스트 키 지문 문서를 참조하세요.
    • 다른 GitLab 인스턴스의 경우, gitlab.example.com/help/instance_configuration#ssh-host-keys-fingerprints를 참조하세요. 여기서 gitlab.example.comgitlab.com (GitLab.com의 경우) 또는 GitLab 인스턴스의 주소입니다.
  2. 터미널을 열고 다음 명령을 실행하여 GitLab 인스턴스 URL로 gitlab.example.com을 바꿉니다.

    ssh -T git@gitlab.example.com
    
  3. 처음 연결하는 경우 GitLab 호스트의 신원을 확인해야 합니다. 다음과 같은 메시지가 표시된다면:

    The authenticity of host 'gitlab.example.com (35.231.145.151)' can't be established.
    ECDSA key fingerprint is SHA256:HbW3g8zUjNSksFbqTiUWPWg2Bq1x8xdGUrliXFzSnUw.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added 'gitlab.example.com' (ECDSA) to the list of known hosts.
    

    yes를 입력하고 Enter를 누릅니다.

  4. 다시 ssh -T git@gitlab.example.com 명령을 실행합니다. 그러면 Welcome to GitLab, @username! 메시지를 받아야 합니다.

환영 메시지가 표시되지 않는 경우 ssh를 상세 모드로 실행하여 문제를 해결할 수 있습니다.

ssh -Tvvv git@gitlab.example.com

서로 다른 저장소에 대해 서로 다른 키 사용

각 저장소에 대해 다른 키를 사용할 수 있습니다.

터미널을 열고 다음 명령을 실행합니다.

git config core.sshCommand "ssh -o IdentitiesOnly=yes -i ~/.ssh/private-key-filename-for-this-repository -F /dev/null"

이 명령은 SSH 에이전트를 사용하지 않으며 Git 2.10 이상이 필요합니다. ssh 명령 옵션에 대한 자세한 정보는 sshssh_configman 페이지를 참조하세요.

계정의 SSH 키 보기

계정의 SSH 키를 보려면:

  1. 좌측 사이드바에서 아바타를 선택합니다.
  2. 프로필 편집을 선택합니다.
  3. 좌측 사이드바에서 SSH 키를 선택합니다.

기존의 SSH 키는 페이지 하단에 나열됩니다. 정보에는 다음이 포함됩니다:

  • 키의:
    • 이름.
    • 공개 지문.
    • 만료 날짜.
    • 허용된 사용 유형.
  • 키를 마지막으로 사용한 시간.

SSH 키 삭제

SSH 키를 영구적으로 삭제하려면:

  1. 좌측 사이드바에서 아바타를 선택합니다.
  2. 프로필 편집을 선택합니다.
  3. 좌측 사이드바에서 SSH 키를 선택합니다.
  4. 삭제할 키 옆에서 제거를 선택합니다 ().
  5. 삭제를 선택합니다.

단일 GitLab 인스턴스에서 다른 계정 사용

하나의 GitLab 인스턴스에 여러 계정을 사용할 수 있습니다. 이를 위해 이전 주제의 명령을 사용할 수 있습니다. 그러나 IdentitiesOnlyyes로 설정하더라도 IdentityFileHost 블록 외부에 존재하는 경우 로그인할 수 없습니다.

반대로, ~/.ssh/config 파일에 호스트에 별칭을 할당할 수 있습니다.

  • Host에는 user_1.gitlab.comuser_2.gitlab.com과 같은 별칭을 사용합니다. 고급 구성은 유지 관리가 더 어려우며, 이러한 문자열을 사용하면 git remote와 같은 도구를 사용할 때 이해하기 쉽습니다.
  • IdentityFile에는 개인 키의 경로를 사용합니다.
# User1 Account Identity
Host <user_1.gitlab.com>
  Hostname gitlab.com
  PreferredAuthentications publickey
  IdentityFile ~/.ssh/<example_ssh_key1>

# User2 Account Identity
Host <user_2.gitlab.com>
  Hostname gitlab.com
  PreferredAuthentications publickey
  IdentityFile ~/.ssh/<example_ssh_key2>

이제 user_1을 위해 저장소를 복제하려면 git clone 명령에서 user_1.gitlab.com을 사용하세요:

git clone git@<user_1.gitlab.com>:gitlab-org/gitlab.git

이전에 별칭을 origin으로 지정한 이전에 복제한 저장소를 업데이트하려면:

git remote set-url origin git@<user_1.gitlab.com>:gitlab-org/gitlab.git

참고: 개인 및 공개 키는 민감한 데이터를 포함합니다. 파일의 권한을 확인하여 다른 사람에게는 접근할 수 없지만 본인에게는 읽을 수 있는 권한이 있는지 확인하세요.

두 요인 인증(2FA) 구성

SSH를 통한 Git에 대한 두 요인 인증(2FA)을 설정할 수 있습니다. ED25519_SK 또는 ECDSA_SK SSH 키를 사용하는 것을 권장합니다.

Eclipse에서 EGit 사용

EGit을 사용하는 경우, Eclipse에 SSH 키를 추가할 수 있습니다.

Microsoft Windows에서 SSH 사용

Windows 10을 실행 중이라면 Windows Subsystem for Linux (WSL)과 함께 WSL 2를 사용하거나 gitssh가 미리 설치된 Git for Windows를 설치하여 PowerShell을 통해 SSH를 사용할 수 있습니다.

WSL에서 생성된 SSH 키는 Git for Windows에서 직접 사용할 수 없으며 그 반대의 경우도 마찬가지이며 두 경우 모두 다른 홈 디렉토리를 가지고 있습니다:

  • WSL: /home/<user>
  • Git for Windows: C:\Users\<user>

동일한 키를 사용하려면 .ssh/ 디렉터리를 복사하거나 각 환경에서 키를 생성할 수 있습니다.

Windows 11을 실행 중이고 Windows용 OpenSSH를 사용하는 경우 HOME 환경 변수가 올바르게 설정되어 있는지 확인하십시오. 그렇지 않으면 개인 SSH 키를 찾을 수 없을 수 있습니다.

대체 도구로는 다음이 있습니다:

GitLab 서버에서 SSH 설정 재정의

GitLab은 시스템에 설치된 SSH 데몬과 통합되어 모든 액세스 요청이 처리되는 사용자(일반적으로 git로 명명됨)를 지정합니다. SSH를 통해 GitLab 서버에 연결하는 사용자는 자신의 사용자 이름 대신 SSH 키로 식별됩니다.

GitLab 서버에서 수행되는 SSH client 작업은 이 사용자로 실행됩니다. 이 SSH 구성을 수정할 수 있습니다. 예를 들어 이 사용자를 인증 요청에 사용할 개인 SSH 키를 지정할 수 있습니다. 그러나 이러한 실천은 지원되지 않으며 중대한 보안 리스크를 초래하므로 강력히 권장되지 않습니다.

GitLab는 이 조건을 확인하고 서버가 이렇게 구성되어 있는 경우에는 이 섹션으로 이동하도록 안내합니다. 예를 들어:

$ gitlab-rake gitlab:check

Git user has default SSH configuration? ... no
  Try fixing it:
  mkdir ~/gitlab-check-backup-1504540051
  sudo mv /var/lib/git/.ssh/id_rsa ~/gitlab-check-backup-1504540051
  sudo mv /var/lib/git/.ssh/id_rsa.pub ~/gitlab-check-backup-1504540051
  For more information see:
  doc/user/ssh.md#overriding-ssh-settings-on-the-gitlab-server
  Please fix the error above and rerun the checks.

빠른 시일 내에 사용자 정의 구성을 제거하십시오. 이러한 사용자 정의는 명시적으로 지원되지 않으며 언제든지 작동을 중지할 수 있습니다.

문제 해결

TLS: 서버가 8192 비트보다 큰 RSA 키를 포함한 인증서를 전송했습니다.

GitLab 16.3 이상에서 Go는 RSA 키를 최대 8192 비트로 제한합니다. 키의 길이를 확인하려면:

openssl rsa -in <your-key-file> -text -noout | grep "Key:"

8192 비트보다 긴 키를 더 짧은 키로 대체하십시오.

git clone으로 비밀번호 프롬프트

git clone을 실행하면 git@gitlab.example.com's password:와 같이 비밀번호를 입력하라는 프롬프트가 표시될 수 있습니다. 이는 SSH 설정에 문제가 있음을 나타냅니다.

  • SSH 키 쌍을 올바르게 생성했는지 확인하고 공개 SSH 키를 GitLab 프로필에 추가했는지 확인하십시오.
  • ssh-agent를 사용하여 수동으로 개인 SSH 키를 등록해 보십시오.
  • ssh -Tv git@example.com를 실행하여 연결을 디버깅해 보십시오. example.com을 사용자의 GitLab URL로 대체하십시오.
  • Microsoft Windows에서 SSH 사용의 모든 지침을 따랐는지 확인하십시오.

호스트 이름을 확인할 수 없음 오류

연결을 확인하는 동안 다음 오류를 받을 수 있습니다:

ssh: Could not resolve hostname gitlab.example.com: nodename nor servname provided, or not known

이 오류가 발생하면 터미널을 다시 시작하고 명령을 다시 시도하십시오.

키 등록 실패: 잘못된 형식 오류

FIDO2 하드웨어 보안 키용 SSH 키 쌍을 생성하는 동안 다음 오류를 받을 수 있습니다:

키 등록 실패: 잘못된 형식

다음을 시도하여 이 문제를 해결할 수 있습니다:

  • sudo를 사용하여 ssh-keygen 명령을 실행합니다.
  • FIDO2 하드웨어 보안 키가 제공된 키 유형을 지원하는지 확인합니다.
  • ssh -V를 실행하여 OpenSSH의 버전이 8.2 이상인지 확인합니다.