SSH 키 인증 사용

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

macOS, Linux 또는 Windows에서 SSH를 통해 Git 저장소에 연결하여 HTTPS 인증을 사용하여 안전하게 연결할 수 있습니다.

Important

SSH URL이 변경되었지만 이전 SSH URL은 계속 작동합니다. SSH를 이미 설정한 경우 원격 URL 새 형식으로 업데이트합니다.

최신 SSH URL은 .로 ssh.dev.azure.com시작합니다. 이전 URL은 .를 사용합니다 vs-ssh.visualstudio.com.

  • SSH를 사용하는 원격을 확인합니다. 셸에서 실행 git remote -v 하거나 대신 GUI 클라이언트를 사용합니다.
  • 웹의 리포지토리를 방문하여 복제를 선택합니다.
  • SSH를 선택하고 새 SSH URL을 복사합니다.
  • 셸에서 업데이트하려는 리포지토리의 각 원격에 대해 실행됩니다 git remote set-url <remote name> <new SSH URL> . 또는 GUI 클라이언트를 사용하여 원격 URL 업데이트합니다.

SSH 키 인증 작동 방식

SSH 공개 키 인증은 생성된 암호화 키의 비대칭 쌍에서 작동합니다. 공개 키는 Azure DevOps와 공유되며 초기 ssh 연결을 확인하는 데 사용됩니다. 프라이빗 키는 시스템에서 안전하고 안전하게 유지됩니다.

SSH 키 인증 설정

다음 단계에서는 명령줄(라고도 함 shell)을 사용하여 다음 플랫폼에서 SSH 키 인증의 구성을 다룹니다.

참고 항목

Visual Studio 2017을 기준으로 SSH를 사용하여 Azure DevOps Git 리포지토리에 연결할 수 있습니다.

Windows에서는 Git 자격 증명 관리자 또는 개인용 액세스 토큰을 사용하는 것이 좋습니다.

1단계: SSH 키 만들기

참고 항목

시스템에서 RSA SSH 키를 이미 만든 경우 이 단계를 건너뛰고 SSH 키를 구성합니다. 이를 확인하려면 홈 디렉터리로 이동하여 폴더(%UserProfile%\.ssh\Windows 또는 ~/.ssh/ Linux, macOS 및 Git Bash가 있는 Windows)를 살펴봅 .ssh 니다. 이름이 지정 id_rsa 되고 id_rsa.pub 각각 SSH 키 구성을 계속하는 두 개의 파일이 표시되는 경우

키 기반 인증을 사용하려면 먼저 클라이언트에 대해 공개/프라이빗 키 쌍을 생성해야 합니다. ssh-keygen.exe 키 파일을 생성하는 데 사용되며 DSA, RSA, ECDSA 또는 Ed25519 알고리즘을 지정할 수 있습니다. 알고리즘을 지정하지 않으면 RSA가 사용됩니다.

참고 항목

Azure DevOps에서 지원하는 유일한 SSH 키 유형은 RSA입니다.

RSA 알고리즘을 사용하여 키 파일을 생성하려면 PowerShell 또는 클라이언트와 같은 bash 다른 셸에서 다음 명령을 실행합니다.

ssh-keygen

명령의 출력은 다음 출력을 표시해야 합니다(여기서 username 사용자 이름으로 대체됨).

Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\username/.ssh/id_rsa):

Enter 키를 눌러 기본값을 적용하거나 키를 생성할 경로 및/또는 파일 이름을 지정할 수 있습니다. 그러면 프라이빗 키 파일 암호화를 위해 암호를 사용하라는 메시지가 표시됩니다. 암호는 비어 있을 수 있지만 권장되지는 않습니다. 암호는 키 파일과 함께 사용되어 2단계 인증을 제공합니다.

Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\username/.ssh/id_rsa.
Your public key has been saved in C:\Users\username/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:FHK6WjcUkcfQjdorarzlak1Ob/x7AmqQmmx5ryYYV+8 username@LOCAL-HOSTNAME
The key's randomart image is:
+---[RSA 3072]----+
|      . ** o     |
|       +.o= .    |
|      . o+       |
|      .+. .      |
|     .ooS  .     |
|  . .oo.=.o      |
|   =.= O.= .     |
|  . B BoE + . .  |
|   . *+*o. .o+   |
+----[SHA256]-----+

