Utilizar a autenticação de chaves SSH

Serviços de DevOps do Azure | Azure DevOps Server 2022 - Azure DevOps Server 2019

Pode ligar-se aos repositórios do Git através de SSH no macOS, Linux ou Windows, para se ligar de forma segura à autenticação HTTPS.

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, o RSA será usado.

Nota

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

Para gerar arquivos de chave usando o algoritmo RSA, execute o seguinte comando a partir de um PowerShell ou outro shell, como bash em seu cliente:

ssh-keygen

A saída do comando deve exibir a seguinte saída (onde username é substituído pelo 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 senha 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

Tem de repetir esta operação para cada organização a que tenha acesso e com a qual pretenda utilizar SSH.

  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, uma nota é exibida na parte superior contendo as impressões digitais do servidor. Anote porque eles serão necessários 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 esta foi a primeira vez que se conecta, você deve 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 fornecida com as impressões digitais oferecidas na página de configurações acima mencionada. Prossiga apenas se eles corresponderem!

    Se tudo estiver configurado corretamente, a saída deverá ter esta aparência:

    remote: Shell access is not supported.
    

    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
    

    Agora você deve ser solicitado a inserir sua senha para sua chave SSH antes de poder continuar, a menos que ela seja gerenciada por um agente 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.
    

    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 que poderá 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.

Você pode ter modificado anteriormente 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

Por favor, remova essas linhas agora e certifique-se de que rsa-sha2-256 e/ou rsa-sha2-512 são permitidos.

Para obter mais detalhes, consulte a postagem do blog.

P: O SSH não pode estabelecer uma conexão. O que devo fazer?

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

  • Uso de SSH-RSA não suportado

    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.
    

    Você pode ter modificado anteriormente 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
    

    Por favor, remova essas linhas agora e certifique-se de que rsa-sha2-256 e/ou rsa-sha2-512 são permitidos.

    Para obter mais detalhes, consulte a postagem do blog.

  • Nenhuma chave de host correspondente

    Isso não deve acontecer nem no Serviço de DevOps do Azure nem nas 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 para isso. 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ê precisará alterar o caminho e o nome do arquivo de chave pública se não estiver usando os padrões.

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

Em seguida, você pode comparar a assinatura MD5 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ê precisará 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 agora usarão 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 usará nenhuma outra identidade disponível para autenticar. Isto é particularmente importante se estiver disponível mais do que uma identidade.

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

R: Geralmente, se você configurar várias chaves para um cliente SSH e se conectar a um servidor SSH, o cliente pode tentar as chaves uma de cada vez até que o servidor aceite uma.

No entanto, isso não funciona com o Azure DevOps por motivos técnicos relacionados ao protocolo SSH e como nossas URLs SSH do Git são estruturadas. O Azure DevOps aceitará cegamente a primeira chave que o cliente fornecer 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 devido ao seguinte erro:

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

Para o Azure DevOps, você precisará 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. Basta dizer 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 aceitará cegamente a primeira chave que o cliente fornecer 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.

No entanto, você pode modificar sua configuração SSH para diferenciar entre diferentes organizações e fornecer chaves diferentes para cada uma. Para fazer isso, você precisará usar aliases de host para criar seções separadas Host em sua configuração SSH. Isso ocorre porque todas as URLs de DevOps do Azure hospedadas têm o mesmo nome de host (ssh.dev.azure.com), portanto, o SSH não tem como distingui-las por padrão.

# 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 registar uma nova chave SSH nos Serviços de DevOps do Azure, recebe uma notificação por correio eletrónico a informá-lo de que foi adicionada uma nova chave SSH à 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 uma chave SSH sendo registrada e não a carregou manualmente para o serviço, suas credenciais podem ter sido comprometidas.

O próximo passo seria investigar se sua senha foi 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.