Acesso SSH com Chaves Assimétricas
Ao acessar um servidor via SSH, é comum configurar a autenticação por chave para que cada computador autorizado possua sua própria credencial de acesso.
É necessário gerar um par de chaves, autorizar a chave pública no servidor e configurar o cliente SSH para utilizar a chave privada correspondente.
Além da autenticação, o cliente SSH permite registrar os parâmetros da conexão no arquivo ~/.ssh/config. Com isso, endereço, usuário, porta e chave podem ser associados a um nome curto, como alias_servidor. Esse alias passa a representar toda a configuração da conexão e pode ser utilizado tanto diretamente no terminal quanto em scripts de deploy e tarefas de administração.
Este guia registra esse processo completo para a configuração de um novo computador cliente. Os exemplos utilizam PowerShell no Windows, mas a estrutura do arquivo config e os conceitos apresentados também se aplicam ao Linux e ao macOS.
Nivelamento Conceitual
SSH
SSH (Secure Shell) é um protocolo de rede baseado no modelo cliente-servidor para comunicação entre dispositivos. Permite, entre outras funcionalidades, execução remota de comandos, transferência de arquivos e tunelamento de conexões por meio de um canal criptografado, além de fornecer mecanismos para autenticação das partes envolvidas.
Diferentes Implementações
Existem diferentes implementações e suítes de software que permitem utilizar o protocolo SSH. Alguns exemplos são:
- OpenSSH — provavelmente a implementação mais popular. Não possui interface gráfica própria e suas ferramentas são utilizadas principalmente por linha de comando. É amplamente utilizado em Windows, Linux e macOS;
- PuTTY — conjunto de ferramentas bastante utilizado no Windows, incluindo cliente com interface gráfica;
- Dropbear — implementação compacta, comum em sistemas embarcados;
- Tectia SSH — implementação comercial.
Neste artigo será utilizado o OpenSSH.
O OpenSSH é uma suíte que inclui diferentes programas, entre eles:
ssh— cliente SSH;sshd— servidor SSH;ssh-keygen— criação e gerenciamento de pares de chaves;ssh-agent— mantém chaves privadas disponíveis para autenticação;ssh-add— adiciona chaves aossh-agent.
Autenticação por Chaves
O SSH pode utilizar autenticação por chave pública, baseada em criptografia assimétrica. Nesse modelo são utilizadas duas chaves matematicamente relacionadas:
- chave privada — permanece no computador cliente;
- chave pública — é cadastrada no servidor.
Durante a autenticação, o cliente demonstra possuir a chave privada correspondente à chave pública autorizada pelo servidor, sem transmitir a chave privada.
Algoritmos Criptográficos das Chaves
Existem diferentes algoritmos que podem ser utilizados para as chaves de autenticação SSH, entre eles:
| Algoritmo | Características |
|---|---|
| Ed25519 | Moderno, eficiente, utiliza chaves pequenas e é uma boa opção padrão |
| RSA | Muito difundido e útil quando é necessária compatibilidade com sistemas mais antigos |
| ECDSA | Baseado em curvas elípticas e suportado por diversas implementações SSH |
| DSA | Algoritmo legado, atualmente não recomendado |
Nota: neste artigo será utilizado Ed25519. As chaves Ed25519 são utilizadas no processo de autenticação e não para criptografar todo o tráfego da sessão SSH. Após o estabelecimento da conexão, o SSH utiliza algoritmos de criptografia simétrica para proteger o tráfego da sessão.
1. Configurações
Uma conexão SSH com autenticação por chave pode ser entendida em dois macroblocos.
Cliente
Trata-se do dispositivo que inicia a conexão, onde ficam dois elementos principais:
- o alias da conexão, definido em
~/.ssh/config, que informa ao SSH qual servidor acessar, qual usuário utilizar e qual chave privada deve ser usada. O alias pode ser qualquer nome fácil de lembrar por quem inicia a comunicação; - a chave privada, armazenada somente no computador cliente.
O alias reúne os parâmetros necessários para a conexão e aponta para a chave privada correspondente.
Servidor
Representa o dispositivo que recebe a solicitação de conexão.
A chave pública é gerada junto com a chave privada no computador cliente, mas deve ser copiada para o servidor remoto e adicionada ao arquivo:
~/.ssh/authorized_keys
Esse arquivo determina quais chaves públicas estão autorizadas a autenticar como aquele usuário. Por exemplo, uma chave adicionada em /root/.ssh/authorized_keys autoriza o acesso como root, mas não como outro usuário do sistema.
2. Verificar a Instalação do OpenSSH
No PowerShell, confirme que o OpenSSH está disponível:
ssh -V
No Windows 10 e no Windows 11, o cliente pode ser instalado em Configurações > Sistema > Recursos opcionais > Adicionar um recurso > Cliente OpenSSH.
Em Linux e macOS, ele normalmente já está disponível ou pode ser instalado pelo gerenciador de pacotes do sistema.
3. Localizar ou Criar o Diretório de Configuração
No Windows, os arquivos do usuário ficam normalmente em:
C:\Users\SEU_USUARIO\.ssh\
Crie o diretório caso ele ainda não exista:
$SshDir = Join-Path $env:USERPROFILE ".ssh"
New-Item -ItemType Directory -Path $SshDir -Force
No Linux e no macOS, o caminho equivalente é:
~/.ssh/
4. Gerar as Chaves
É preferível gerar um par de chaves diferente para cada cliente. Assim, um dispositivo perdido, comprometido ou desativado pode ter seu acesso revogado sem afetar os demais.
No PowerShell:
ssh-keygen -t ed25519 -a 100 `
-C "alias_cliente" `
-f "$env:USERPROFILE\.ssh\alias_servidor"
O comando cria dois arquivos:
| Arquivo | Função | Pode ser compartilhado? |
|---|---|---|
alias_servidor |
chave privada | não |
alias_servidor.pub |
chave pública | sim |
Nunca envie a chave privada por e-mail, mensagem, armazenamento público ou repositório Git.
5. Cadastrar a Chave Pública no Servidor
Exiba a chave pública no Windows:
Get-Content "$env:USERPROFILE\.ssh\alias_servidor.pub"
Copie a linha inteira, que normalmente começa com:
ssh-ed25519
Acesse o servidor por outro meio já disponível, como:
- um computador previamente autorizado;
- o console web do provedor;
- autenticação por usuário e senha, caso esteja habilitada;
- outro mecanismo de acesso administrativo disponível.
Então, depois dessa configuração:
- A chave privada deve ser mantida no cliente.
- A chave pública que ainda está no cliente pode ser apagada, embora normalmente seja mantida por conveniência.
Em todo caso, no cliente, a chave pública pode ser recriada posteriormente a partir da chave privada através do comando:
ssh-keygen -y -f "$env:USERPROFILE\.ssh\alias_servidor"
Por isso, o arquivo realmente crítico é a chave privada. Se você a perder e não tiver backup, aquele par de chaves deixa de ser utilizável para autenticação.
Verificar as Chaves Autorizadas no Servidor
Verifique qual usuário está autenticado na sessão:
whoami
O resultado deve corresponder ao mesmo usuário que será informado posteriormente no campo User do arquivo de configuração SSH.
O símbolo ~ representa o diretório pessoal da conta atual. Assim, quando whoami retorna root, o caminho:
~/.ssh/authorized_keys
representa:
/root/.ssh/authorized_keys
Prepare o diretório e o arquivo caso ainda não existam:
mkdir -p ~/.ssh
touch ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
Abra o arquivo com o editor nano:
nano ~/.ssh/authorized_keys
Cole a chave pública em uma nova linha. Cada computador autorizado deve ocupar uma linha completa, por exemplo:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... alias_cliente
Não substitua nem apague as linhas existentes, pois elas podem autorizar outros computadores que ainda precisam acessar o servidor.
Depois de editar, confirme as permissões:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
6. Criar o Alias no Arquivo SSH
Edite ou crie o arquivo abaixo, sem extensão:
C:\Users\SEU_USUARIO\.ssh\config
Adicione uma entrada como esta:
Host <alias_servidor>
HostName <addr_servidor>
User <user_servidor>
Port 22
IdentityFile ~/.ssh/alias_servidor
IdentitiesOnly yes
Substitua:
alias_servidorpelo nome curto que será utilizado nos comandos e scripts;addr_servidorpelo endereço IP ou domínio real do servidor;user_servidorpela mesma conta em cujoauthorized_keysa chave pública foi adicionada;22pela porta SSH, caso o servidor utilize outra;IdentityFilepelo caminho da chave privada criada.
7. Fazer a Primeira Conexão
Conecte utilizando somente o alias:
ssh alias_servidor
Se a chave privada possuir senha, ela será solicitada.
Para diagnosticar uma falha sem alterar nenhuma configuração, utilize o modo detalhado:
ssh -vvv alias_servidor
8. Usar o Agente SSH Opcionalmente
O ssh-agent pode manter uma chave privada desbloqueada em memória durante a sessão, evitando que sua senha precise ser digitada a cada nova conexão.
No PowerShell executado como administrador, habilite o serviço uma vez:
Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agent
Depois, em um terminal normal, adicione a chave:
ssh-add "$env:USERPROFILE\.ssh\alias_servidor"
ssh-add -l
O agente é uma conveniência, não um requisito. O campo IdentityFile permite que o cliente SSH localize a chave privada mesmo sem o uso do ssh-agent.