이제 지정된 위치에 public/private rsa 키 쌍이 있습니다. .pub 파일은 공개 키이며 확장명 없는 파일은 프라이빗 키입니다.

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        10/11/2022   6:29 PM           2610 id_rsa
-a----        10/11/2022   6:29 PM            578 id_rsa.pub

Important

프라이빗 키의 콘텐츠를 공유하지 마세요. 프라이빗 키가 손상된 경우 공격자는 이를 사용하여 서버가 연결이 사용자로부터 오고 있다고 생각하도록 속일 수 있습니다. 프라이빗 키 파일은 암호와 동일하며 동일한 방식으로 보호되어야 합니다.

2단계: Azure DevOps에 공개 키 추가

이전 단계에서 생성된 공개 키를 사용자 ID와 연결합니다.

참고 항목

액세스 권한이 있고 SSH를 사용하려는 각 조직에 대해 이 작업을 반복해야 합니다.

  1. 웹 포털로 이동하고 사용자 인터페이스의 오른쪽 위에 있는 아바타 옆에 있는 아이콘을 선택하여 보안 설정을 엽니다. 표시되는 메뉴에서 SSH 공개 키를 선택합니다.

    Azure DevOps에서 선택한 SSH 공개 키 메뉴 항목 및 사용자 아바타를 보여 주는 스크린샷

  2. + 새 키를 선택합니다.

    Azure DevOps의 보안 구성에 대한 액세스를 보여 주는 스크린샷

  3. 공개 키 데이터 필드에 생성한 공개 키의 내용(예id_rsa.pub: )을 복사합니다.

    Important

    Azure DevOps에서 잘못된 공개 키를 사용할 수 있으므로 키 데이터 필드에 공백 또는 새 줄을 추가하지 마십시오. 키를 붙여넣을 때 줄 바꿈이 끝에 추가되는 경우가 많습니다. 이 줄이 발생하면 반드시 제거해야 합니다.

    Azure DevOps에서 공개 키 구성을 보여 주는 스크린샷

  4. 나중에 기억할 수 있도록 키에 유용한 설명을 제공합니다(이 설명은 프로필의 SSH 공개 키 페이지에 표시됨). 저장을 선택하여 공개 키를 저장합니다. 저장한 후에는 키를 변경할 수 없습니다. 키를 삭제하거나 다른 키에 대한 새 항목을 만들 수 있습니다. 사용자 프로필에 추가할 수 있는 키 수에는 제한이 없습니다. 또한 Azure DevOps에 저장된 SSH 키는 1년 후에 만료됩니다. 키가 만료되면 새 키 또는 동일한 키를 업로드하여 SSH를 통해 Azure DevOps에 계속 액세스할 수 있습니다.

  5. 개요 페이지에는 서버 지문이 포함된 메모가 맨 위에 표시됩니다. SSH를 통해 Azure DevOps에 처음 연결할 때 필요하므로 기록해 둡니다.

    Azure DevOps Services에서 보안 구성에 액세스하는 스크린샷

  6. 다음 명령을 실행하여 연결을 테스트합니다.

    ssh -T git@ssh.dev.azure.com
    

    처음 연결하는 경우 다음 출력이 표시됩니다.

    The authenticity of host 'ssh.dev.azure.com (<IP>)' can't be established.
    RSA key fingerprint is SHA256:ohD8VZEXGWo6Ez8GSEJQ9WpafgLFsOfLOtGGQCQo6Og.
    This key is not known by any other names
    Are you sure you want to continue connecting (yes/no/[fingerprint])?
    

    지정된 지문을 afore멘션 설정 페이지에서 제공되는 지문과 비교합니다. 일치하는 경우에만 계속 진행하세요!

    모든 항목이 올바르게 구성된 경우 출력은 다음과 같습니다.

    remote: Shell access is not supported.
    

    그렇지 않은 경우 질문 및 문제 해결에 대한 섹션을 참조하세요.

3단계: SSH를 사용하여 Git 리포지토리 복제

참고 항목

