Compartilhar via


Autenticação baseada em chave no OpenSSH para Windows

A maior parte das autenticações feitas em ambientes Windows é feita com um par nome de usuário e senha, o que funciona bem para sistemas que compartilham um domínio comum. Quando você trabalha entre domínios, como entre sistemas locais e hospedados na nuvem, esse tipo de autenticação torna-se vulnerável a invasões de força bruta.

Em comparação, os ambientes do Linux geralmente usam pares de chaves públicas/privadas para impulsionar a autenticação que não exige o uso de senhas adivinhadas. O OpenSSH inclui ferramentas para ajudar a dar suporte à autenticação baseada em chave, especificamente:

  • ssh-keygen para gerar chaves seguras.
  • ssh-agent e ssh-add para armazenar chaves privadas com segurança.
  • scp e sftp para copiar com segurança arquivos de chave pública durante o uso inicial de um servidor.

Este documento fornece uma visão geral de como usar essas ferramentas no Windows para começar a usar a autenticação baseada em chave com o Secure Shell (SSH). Se você não estiver familiarizado com o gerenciamento de chaves SSH, recomendamos que você examine o documento NIST IR 7966, intitulado Segurança do Gerenciamento de Acesso Interativo e Automatizado usando o SSH (Secure Shell).

Pares de chaves

Os pares de chaves referem-se aos arquivos de chave pública e privada usados por determinados protocolos de autenticação.

A autenticação de chave pública SSH usa algoritmos criptográficos assimétricos para gerar dois arquivos de chave: um privado e outro público. Cada arquivo de chave privada é o equivalente a uma senha e deve permanecer protegido em todas as circunstâncias. Se alguém adquirir sua chave privada, poderá entrar como você para qualquer servidor SSH ao qual você tenha acesso. A chave pública é o que é colocado no servidor SSH e pode ser compartilhado sem comprometer a chave privada.

O servidor SSH e o cliente podem usar autenticação baseada em chave para comparar a chave pública de um nome de usuário fornecido com a chave privada correspondente. Se a chave pública do lado do servidor não puder ser validada em relação à chave privada do lado do cliente, a autenticação falhará.

A autenticação multifator pode ser implementada com pares de chaves ao inserir uma frase secreta durante a geração do par de chaves. Para obter mais informações, consulte a geração de chave de usuário. O usuário é solicitado a solicitar a frase secreta durante a autenticação. A frase secreta combinada com a presença da chave privada é usada no cliente SSH para autenticar o usuário.

Importante

Uma sessão remota aberta por meio da autenticação baseada em chave não tem credenciais de usuário associadas. Como resultado, a sessão não é capaz de autenticação de saída como o usuário. Esse comportamento é por design.

Geração de chave de host

As chaves públicas têm requisitos específicos de ACL (lista de controle de acesso) que, no Windows, equivalem a permitir apenas o acesso aos administradores e ao usuário do Sistema. Na primeira vez que o sshd serviço é usado, o par de chaves para o host é gerado automaticamente.

Importante

Você precisa instalar o OpenSSH Server antes de executar os comandos neste artigo. Para obter mais informações, consulte Introdução ao OpenSSH para Windows.

Por padrão, você precisa iniciar sshd manualmente. Para configurá-lo para iniciar automaticamente sempre que o servidor for reiniciado, execute os seguintes comandos em um prompt do PowerShell com privilégios elevados no servidor:

# Set the sshd service to be started automatically.
Get-Service -Name sshd | Set-Service -StartupType Automatic

# Start the sshd service.
Start-Service sshd

Como não há nenhum usuário associado sshd ao serviço, as chaves de host são armazenadas em C:\ProgramData\ssh.

Geração de chave do usuário

