Utilizar a autenticação de chaves SSH

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

Você pode se conectar aos seus repositórios Git por meio de SSH no macOS, Linux ou Windows para se conectar com segurança ao Azure DevOps.

Importante

Os URLs SSH foram alterados, mas os URLs SSH antigos continuam a funcionar. Se você já configurou o SSH, atualize suas URLs remotas para o novo formato:

Os URLs SSH atualizados começam com ssh.dev.azure.com. Os URLs anteriores usam vs-ssh.visualstudio.como .

  • Verifique quais controles remotos estão usando SSH. Execute git remote -v em seu shell ou use um cliente GUI.
  • Visite seu repositório na Web e selecione Clone.
  • Selecione SSH e copie o novo URL SSH.
  • Em seu shell, execute git remote set-url <remote name> <new SSH URL> para cada controle remoto de um repositório que você deseja atualizar. Como alternativa, use um cliente GUI para atualizar as URLs remotas.

Como funciona a autenticação de chave SSH

A autenticação de chave pública SSH funciona com um par assimétrico de chaves de criptografia geradas. A chave pública é compartilhada com o Azure DevOps e usada para verificar a conexão ssh inicial. A chave privada é mantida segura e protegida no seu sistema.

Configurar a autenticação de chave SSH

As etapas a seguir abrangem a configuração da autenticação de chave SSH nas seguintes plataformas usando a linha de comando (também chamada shellde ):

Nota

A partir do Visual Studio 2017, o SSH pode ser usado para se conectar aos repositórios Git do Azure DevOps.

Gorjeta

No Windows, recomendamos o uso do Git Credential Manager ou de Personal Access Tokens.

Passo 1: Crie as suas chaves SSH

Nota

Se já criou chaves RSA SSH no seu sistema, ignore este passo e configure as suas chaves SSH. Para verificar isso, vá para o seu diretório inicial e olhe para a .ssh pasta (%UserProfile%\.ssh\ no Windows ou ~/.ssh/ no Linux, macOS e Windows com Git Bash). Se você vir dois arquivos nomeados id_rsa e id_rsa.pub respectivamente, continue com a configuração de suas chaves SSH.

Para usar a autenticação baseada em chave, primeiro você precisa gerar pares de chaves pública/privada para seu cliente. ssh-keygen.exe é usado para gerar arquivos de chave e os algoritmos DSA, RSA, ECDSA ou Ed25519 podem ser especificados. Se nenhum algoritmo for especificado, Ed25519 será usado.

Nota

O único tipo de chave SSH suportado pelo Azure DevOps é RSA.

Para gerar arquivos de chave usando o algoritmo RSA suportado pelo Azure DevOps (RSA-SHA2-256 ou RSA-SHA2-512), execute um dos seguintes comandos de um PowerShell ou outro shell, como bash em seu cliente:

ssh-keygen -t rsa-sha2-256

Ou

ssh-keygen -t rsa-sha2-512

A saída do comando deve exibir a seguinte saída (onde username é o seu nome de usuário):

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

Você pode pressionar Enter para aceitar o padrão ou especificar um caminho e/ou nome de arquivo onde você gostaria que suas chaves fossem geradas. Neste ponto, você será solicitado a usar uma frase secreta para criptografar seus arquivos de chave privada. A frase secreta pode estar vazia, mas não é recomendada. A senha funciona com o arquivo de chave para fornecer autenticação de dois fatores.

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]-----+

Agora você tem um par de chaves RSA público/privado no local especificado. Os arquivos .pub são chaves públicas, e arquivos sem extensão são chaves privadas:

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

Importante

Nunca partilhe o conteúdo da sua chave privada. Se a chave privada estiver comprometida, os atacantes podem usá-la para enganar os servidores e fazê-los pensar que a conexão está vindo de você. Os ficheiros de chave privada são o equivalente a uma palavra-passe e devem ser protegidos da mesma forma.

Etapa 2: Adicionar a chave pública ao Azure DevOps

Associe a chave pública gerada na etapa anterior ao seu ID de usuário.

Nota