이전에 HTTPS를 통해 복제된 리포지토리에서 SSH를 사용하려면 원격을 SSH로 업데이트하는 방법을 참조하세요.

  1. 웹 포털에서 SSH 복제 URL을 복사합니다. 이 예제에서 SSH 복제 URL은 다음 URLdev.azure.com의 첫 번째 부분에 표시된 것처럼 fabrikam-fiber라는 조직의 리포지토리에 대한 것입니다.

    Azure Repos SSH 복제 URL을 보여 주는 스크린샷

    참고 항목

    Azure DevOps Services를 사용하면 프로젝트 URL의 형식이 dev.azure.com/{your organization}/{your project}됩니다. 그러나 형식을 참조 visualstudio.com 하는 이전 형식은 여전히 지원됩니다. 자세한 내용은 새 do기본 이름 URL을 사용하도록 기존 조직 전환, Azure DevOps 소개를 참조하세요.

  2. 명령 프롬프트에서 실행 git clone 합니다.

    git clone git@ssh.dev.azure.com:v3/fabrikam-fiber/FabrikamFiber/FabrikamFiber
    

    이제 SSH 에이전트에서 관리되지 않는 한 계속하기 전에 SSH 키에 대한 암호를 입력하라는 메시지가 표시됩니다.

    Cloning into 'FabrikamFiber'...
    Enter passphrase for key '/c/Users/username/.ssh/id_rsa':
    remote: Azure Repos
    remote: Found 127 objects to send. (50 ms)
    Receiving objects: 100% (127/127), 56.67 KiB | 2.58 MiB/s, done.
    Resolving deltas: 100% (15/15), done.
    

    대신 지문을 확인하라는 메시지가 표시되면 2단계: Azure DevOps에 공개 키 추가를 다시 읽어보세요. 다른 문제는 질문 및 문제 해결 섹션을 참조하세요.

SSH를 최대한 활용하려면 SSH 에이전트를 사용하여 SSH 키를 관리하는 것이 일반적입니다. 하지만 에이전트 설정은 이 문서의 범위를 벗어납니다.

질문 및 문제 해결

A: 다음과 같은 두 가지 경고 메시지가 표시 될 수 있습니다.

ssh-rsa is about to be deprecated and your request has been throttled. Please use rsa-sha2-256 or rsa-sha2-512 instead. Your session will continue automatically. For more details see https://devblogs.microsoft.com/devops/ssh-rsa-deprecation.

또는

You’re using ssh-rsa that is about to be deprecated and your request has been blocked intentionally. Any SSH session using SSH-RSA is subject to brown out (failure during random time periods). Please use rsa-sha2-256 or rsa-sha2-512 instead. For more details see https://devblogs.microsoft.com/devops/ssh-rsa-deprecation.

이전에 Windows의 파일에 다음을 추가하여 Azure DevOps에 대한 보안 설정을 다운그레이드하도록 SSH 구성을 수정했을 수 있습니다~/.ssh/config%UserProfile%\.ssh\config.

Host ssh.dev.azure.com vs-ssh.visualstudio.com
  HostkeyAlgorithms +ssh-rsa

지금 이 줄을 제거하고 허용되는지 확인 rsa-sha2-256rsa-sha2-512 하세요.

자세한 내용은 블로그 게시물을 참조하세요.

Q: SSH에서 연결을 설정할 수 없습니다. 어떻게 해야 합니까?

