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 ECDSA neste exemplo.
Para gerar arquivos de chave usando o algoritmo ECDSA, execute o seguinte comando em um prompt do PowerShell ou cmd no cliente:
ssh-keygen -t ecdsa
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 ecdsa key pair.
Enter file in which to save the key (C:\Users\username/.ssh/id_ecdsa):
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_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ública/privada 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_ecdsa
-a---- 6/3/2021 2:55 PM 103 id_ecdsa.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_ecdsa
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 ECDSA 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_ecdsa.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_ecdsa.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_ecdsa.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_ecdsa.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_ecdsa.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.