Para usar a autenticação baseada em chave, primeiro você precisa gerar pares de chaves pública/privada para o cliente. Você pode usar ssh-keygen.exe para gerar arquivos de chave e especificar os seguintes algoritmos de geração de chave:

  • Algoritmo de Assinatura Digital (DSA)
  • Rivest–Shamir–Adleman (RSA)
  • Algoritmo de assinatura digital de curva elíptica (ECDSA)
  • Ed25519

Se você não especificar um algoritmo, Ed25519 será usado. Um algoritmo e um comprimento de chave fortes devem ser usados, como ECDSA neste exemplo.

Para gerar arquivos de chave usando o algoritmo ECDSA, execute o seguinte comando em uma janela do PowerShell ou prompt de comando em seu cliente:

ssh-keygen -t ecdsa

A saída do comando deve ser semelhante às seguintes linhas, exceto que username é substituído pelo nome de usuário:

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

No prompt, você pode selecionar Enter para aceitar o caminho de arquivo padrão ou especificar um caminho ou nome de arquivo para as chaves geradas.

Em seguida, você será solicitado a usar uma frase secreta para criptografar seus arquivos de chave privada. Em geral, não recomendamos o uso de uma frase secreta vazia, pois a frase secreta funciona com o arquivo de chave para fornecer autenticação de dois fatores. Mas, para este exemplo, você pode deixar a frase secreta vazia.

Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\username/.ssh/id_ecdsa.
Your public key has been saved in C:\Users\username/.ssh/id_ecdsa.pub.
The key fingerprint is:
SHA256:OIzc1yE7joL2Bzy8!gS0j8eGK7bYaH1FmF3sDuMeSj8 username@LOCAL-HOSTNAME

The key's randomart image is:
+--[ECDSA 256]--+
|        .        |
|         o       |
|    . + + .      |
|   o B * = .     |
|   o= B S .      |
|   .=B O o       |
|  + =+% o        |
| *oo.O.E         |
|+.o+=o. .        |
+----[SHA256]-----+

Agora você tem um par de chaves ECDSA público/privado no local especificado. O arquivo .pub é a chave pública e o arquivo sem uma extensão é a chave privada:

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----         6/3/2021   2:55 PM            464 id_ecdsa
-a----         6/3/2021   2:55 PM            103 id_ecdsa.pub

Um arquivo de chave privada é equivalente a uma senha e deve ser protegido da mesma maneira que você protege sua senha. Você pode usar ssh-agent para armazenar com segurança suas chaves privadas em um contexto de segurança do Windows associado à sua conta do Windows. Para configurar o ssh-agent serviço a ser iniciado automaticamente sempre que o computador for reiniciado e para usar ssh-add para armazenar a chave privada, execute os seguintes comandos em um prompt do PowerShell com privilégios elevados no servidor:

# By default, the ssh-agent service is disabled. Configure it to start automatically.
# Run the following command as an administrator.
Get-Service ssh-agent | Set-Service -StartupType Automatic

# Start the service.
Start-Service ssh-agent

# The following command should return a status of Running.
Get-Service ssh-agent

# Load your key files into ssh-agent.
ssh-add $env:USERPROFILE\.ssh\id_ecdsa

Depois de adicionar a chave ao ssh-agent serviço em seu cliente, o ssh-agent serviço recupera automaticamente a chave privada local e a passa para o cliente SSH.

Importante

Recomendamos que você faça backup de sua chave privada para um local seguro e, em seguida, exclua-a do sistema local depois de adicioná-la ao ssh-agent serviço. A chave privada não pode ser recuperada do agente quando um algoritmo forte é usado, como ECDSA neste exemplo. Se você perder o acesso à chave privada, precisará criar um novo par de chaves e atualizar a chave pública em todos os sistemas com os quais interage.

Implantar a chave pública

Para usar a chave de usuário que você criou anteriormente, você precisa colocar o conteúdo da chave pública (\.ssh\id_ecdsa.pub) no servidor em um arquivo de texto. O nome e o local do arquivo dependem se a conta de usuário é membro do grupo de administradores local ou de uma conta de usuário padrão. As seções a seguir abrangem usuários padrão e administrativos.