A: 다음과 같은 여러 가지 문제가 발생할 수 있습니다.

  • 지원되지 않는 SSH-RSA 사용

    You’re using ssh-rsa that is unsupported. Please use rsa-sha2-256 or rsa-sha2-512 instead. For more details see https://devblogs.microsoft.com/devops/ssh-rsa-deprecation.
    

    이전에 Windows의 파일에 다음을 추가하여 Azure DevOps에 대한 보안 설정을 다운그레이드하도록 SSH 구성을 수정했을 수 있습니다~/.ssh/config%UserProfile%\.ssh\config.

    Host ssh.dev.azure.com vs-ssh.visualstudio.com
       HostkeyAlgorithms +ssh-rsa
    

    지금 이 줄을 제거하고 허용되는지 확인 rsa-sha2-256rsa-sha2-512 하세요.

    자세한 내용은 블로그 게시물을 참조하세요.

  • 일치하는 호스트 키 없음

    이는 블로그 게시물에 멘션 Azure DevOps Service 또는 최신 Azure DevOps Server 버전에서 발생하지 않습니다.

    Unable to negotiate with <IP> port 22: no matching host key type found. Their offer: ssh-rsa
    

    (Windows) 파일에 다음을 추가하여 Azure DevOps에 대한 보안 설정을 다운그레이드하도록 SSH 구성을 ~/.ssh/config%UserProfile%\.ssh\config 수정합니다.

    Host ssh.dev.azure.com vs-ssh.visualstudio.com
       HostkeyAlgorithms +ssh-rsa
    

    Important

    OpenSSH는 ssh-rsa 버전 8.2에서 공개 키 서명 알고리즘을 더 이상 사용하지 않으며 버전 8.8에서 기본적으로 사용하지 않도록 설정했습니다.

  • 일치하는 MAC 없음

    Unable to negotiate with <IP> port 22: no matching MAC found. Their offer: hmac-sha2-256,hmac-sha2-512
    

    (Windows) 파일에 다음을 추가하여 Azure DevOps에 대한 보안 설정을 다운그레이드하도록 SSH 구성을 ~/.ssh/config%UserProfile%\.ssh\config 수정합니다.

    Host ssh.dev.azure.com vs-ssh.visualstudio.com
       MACs +hmac-sha2-512,+hmac-sha2-256
    
  • 일치하는 키 교환 방법 없음

    Unable to negotiate with <IP> 22: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha256
    

    (Windows) 파일에 다음을 추가하여 Azure DevOps에 대한 보안 설정을 다운그레이드하도록 SSH 구성을 ~/.ssh/config%UserProfile%\.ssh\config 수정합니다.

    Host ssh.dev.azure.com vs-ssh.visualstudio.com
       KexAlgorithms +diffie-hellman-group-exchange-sha256,+diffie-hellman-group14-sha1,+diffie-hellman-group1-sha1
    

    Important

    키 교환 알고리즘 diffie-hellman-group1-sha1 은 OpenSSH 버전 6.9diffie-hellman-group14-sha1 버전 8.2에서 기본적으로 사용하지 않도록 설정되었습니다.

Azure DevOps Server 및 TFS의 자체 호스팅 인스턴스의 경우 줄에서 ssh.dev.azure.com vs-ssh.visualstudio.com적절한 호스트 이름을 Host 대신 사용합니다.

Q: Git에서 키의 암호를 기억하려면 어떻게 해야 하나요?

A: SSH 에이전트를 사용할 수 있습니다. Linux, macOS 및 Windows( Windows 10(빌드 1809부터) 또는 Git Bash가 있는 Windows용 Git 사용)은 모두 SSH 에이전트와 함께 제공됩니다. SSH 에이전트를 사용하여 SSH 키를 캐시하여 반복적으로 사용할 수 있습니다. 사용 방법에 대한 자세한 내용은 SSH 공급업체 설명서를 참조하세요.

Q: PuTTY를 SSH 클라이언트로 사용하고 PuTTYgen을 사용하여 키를 생성했습니다. Azure DevOps Services에서 이러한 키를 사용할 수 있나요?

A: 예. PuTTYgen을 사용하여 프라이빗 키를 로드하고 변환 메뉴로 이동하여 OpenSSH 키 내보내기를 선택합니다. 프라이빗 키 파일을 저장한 다음 단계에 따라 기본 키가 아닌 키를 설정합니다. PuTTYgen 창에서 직접 공개 키를 복사하고 보안 설정의 키 데이터 필드에 붙여넣습니다.

Q: 업로드한 공개 키가 내 로컬 키와 동일한 키인지 확인하려면 어떻게 해야 하나요?

A: 명령줄을 사용하여 공개 키에 대해 다음 ssh-keygen 명령을 실행하여 프로필에 표시된 공개 키와 함께 업로드된 공개 키의 지문을 확인할 수 있습니다. 기본값을 사용하지 않는 경우 경로 및 공개 키 파일 이름을 변경해야 합니다.

