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 키

Go로 구현하는 실용적인 암호화ED25519 키가 RSA 키보다 더 안전하고 성능이 뛰어나다고 제안합니다.

2014년 OpenSSH 6.5에서 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)의 800-57 제 3부 (PDF)에서는 최소 2048 비트의 키 크기를 권장합니다. Go의 제한으로 인해 RSA 키는 8192 비트를 초과할 수 없습니다.

기본 키 크기는 설치된 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를 누릅니다. 다음과 유사한 출력이 표시됩니다:

    공개/개인 키 쌍을 생성하고 있습니다.
    키를 저장할 파일 이름을 입력하십시오 (/home/user/.ssh/id_ed25519):
    
  4. 제안된 파일 이름과 디렉토리를 수락합니다. 배포 키를 생성하거나 다른 키를 저장하는 특정 디렉토리를 원할 경우에만 다르게 지정합니다.

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

  5. 암호를 지정합니다:

    암호를 입력하십시오 (암호가 없으면 엔터):
    암호를 다시 한 번 입력하십시오:
    

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

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

SSH를 다른 디렉토리로 지정 설정

SSH 키페어를 기본 디렉토리에 저장하지 않은 경우, SSH 클라이언트를 개인 키가 저장된 디렉토리로 지정하세요.

  1. 터미널을 열고 다음 명령을 실행하세요.

    eval $(ssh-agent -s)
    ssh-add <directory to private SSH key>
    
  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 페이지를 참조하십시오.

공개 SSH 키는 계정에 바인딩되어 있기 때문에 GitLab에 고유해야 합니다. 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. 터미널을 열고 다음과 같이 ssh-keygen -t 다음에 키 유형을 입력하고 선택적 주석을 추가하여 명령을 실행하세요. 이 주석은 작성된 .pub 파일에 포함됩니다. 이메일 주소를 주석으로 사용하는 것이 좋습니다.

    예를 들어, ED25519_SK의 경우:

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

    ECDSA_SK의 경우:

    ssh-keygen -t ecdsa-sk -C "<comment>"
    

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

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

    -O resident는 키가 FIDO 인증기 자체에 저장되어야 함을 나타냅니다. 예비 키는 새 컴퓨터에 쉽게 가져올 수 있으므로 보안 키에서 직접로드될 수 있는 ssh-add -K 또는 ssh-keygen -K를 사용할 수 있습니다.

  3. Enter 키를 누르세요. 다음과 유사한 출력이 표시됩니다.

    공개/개인 ed25519-sk 키페어 생성.
    권한을 부여하기 위해 귀하의 인증기를 터치해야 할 수도 있습니다.
    
  4. 하드웨어 보안 키의 버튼을 누르세요.

  5. 제안된 파일 이름과 디렉토리를 허용하세요:

    키를 저장할 파일 입력 (/home/user/.ssh/id_ed25519_sk):
    
  6. 패스프레이즈를 지정하세요:

    패스프레이즈 입력 (비밀번호가 없으면 빈칸으로 두세요):
    동일한 패스프레이즈를 다시 입력하세요:
    

    파일이 어디에 저장되었는지에 대한 정보를 포함한 확인이 표시됩니다.

공개 및 개인 키가 생성됩니다. 공개 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. 선택 사항. 키의 사용 유형을 선택합니다. 인증 또는 서명 또는 둘 다에 사용할 수 있습니다. 인증 및 서명이 기본값입니다.
  11. 선택 사항. 기본 만료 날짜를 수정하려면 만료 날짜를 업데이트하세요.
  12. 키 추가를 선택하세요.

SSH 키를 1Password와 사용하는 방법에 대한 자세한 내용은 1Password 문서를 참조하세요.

SSH 키를 GitLab 계정에 추가

  • GitLab 15.4에서 도입된 키의 권장 기본 만료 날짜.
  • SSH 키의 사용 유형은 GitLab 15.7에서 추가되었습니다.

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의 경우에는 id_rsa.pub를 사용하세요.

  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. 선택 사항. 키의 사용 유형을 선택합니다. 인증 또는 서명 또는 둘 다에 사용할 수 있습니다. 인증 및 서명이 기본값입니다.
  10. 선택 사항. 기본 만료 날짜를 수정하려면 만료 날짜를 업데이트하세요.
    • 관리자는 만료 날짜를 볼 수 있으며 키를 삭제할 때 지침으로 사용할 수 있습니다.
    • GitLab은 매일 01:00 AM UTC에 모든 SSH 키를 확인합니다. 이메일로 예정된 만료 알림을 기준으로 7일 후에 만료되는 모든 SSH 키에 대해 보냅니다.
    • GitLab은 매일 02:00 AM UTC에 모든 SSH 키를 확인합니다. 현재 날짜에 만료되는 모든 SSH 키에 대해 만료 알림 이메일을 보냅니다.
  11. 키 추가를 선택하세요.

연결 여부 확인

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

다음 명령은 예시 호스트명 gitlab.example.com을 사용합니다. 본인의 GitLab 인스턴스 호스트명으로 변경하세요. 예를 들어, git@gitlab.com입니다. 기본적으로 GitLab은 git 사용자 이름을 사용하여 인증합니다. 관리자에 의해 변경된 경우 다를 수 있습니다.

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

    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

참고: 개인 및 공개 키에는 민감한 데이터가 포함되어 있습니다. 파일의 권한은 다른 사람에게 접근할 수 없지만 본인에게는 읽을 수 있도록 해야 합니다.

이중 인증(SSO) 구성

Git over SSH에 대해 이중 인증(SSO)을 설정할 수 있습니다. ED25519_SK 또는 ECDSA_SK SSH 키를 사용해야 합니다.

Eclipse에서 EGit 사용

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

Microsoft Windows에서 SSH 사용

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

WSL에서 생성된 SSH 키는 Git for Windows에서 직접 사용할 수 없으며, 그 반대도 마찬가지입니다. 각각 다른 홈 디렉토리를 갖고 있기 때문입니다:

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

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

Windows 11에서 OpenSSH for Windows를 사용하는 경우 HOME 환경 변수가 올바르게 설정되어 있는지 확인하세요. 그렇지 않으면 개인 SSH 키를 찾을 수 없습니다.

대체로 사용할 수 있는 도구로는:

GitLab 서버에서 SSH 설정 재정의

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

GitLab 서버에서 수행되는 SSH 클라이언트 작업은 이 사용자로 실행됩니다. 이 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.

가능한 빨리 사용자 정의 구성을 제거하세요. 이러한 사용자 정의는 명시적으로 지원되지 않으며, 언제든지 작동을 중지할 수 있습니다.

GitLab SSH 소유권 및 권한 확인

GitLab SSH 폴더와 파일에는 다음 권한이 있어야 합니다:

  • /var/opt/gitlab/.ssh/ 폴더는 git 그룹과 git 사용자가 소유하며 권한이 700으로 설정되어 있어야 합니다.
  • authorized_keys 파일의 권한이 600으로 설정되어 있어야 합니다.
  • authorized_keys.lock 파일의 권한이 644로 설정되어 있어야 합니다.

이러한 권한이 올바른지 확인하려면 다음을 실행하세요:

stat -c "%a %n" /var/opt/gitlab/.ssh/.

권한 설정

권한이 잘못된 경우, 애플리케이션 서버에 로그인하여 다음을 실행하세요:

cd /var/opt/gitlab/
chown git:git /var/opt/gitlab/.ssh/
chmod 700  /var/opt/gitlab/.ssh/
chmod 600  /var/opt/gitlab/.ssh/authorized_keys
chmod 644  /var/opt/gitlab/.ssh/authorized_keys.lock