Usuário padrão

Você precisa colocar o conteúdo da chave pública (\.ssh\id_ecdsa.pub) no servidor em um arquivo de texto chamado authorized_keysem C:\Users\username\.ssh\. Você pode copiar sua chave pública usando o utilitário de transferência de arquivo seguro OpenSSH scp ou usando o PowerShell para gravar a chave no arquivo.

Você pode usar o código a seguir para copiar a chave pública para o servidor. Na última linha, substitua username pelo nome de usuário. Inicialmente, você será solicitado a inserir uma senha para a conta de usuário do servidor.

# Get the public key file generated previously on your client.
$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ecdsa.pub

# Generate the PowerShell command to run remotely that copies the public key file generated previously on your client to the authorized_keys file on your server.
$remotePowershell = "powershell New-Item -Force -ItemType Directory -Path $env:USERPROFILE\.ssh; Add-Content -Force -Path $env:USERPROFILE\.ssh\authorized_keys -Value '$authorizedKey'"

# Connect to your server and run the PowerShell command by using the $remotePowerShell variable.
ssh username@domain1@contoso.com $remotePowershell

Usuário administrativo

Você precisa colocar o conteúdo da chave pública (\.ssh\id_ecdsa.pub) no servidor em um arquivo de texto chamado administrators_authorized_keysem C:\ProgramData\ssh\. Você pode copiar sua chave pública usando o utilitário de transferência de arquivo seguro OpenSSH scp ou usando o PowerShell para gravar a chave no arquivo. A ACL nesse arquivo precisa ser configurada para permitir apenas o acesso aos administradores e ao usuário do Sistema.

Você pode usar o código a seguir para copiar a chave pública para o servidor e configurar a ACL. Na última linha, substitua username pelo nome de usuário. Inicialmente, você será solicitado a inserir uma senha para a conta de usuário do servidor.

Observação

Este exemplo mostra as etapas para criar o arquivo administrators_authorized_keys. Esse arquivo só se aplica a contas de administrador. Você deve usá-lo em vez do arquivo específico do usuário no local do perfil do usuário.

# Get the public key file generated previously on your client.
$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ecdsa.pub

# Generate the PowerShell command to run remotely that copies the public key file generated previously on your client to the authorized_keys file on your server.
$remotePowershell = "powershell Add-Content -Force -Path $env:ProgramData\ssh\administrators_authorized_keys -Value '''$authorizedKey''';icacls.exe ""$env:ProgramData\ssh\administrators_authorized_keys"" /inheritance:r /grant ""Administrators:F"" /grant ""SYSTEM:F"""

# Connect to your server and run the PowerShell command by using the $remotePowerShell variable.
ssh username@domain1@contoso.com $remotePowershell

Para versões localizadas não em inglês do sistema operacional, o script precisa ser modificado para refletir os nomes de grupo adequadamente. Para evitar erros que podem ocorrer quando você concede permissões a nomes de grupo, você pode usar o SID (identificador de segurança) no lugar do nome do grupo. Você pode recuperar o SID executando Get-LocalGroup | Select-Object Name, SID. Quando você usa o SID no lugar do nome do grupo, ele deve ser precedido por um asterisco (*). No exemplo a seguir, o grupo Administradores usa o SID S-1-5-32-544:

$remotePowershell = "powershell Add-Content -Force -Path $env:ProgramData\ssh\administrators_authorized_keys -Value '''$authorizedKey''';icacls.exe ""$env:ProgramData\ssh\administrators_authorized_keys"" /inheritance:r /grant ""*S-1-5-32-544:F"" /grant ""SYSTEM:F"""

Essas etapas concluem a configuração necessária para usar a autenticação baseada em chave com OpenSSH no Windows. Depois de executar esses comandos do PowerShell, você pode se conectar ao sshd host de qualquer cliente que tenha a chave privada.