ssh-keygen -l -E md5 -f ~/.ssh/id_rsa.pub

그런 다음 MD5 서명을 프로필의 서명과 비교할 수 있습니다. 이 검사 연결 문제가 있거나 Azure DevOps에 키를 추가할 때 공개 키를 키 데이터 필드에 잘못 붙여넣을 때 문제가 있는 경우에 유용합니다.

Q: 현재 HTTPS를 사용하는 리포지토리에서 SSH를 사용하려면 어떻게 해야 하나요?

A: HTTPS에서 SSH URL로 변경하려면 Git에서 원격을 업데이트 origin 해야 합니다. SSH 복제 URL있으면 다음 명령을 실행합니다.

git remote set-url origin <SSH URL to your repository>

호출 origin 된 원격에 액세스하는 Git 명령은 이제 SSH를 사용합니다.

Q: Azure DevOps Services와 함께 Git LFS를 사용하고 있는데 Git LFS에서 추적하는 파일을 가져올 때 오류가 발생합니다.

A: Azure DevOps Services는 현재 SSH를 통해 LFS를 지원하지 않습니다. HTTPS를 사용하여 Git LFS 추적 파일이 있는 저장소에 연결합니다.

Q: 기본이 아닌 키 위치( ~/.ssh/id_rsa 및 ~/.ssh/id_rsa.pub 아님)를 어떻게 사용할 수 있나요?

A: 기본값과 다른 위치에 저장된 키를 사용하려면 다음 두 작업을 수행합니다.

  1. 키는 사용자만 읽거나 편집할 수 있는 폴더에 있어야 합니다. 폴더에 더 넓은 권한이 있는 경우 SSH는 키를 사용하지 않습니다.

  2. SSH 구성에서 "ID"로 지정하여 키의 위치를 SSH에 알려야 합니다.

    Host ssh.dev.azure.com
      IdentityFile ~/.ssh/id_rsa_azure
      IdentitiesOnly yes
    

이 설정은 IdentitiesOnly yes SSH가 다른 사용 가능한 ID를 사용하여 인증하지 않도록 합니다. 이는 둘 이상의 ID를 사용할 수 있는 경우에 특히 중요합니다.

Q: SSH 키가 여러 대 있습니다. Azure DevOps에 올바른 SSH 키를 사용할 어떻게 할까요? 있나요?

A: 일반적으로 SSH 클라이언트에 대해 여러 키를 구성하고 SSH 서버에 연결하는 경우 클라이언트는 서버가 키를 수락할 때까지 키를 한 번에 하나씩 시도할 수 있습니다.

그러나 SSH 프로토콜과 관련된 기술적 이유 및 Git SSH URL의 구조화 방법은 Azure DevOps에서 작동하지 않습니다. Azure DevOps는 인증 중에 클라이언트가 제공하는 첫 번째 키를 맹목적으로 수락합니다. 요청된 리포지토리에 해당 키가 유효하지 않으면 다음 오류로 인해 사용 가능한 다른 키를 시도하지 않고 요청이 실패합니다.

remote: Public key authentication failed.
fatal: Could not read from remote repository.

Azure DevOps의 경우 특정 키 파일을 명시적으로 사용하도록 SSH를 구성해야 합니다. 프로시저는 기본이 아닌 위치에 저장된 키를 사용하는 경우와 동일합니다. Azure DevOps 호스트에 올바른 SSH 키를 사용하도록 SSH에 지시하기만 하면 됩니다.

Q: Azure DevOps에서 여러 조직에 대해 다른 SSH 키를 사용할 어떻게 할까요? 있나요?

A: Azure DevOps는 인증 중에 클라이언트가 제공하는 첫 번째 키를 맹목적으로 수락합니다. 요청된 리포지토리에 대해 해당 키가 유효하지 않으면 다음 오류와 함께 요청이 실패합니다.

remote: Public key authentication failed.
fatal: Could not read from remote repository.

그러나 SSH 구성을 수정하여 서로 다른 조직을 구분하고 각각에 대해 서로 다른 키를 제공할 수 있습니다. 이렇게 하려면 호스트 별칭을 사용하여 SSH 구성에서 별도의 Host 섹션을 만들어야 합니다. 이는 호스트된 모든 Azure DevOps URL이 동일한 호스트 이름(ssh.dev.azure.com)을 가지므로 SSH는 기본적으로 이를 구분할 방법이 없기 때문입니다.