Você tem que repetir essa operação para cada organização que você tem acesso e deseja usar SSH com.

  1. Abra suas configurações de segurança navegando até o portal da Web e selecionando o ícone ao lado do avatar no canto superior direito da interface do usuário. Selecione chaves públicas SSH no menu que aparece.

    Captura de tela que mostra o item de menu de chaves públicas SSH e o avatar do usuário selecionado no Azure DevOps.

  2. Selecione + Nova Chave.

    Captura de ecrã a mostrar o acesso à Configuração de Segurança no Azure DevOps.

  3. Copie o conteúdo da chave pública (por exemplo, id_rsa.pub) gerada para o campo Dados de Chave Pública .

    Importante

    Evite adicionar espaço em branco ou novas linhas no campo Dados de Chave, pois eles podem fazer com que o Azure DevOps use uma chave pública inválida. Ao colar na chave, uma nova linha geralmente é adicionada no final. Certifique-se de remover esta nova linha se ela ocorrer.

    Captura de ecrã a mostrar a configuração de uma Chave Pública no Azure DevOps.

  4. Dê à chave uma descrição útil (esta descrição é exibida na página de chaves públicas SSH do seu perfil) para que você possa lembrá-la mais tarde. Selecione Salvar para armazenar a chave pública. Uma vez salvo, você não pode alterar a chave. Você pode excluir a chave ou criar uma nova entrada para outra chave. Não há restrições sobre quantas chaves você pode adicionar ao seu perfil de usuário. Observe também que as chaves SSH armazenadas no Azure DevOps expiram após um ano. Se sua chave expirar, você poderá carregar uma nova chave ou a mesma para continuar acessando o Azure DevOps via SSH.

  5. Na página de visão geral de Chaves Públicas SSH, as impressões digitais do servidor são exibidas. Anote a impressão digital SHA256 a ser usada quando você se conectar ao Azure DevOps pela primeira vez via SSH.

    Captura de ecrã do acesso à configuração de segurança nos Serviços de DevOps do Azure.

  6. Teste a conexão executando o seguinte comando:

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

    Se você estiver se conectando pela primeira vez, deverá receber a seguinte saída:

    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])?
    

    Compare a impressão digital com a impressão digital SHA256 exibida na página Chaves Públicas SSH mencionada anteriormente. Prossiga apenas se eles corresponderem!

  7. Entre yes para continuar. Se tudo estiver configurado corretamente, a saída deverá ter esta aparência:

     Warning: Permanently added 'ssh.dev.azure.com' (RSA) to the list of known hosts.
     remote: Shell access is not supported.
     shell request failed on channel 0
    

    Caso contrário, consulte a secção Perguntas e resolução de problemas.

Etapa 3: clonar o repositório Git com SSH

Nota

Para usar SSH com um repositório previamente clonado via HTTPS, consulte Atualizar seus controles remotos para SSH.

  1. Copie a URL de clone SSH do portal da Web. Neste exemplo, a URL de clone SSH é para um repositório em uma organização chamada fabrikam-fiber, conforme indicado pela primeira parte da URL após dev.azure.com.

    Captura de ecrã a mostrar o URL clonado SSH do Azure Repos

    Nota

    Com os Serviços de DevOps do Azure, o formato da URL do projeto é dev.azure.com/{your organization}/{your project}. No entanto, o formato anterior que faz referência ao visualstudio.com formato ainda é suportado. Para obter mais informações, consulte Apresentando o Azure DevOps, Alternar organizações existentes para usar a nova URL de nome de domínio.

  2. Execute git clone a partir do prompt de comando.

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

    Se não estiver a utilizar um Agente SSH, ser-lhe-á pedido que introduza a sua frase secreta:

    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.
    

    Se, em vez disso, você for solicitado a verificar uma impressão digital, leia Etapa 2: adicionar a chave pública ao Azure DevOps novamente. Para outros problemas, leia a seção Perguntas e solução de problemas.

Gorjeta

Para aproveitar ao máximo o SSH, é comum usar um Agente SSH para gerenciar sua(s) chave(s) SSH. No entanto, a criação de um agente está além do escopo deste artigo.

Perguntas e solução de problemas

R: Existem duas mensagens de aviso diferentes podem ver:

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.

Ou

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.

Se você modificou sua configuração SSH para fazer downgrade de suas configurações de segurança para o Azure DevOps adicionando o seguinte ao seu ~/.ssh/config arquivo (%UserProfile%\.ssh\config no Windows):

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

Remova essas linhas agora e certifique-se de que rsa-sha2-256 e/ou rsa-sha2-512 são permitidas.

Para mais informações, veja a mensagem do blogue.

P: O SSH não consegue estabelecer uma ligação. O que devo fazer?

