Autenticação baseada em chave no OpenSSH para Windows

Aplica-se ao Windows Server 2022, ao Windows Server 2019 e ao Windows 10 (build 1809 e posterior)

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. Ao trabalhar entre domínios, por exemplo, entre sistemas locais e hospedados na nuvem, eles se tornam vulneráveis a intrusões de força bruta.

Por comparação, os ambientes do Linux geralmente usam pares de chave pública/chave privada para controlar a autenticação, dispensando o uso de senhas que podem ser 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 arquivos de chave pública com segurança 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 de chave com o SSH. Se você não está familiarizado com o gerenciamento de chaves SSH, é altamente recomendável examinar o documento do NIST IR 7966 intitulado "Segurança de gerenciamento de acesso interativo e automatizado usando SSH (Secure Shell)".

Sobre 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 de criptografia assimétrica para gerar dois arquivos de chave, um "privado" e outro "público". Os arquivos de chave privada são equivalentes a uma senha e devem ficar protegidos 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 compartilhada sem comprometer a chave privada.

A autenticação baseada em chave permite que o servidor SSH e o cliente comparam a chave pública de um nome de usuário fornecido à chave privada. 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 inserindo uma frase secreta quando o par de chaves é gerado (confira geração de chave do usuário a seguir). O usuário será solicitado a fornecer a frase secreta durante a autenticação. A frase secreta é usada junto com a presença da chave privada 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 e, portanto, não consegue fazer a autenticação de saída como o usuário. Isso ocorre intencionalmente.

Geração de chave de host

As chaves públicas têm requisitos específicos de ACL que, no Windows, são equivalentes a permitir somente o acesso a administradores e sistemas. No primeiro uso de sshd, o par de chaves do host será gerado automaticamente.

Importante

Você precisa ter o Servidor OpenSSH instalado primeiro. Consulte a Introdução ao OpenSSH.

Por padrão, o serviço sshd é configurado para ser iniciado manualmente. Para iniciá-lo sempre que o servidor for reinicializado, execute os seguintes comandos em um prompt elevado do PowerShell no servidor:

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

# Now start the sshd service
Start-Service sshd

Como não há nenhum usuário associado ao serviço sshd, 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. 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. Um algoritmo e um comprimento de chave fortes devem ser usados, como Ed25519 neste exemplo.

Para gerar arquivos de chave usando o algoritmo Ed25519, execute o seguinte comando em um prompt do PowerShell ou cmd no cliente:

ssh-keygen -t ed25519

A saída do comando deve exibir a seguinte saída (em que "username" é substituído pelo seu nome de usuário):

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

Você pode pressionar Enter para aceitar o padrão ou especificar um caminho e/ou nome de arquivo em que deseja que as chaves sejam geradas. Neste ponto, você será solicitado a usar uma frase secreta para criptografar seus arquivos de chave privada. A frase secreta pode ficar vazia, mas isso não é recomendado. A frase secreta funciona com o arquivo de chave para fornecer autenticação de dois fatores. Para este exemplo, estamos deixando 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_ed25519.
Your public key has been saved in C:\Users\username/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:OIzc1yE7joL2Bzy8!gS0j8eGK7bYaH1FmF3sDuMeSj8 username@LOCAL-HOSTNAME

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

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

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

Lembre-se de que os arquivos de chave privada são o equivalente a uma senha e devem ser protegido da mesma maneira que você protege sua senha. Use ssh-agent para armazenar com segurança as chaves privadas em um contexto de segurança do Windows, associado à conta do Windows. Para iniciar o serviço ssh-agent sempre que o computador for reinicializado e 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.
# Make sure you're running as an Administrator.
Get-Service ssh-agent | Set-Service -StartupType Automatic

# Start the service
Start-Service ssh-agent

# This should return a status of Running
Get-Service ssh-agent

# Now load your key files into ssh-agent
ssh-add $env:USERPROFILE\.ssh\id_ed25519

Depois de adicionar a chave ao ssh-agent em seu cliente, o ssh-agent recuperará automaticamente a chave privada local e a passará para o cliente SSH.

Importante

É altamente recomendável fazer backup da chave privada em um local seguro e, em seguida, excluí-la do sistema local depois de adicioná-la ao ssh-agent. A chave privada não poderá ser recuperada do agente desde que um algoritmo forte foi tenha sido usado, como Ed25519 neste exemplo. Se você perder o acesso à chave privada, precisará criar um par de chaves e atualizar a chave pública em todos os sistemas com os quais interage.

Como implantar a chave pública

Para usar a chave de usuário criada acima, o conteúdo da chave pública (\.ssh\id_ed25519.pub) precisa ser colocado 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 locais 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

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

O exemplo a seguir copia a chave pública para o servidor (em que "nome de usuário" é substituído por seu nome de usuário). Você precisará usar a senha da conta de usuário para o servidor inicialmente.

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

# Generate the PowerShell to be run remote that will copy 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 using the $remotePowerShell variable
ssh username@domain1@contoso.com $remotePowershell

Usuário administrativo

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

O exemplo a seguir copia a chave pública para o servidor e configura a ACL (em que "nome de usuário" é substituído por seu nome de usuário). Você precisará usar a senha da conta de usuário para o servidor inicialmente.

Observação

Este exemplo mostra as etapas para criar o arquivo administrators_authorized_keys. Isso só se aplica a contas de administrador e deve ser usado em vez do arquivo por 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_ed25519.pub

# Generate the PowerShell to be run remote that will copy 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 using the $remotePowerShell variable
ssh username@domain1@contoso.com $remotePowershell

Para versões do sistema operacional localizadas em idiomas além do inglês, o script precisará ser modificado para refletir os nomes dos grupos. Para evitar erros ao conceder permissões a nomes de grupo, o SID (Identificador de Segurança) pode ser usado em seu lugar. O SID pode ser recuperado executando Get-LocalGroup | Select-Object Name, SID. Ao usar 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 que os comandos do PowerShell de exemplo tiverem sido executados, o usuário poderá se conectar ao host sshd de qualquer cliente que tenha a chave privada.