# The settings in each Host section are applied to any Git SSH remote URL with a
# matching hostname.
# Generally:
# * SSH uses the first matching line for each parameter name, e.g. if there's
#   multiple values for a parameter across multiple matching Host sections
# * "IdentitiesOnly yes" prevents keys cached in ssh-agent from being tried before
#   the IdentityFile values we explicitly set.
# * On Windows, ~/.ssh/your_private_key maps to %USERPROFILE%\.ssh\your_private_key,
#   e.g. C:\Users\<username>\.ssh\your_private_key.

# Imagine that we have the following two SSH URLs:
# * git@ssh.dev.azure.com:v3/Fabrikam/Project1/fab_repo
#   * For this, we want to use `fabrikamkey`, so we'll create `devops_fabrikam` as
#     a Host alias and tell SSH to use `fabrikamkey`.
# * git@ssh.dev.azure.com:v3/Contoso/Project2/con_repo
#   * For this, we want to use `contosokey`, so we'll create `devops_contoso` as
#     a Host alias and tell SSH to use `contosokey`.
#
# To set explicit keys for the two host aliases and to tell SSH to use the correct
# actual hostname, add the next two Host sections:
Host devops_fabrikam
  HostName ssh.dev.azure.com
  IdentityFile ~/.ssh/private_key_for_fabrikam
  IdentitiesOnly yes

Host devops_contoso
  HostName ssh.dev.azure.com
  IdentityFile ~/.ssh/private_key_for_contoso
  IdentitiesOnly yes

그런 다음 실제 URL을 사용하는 대신 기존 원격의 호스트 이름을 각각과 함께 대체하여 각 리포지토리에 대해 이러한 URL을 원격으로 사용하려는 경우 Git에 알릴 수 있습니다 devops_fabrikamdevops_contoso . 예를 들어 git@ssh.dev.azure.com:v3/Fabrikam/Project1/fab_repo .git@devops_fabrikam:v3/Fabrikam/Project1/fab_repo

Q: 내 SSH 키에 대해 어떤 알림을 받을 수 있나요?

A: Azure DevOps Services에 새 SSH 키를 등록할 때마다 새 SSH 키가 계정에 추가되었음을 알리는 이메일 알림을 받게 됩니다.

SSH 알림 예제

Q: 내 계정에서 다른 사람이 SSH 키를 추가한다고 생각되면 어떻게 해야 하나요?

A: 등록 중인 SSH 키에 대한 알림을 받고 서비스에 수동으로 업로드하지 않은 경우 자격 증명이 손상되었을 수 있습니다.

다음 단계는 암호가 손상되었는지 여부를 조사하는 것입니다. 암호 변경은 항상 이 공격 벡터를 방어하는 좋은 첫 번째 단계입니다. Microsoft Entra 사용자인 경우 관리자에게 문의하여 알 수 없는 원본/위치에서 계정이 사용되었는지 검사.

Q: 암호를 GIT_SSH_COMMAND="ssh -v" git fetchno mutual signature algorithmcorresponding algo not in PubkeyAcceptedAlgorithms입력하라는 메시지가 계속 표시되면 어떻게 해야 하나요?

A: Fedora Linux와 같은 일부 Linux 배포판에는 Azure DevOps가 지원하는 것보다 더 강력한 SSH 서명 알고리즘이 필요한 암호화 정책이 있습니다(2021년 1월 현재). 이 지원을 추가하기 위한 열린 기능 요청 이 있습니다.

SSH 구성(~/.ssh/config)에 다음 코드를 추가하여 문제를 해결할 수 있습니다.

Host ssh.dev.azure.com vs-ssh.visualstudio.com
  PubkeyAcceptedKeyTypes +ssh-rsa

Azure DevOps Server 및 TFS의 자체 호스팅 인스턴스의 경우 줄에서 ssh.dev.azure.com vs-ssh.visualstudio.com적절한 호스트 이름을 Host 대신 사용합니다.