R: Existem vários problemas diferentes que você pode enfrentar:

  • Uso de ssh-rsa sem suporte

    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.
    

    Se você modificou sua configuração SSH para fazer downgrade de suas configurações de segurança para o Azure DevOps adicionando o seguinte ao seu ~/.ssh/config arquivo (%UserProfile%\.ssh\config no Windows):

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

    Remova essas linhas agora e certifique-se de que rsa-sha2-256 e/ou rsa-sha2-512 são permitidas.

    Para mais informações, veja a mensagem do blogue.

  • Nenhuma chave de host correspondente

    Esse problema não deve acontecer no Serviço de DevOps do Azure ou em versões mais recentes do Servidor de DevOps do Azure, conforme mencionado na postagem do blog.

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

    Modifique sua configuração SSH para fazer downgrade de suas configurações de segurança para o Azure DevOps adicionando o seguinte ao seu ~/.ssh/config arquivo (%UserProfile%\.ssh\config no Windows):

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

    Importante

    O OpenSSH substituiu o algoritmo de assinatura de ssh-rsa chave pública na versão 8.2 e o desabilitou por padrão na versão 8.8.

  • Sem MAC correspondente

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

    Modifique sua configuração SSH para fazer downgrade de suas configurações de segurança para o Azure DevOps adicionando o seguinte ao seu ~/.ssh/config arquivo (%UserProfile%\.ssh\config no Windows):

    Host ssh.dev.azure.com vs-ssh.visualstudio.com
       MACs +hmac-sha2-512,+hmac-sha2-256
    
  • Nenhum método de troca de chaves correspondente

    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
    

    Modifique sua configuração SSH para fazer downgrade de suas configurações de segurança para o Azure DevOps adicionando o seguinte ao seu ~/.ssh/config arquivo (%UserProfile%\.ssh\config no Windows):

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

    Importante

    O algoritmo diffie-hellman-group1-sha1 de troca de chaves foi desativado por padrão na versão 6.9 do OpenSSH e diffie-hellman-group14-sha1 na versão 8.2.

Gorjeta

Para instâncias auto-hospedadas do Azure DevOps Server e TFS, use o Host nome de host apropriado na linha em vez de ssh.dev.azure.com vs-ssh.visualstudio.com.

P: Como posso fazer com que o Git se lembre da senha da minha chave?

R: Você pode usar um Agente SSH. Linux, macOS e Windows (começando com o Windows 10 (build 1809) ou usando o Git para Windows com Git Bash) todos são fornecidos com um Agente SSH. O Agente SSH pode ser usado para armazenar em cache suas chaves SSH para uso repetido. Consulte o manual do seu fornecedor de SSH para obter detalhes sobre como usá-lo.

P: Eu uso o PuTTY como meu cliente SSH e gerei minhas chaves com o PuTTYgen. Posso usar essas chaves com os Serviços de DevOps do Azure?

R: Sim. Carregue a chave privada com PuTTYgen, vá para o menu Conversões e selecione Exportar chave OpenSSH. Salve o arquivo de chave privada e siga as etapas para configurar chaves não padrão. Copie sua chave pública diretamente da janela PuTTYgen e cole no campo Dados de chave em suas configurações de segurança.

P: Como posso verificar se a chave pública que carreguei é a mesma chave que a minha chave local?

R: Pode verificar a impressão digital da chave pública carregada com a apresentada no seu perfil através do seguinte ssh-keygen comando executado contra a sua chave pública utilizando a linha de comandos. Você precisa alterar o caminho e o nome do arquivo de chave pública se não estiver usando os padrões.

Nota

A partir de agosto/setembro de 2024, estamos migrando de hashes MD5 para SHA-256. Pode ser necessário escolher a função correta durante o período de transição.

ssh-keygen -l -E md5 -f <path_to_your_public_key> -- use this for MD5 fingerprints
ssh-keygen -l -E sha256 -f <path_to_your_public_key> -- use this for SHA-256 fingerprints

Em seguida, você pode comparar a assinatura com a do seu perfil. Essa verificação é útil se você tiver problemas de conexão ou tiver preocupações sobre colar incorretamente a chave pública no campo Dados de Chave ao adicionar a chave ao Azure DevOps.

P: Como posso começar a usar SSH em um repositório onde estou usando HTTPS atualmente?

R: Você precisa atualizar o origin controle remoto no Git para mudar de um URL HTTPS para SSH. Depois de ter a URL de clone SSH, execute o seguinte comando:

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

Os comandos do Git que acessam o controle remoto chamado origin usam SSH.

P: Estou a usar o Git LFS com o Azure DevOps Services e recebo erros ao solicitar ficheiros monitorizados pelo Git LFS.

R: Os Serviços de DevOps do Azure atualmente não suportam LFS sobre SSH. Utilize HTTPS para ligar o repositório aos ficheiros monitorizados pelo Git LFS.

P: Como posso usar um local de chave não padrão, ou seja, não ~/.ssh/id_rsa e ~/.ssh/id_rsa.pub?

R: Para usar uma chave armazenada em um local diferente do padrão, execute estas duas tarefas:

  1. As chaves devem estar em uma pasta que só você pode ler ou editar. Se a pasta tiver permissões mais amplas, o SSH não usará as chaves.

  2. Você deve informar o SSH sobre o local da chave, por exemplo, especificando-o como uma "Identidade" na configuração do SSH:

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

A IdentitiesOnly yes configuração garante que o SSH não use nenhuma outra identidade disponível para autenticar. Essa configuração é particularmente importante se mais de uma identidade estiver disponível.

P: Tenho várias chaves SSH. Como posso usar a chave SSH correta para o Azure DevOps?

R: Geralmente, quando você configura várias chaves para um cliente SSH, o cliente tenta autenticar com cada chave sequencialmente até que o servidor SSH aceite uma.

No entanto, essa abordagem não funciona com o Azure DevOps devido a restrições técnicas relacionadas ao protocolo SSH e à estrutura de nossas URLs SSH do Git. O Azure DevOps aceita a primeira chave fornecida pelo cliente durante a autenticação. Se essa chave for inválida para o repositório solicitado, a solicitação falhará sem tentar outras chaves disponíveis, resultando no seguinte erro:

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

Para o Azure DevOps, você precisa configurar o SSH para usar explicitamente um arquivo de chave específico. O procedimento é o mesmo que ao usar uma chave armazenada em um local não padrão. Diga ao SSH para usar a chave SSH correta para o host do Azure DevOps.

P: Como posso usar chaves SSH diferentes para organizações diferentes no Azure DevOps?

R: O Azure DevOps aceita cegamente a primeira chave que o cliente fornece durante a autenticação. Se essa chave for inválida para o repositório solicitado, a solicitação falhará com o seguinte erro:

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

Essa falha ocorre porque todas as URLs do Azure DevOps compartilham o mesmo nome de host (ssh.dev.azure.com), tornando impossível para o SSH distingui-las por padrão. No entanto, você pode modificar sua configuração SSH para diferenciar entre diferentes organizações, fornecendo chaves distintas para cada uma. Use aliases de host para criar seções separadas Host em seu arquivo de configuração 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

Depois, em vez de usar as URLs reais, diga ao Git que deseja usar essas URLs para cada repositório como remoto, substituindo o nome do host nos controles remotos existentes por devops_fabrikam e devops_contoso respectivamente. Por exemplo, git@ssh.dev.azure.com:v3/Fabrikam/Project1/fab_repo tornar-se-ia git@devops_fabrikam:v3/Fabrikam/Project1/fab_repo.

P: Que notificações posso receber sobre as minhas chaves SSH?

R: Sempre que você registrar uma nova chave SSH com os Serviços de DevOps do Azure, receberá uma notificação por email informando quando uma nova chave SSH for adicionada à sua conta.

Exemplo de notificação SSH

P: O que devo fazer se acreditar que alguém além de mim está a adicionar chaves SSH à minha conta?

R: Se você receber uma notificação de registro de chave SSH que não iniciou, suas credenciais podem ser comprometidas.

O próximo passo seria investigar se sua senha está comprometida ou não. Alterar a sua palavra-passe é sempre um bom primeiro passo para se defender contra este vetor de ataque. Se for um utilizador do Microsoft Entra, fale com o administrador para verificar se a sua conta foi utilizada a partir de uma fonte/localização desconhecida.

P: O que devo fazer se ainda me for solicitada a minha palavra-passe e GIT_SSH_COMMAND="ssh -v" git fetch mostrar no mutual signature algorithm ou corresponding algo not in PubkeyAcceptedAlgorithms?

R: Algumas distribuições Linux, como o Fedora Linux, têm políticas de criptografia que exigem algoritmos de assinatura SSH mais fortes do que o Azure DevOps suporta (a partir de janeiro de 2021). Há uma solicitação de recurso aberta para adicionar esse suporte.

Você pode contornar o problema adicionando o seguinte código à sua configuração SSH (~/.ssh/config):

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

Gorjeta

Para instâncias auto-hospedadas do Azure DevOps Server e TFS, use o Host nome de host apropriado na linha em vez de ssh.dev.azure.com vs-ssh.visualstudio.com.