Configuração de Autenticação por Chave SSH - Login Seguro sem Senha
O que você vai conseguir fazer
- Gerar um par de chaves ED25519, implantar a chave pública e entrar sem senha
- Definir as permissões corretas em `~/.ssh` e diagnosticar `Permission denied (publickey)` sozinho
- Gerenciar vários servidores e passphrases com `~/.ssh/config` e `ssh-agent`
Pré-requisitos (leia estes primeiro)
O Que Este Artigo Aborda
- Como gerar um par de chaves SSH e conectar-se a um servidor
- Como implantar sua chave pública corretamente com
ssh-copy-id - Como gerenciar múltiplos servidores com
~/.ssh/config
Termos usados neste artigo (definidos antes de começar)
- Par de chaves: dois arquivos que formam um conjunto. A chave pública (a que termina em
.pub) e a chave privada (a que não tem.pub) - Chave pública: a chave que você coloca no servidor. Não há problema se outras pessoas a virem
- Chave privada: a chave que fica na sua própria máquina. Ela nunca deve chegar a outra pessoa. Também chamada de "identity file"
- Passphrase: o segredo que criptografa o próprio arquivo da chave privada. Não é a senha de login do servidor; são coisas diferentes e fáceis de confundir
authorized_keys: o arquivo no servidor que lista as chaves públicas autorizadas a entrar como aquele usuário. Fica em~/.ssh/authorized_keysssh-agent: um programa residente que guarda a chave privada decifrada na memória para você não redigitar a passphrase- ED25519 / RSA: nomes de algoritmos de chave. A recomendação atual é o ED25519
Resumo Rápido (3 Passos)
- Execute
ssh-keygen -t ed25519para gerar um par de chaves - Execute
ssh-copy-id user@serverpara implantar a chave pública - Execute
ssh user@server— sem necessidade de senha
Pré-requisitos
- Ubuntu / Debian / Linux baseado em RHEL no cliente e no servidor
- OpenSSH instalado em ambas as máquinas
- Acesso inicial ao servidor via autenticação por senha
Por Que Usar Autenticação por Chave?
A autenticação por chave é mais segura que senhas e tira a digitação manual da automação. Há três motivos principais para migrar.
- Segurança: Sua chave privada nunca sai da sua máquina local. Nenhuma senha é enviada pela rede.
- Resistência a força bruta: Com uma chave suficientemente longa, tentar todas as combinações é inviável.
- Automação: rsync, Ansible e pipelines CI/CD conseguem conectar-se onde não há ninguém para digitar a senha.
1. Gerar um Par de Chaves
Qual algoritmo usar?
ED25519 é a recomendação atual. Ele oferece força equivalente ou superior à do RSA-4096 com uma chave bem menor e operações mais rápidas. Use -t rsa -b 4096 apenas em equipamentos antigos que não suportam ED25519.
ssh-keygen -t ed25519 -C "your_email@example.com"
Generating public/private ed25519 key pair. Enter file in which to save the key (/home/user/.ssh/id_ed25519): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/user/.ssh/id_ed25519 Your public key has been saved in /home/user/.ssh/id_ed25519.pub
A flag -C adiciona um comentário (útil para identificação). É opcional.
Por que definir uma passphrase?
Uma passphrase criptografa o próprio arquivo da chave privada. Mesmo que sua máquina seja roubada, a chave não pode ser usada como está. Use ssh-agent para evitar redigitar a passphrase a cada conexão (veja abaixo). Você pode pressionar Enter e deixar em branco, mas então qualquer pessoa que obtenha o arquivo da chave privada entra imediatamente.
Verifique os arquivos gerados:
ls -la ~/.ssh/
total 16 drwx------ 2 user user 4096 May 31 10:00 . drwxr-xr-x 8 user user 4096 May 31 10:00 .. -rw------- 1 user user 419 May 31 10:00 id_ed25519 -rw-r--r-- 1 user user 107 May 31 10:00 id_ed25519.pub
id_ed25519(chave privada): permissões600. Este arquivo fica na sua própria máquina.id_ed25519.pub(chave pública): é ela que você adiciona ao~/.ssh/authorized_keysno servidor.
O que nunca fazer com uma chave privada
Se a chave privada chegar a outra pessoa, todos os servidores que ela abre ficam comprometidos. O alcance do estrago é maior que o de uma senha reutilizada.
- Nunca cole em e-mail, chat ou ticket: o conteúdo fica para sempre nesses históricos e logs. O que se compartilha é sempre a chave pública (
.pub) - Nunca coloque em servidor ou armazenamento compartilhado: copiar a chave privada para o servidor com
scpé um acidente clássico. No servidor entra apenas a chave pública - Nunca faça commit em um repositório: depois do push, trate a chave como vazada mesmo que reescreva o histórico
- Use uma chave por máquina: uma única chave em todos os equipamentos significa que perder um notebook compromete tudo
Se você achar que a chave vazou
- Remova a linha daquela chave pública do
~/.ssh/authorized_keysem cada servidor - Gere um novo par com
ssh-keygen -t ed25519e implante novamente - Remova o registro da chave antiga nos serviços onde ela estava cadastrada (GitHub e similares)
2. Implantar a Chave Pública no Servidor
Usando ssh-copy-id (recomendado)
Execute uma vez enquanto a autenticação por senha ainda estiver ativa no servidor. A senha pedida aqui é a de login do servidor, não a passphrase da chave.
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/user/.ssh/id_ed25519.pub" /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s) /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed user@server's password: Number of key(s) added: 1
ssh-copy-id adiciona a chave pública ao ~/.ssh/authorized_keys no servidor. As chaves existentes não são sobrescritas, apenas complementadas. Se precisar criar o ~/.ssh, ele o cria com as permissões corretas, mas não corrige as permissões de um diretório ou arquivo que já exista. Faça sempre a verificação de permissões da próxima seção.
Implantação manual quando ssh-copy-id não está disponível
cat ~/.ssh/id_ed25519.pub | ssh user@server \ "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
Não troque >> (acrescentar) por > (sobrescrever)
O cat >> ~/.ssh/authorized_keys acima acrescenta. Com um único > ele sobrescreve e apaga todas as outras chaves públicas já registradas no servidor, inclusive as usadas por colegas e pelo CI. Recuperar depois disso exige acesso ao console.
Confirme também que o arquivo enviado termina em .pub. Sem o .pub, você acaba de copiar sua chave privada para o servidor.
3. Definir Permissões Corretas
O SSH rejeita a autenticação por chave quando as permissões do diretório ou arquivo são muito permissivas. O raciocínio: uma chave guardada onde outros podem ler ou escrever não merece confiança.
| Caminho | Permissão Necessária | Motivo |
|---|---|---|
~/.ssh/ |
700 |
Somente leitura/escrita/execução do dono |
~/.ssh/authorized_keys |
600 |
Somente leitura/escrita do dono |
~/.ssh/id_ed25519 |
600 |
Chave privada deve ser estritamente protegida |
~/.ssh/id_ed25519.pub |
644 |
Chave pública é segura para outros lerem |
Comandos de correção:
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys chmod 600 ~/.ssh/id_ed25519
Permissões frouxas demais quebram a autenticação por chave, mas quem recusa depende de onde está a folga.
- Lado do servidor: se o diretório home, o
~/.sshou oauthorized_keysestiver gravável por grupo ou por outros (775,777etc.), o sshd ignora aquela chave e retornaPermission denied (publickey).755e644não são recusados - Lado do cliente: se a chave privada tiver qualquer permissão de grupo ou de outros (
644,755), osshexibeUNPROTECTED PRIVATE KEY FILEe não usa a chave. Essa recusa vem dosshlocal, não do servidor
Quando a conexão falhar, comece conferindo os valores da tabela acima.
Não tente resolver com chmod 777 ~/.ssh. Afrouxar as permissões piora a situação: qualquer usuário da máquina poderia acrescentar a própria chave pública ao seu authorized_keys e entrar como você. A correção certa é igualar aos valores da tabela acima (700 / 600 / 644).
4. Testar a Conexão
ssh -v user@server
A flag -v (verbose) imprime o processo de autenticação em detalhes. Ela mostra qual chave foi oferecida e se o servidor a aceitou.
... debug1: Offering public key: /home/user/.ssh/id_ed25519 ED25519 SHA256:xxxxx debug1: Server accepts key: /home/user/.ssh/id_ed25519 ED25519 SHA256:xxxxx Authenticated to server ([x.x.x.x]:22) using "publickey".
Authenticated to server ... using "publickey" confirma que a autenticação por chave está funcionando.
Só desative a autenticação por senha depois de comprovar o login por chave
Não coloque PasswordAuthentication no em /etc/ssh/sshd_config antes de a autenticação por chave funcionar de forma confiável. Se desativar com a chave mal instalada, o resultado é um servidor no qual ninguém consegue entrar.
A sequência segura
- Mantenha aberta a sessão SSH atual. Não a feche
- Em outro terminal, abra uma nova sessão e confirme que o login por chave funciona
- Só então altere a configuração e execute
sudo systemctl reload ssh(sshdem sistemas da família RHEL) - Confirme o login em mais uma sessão nova antes de fechar a primeira
Solução de Problemas
Sintoma: Permission denied (publickey)
Verificação 1: alguma chave está sendo oferecida?
ssh -v user@server 2>&1 | grep -i "offering\|authentications that can continue"
Se nenhuma aparecer, indique a chave explicitamente com ssh -i ~/.ssh/id_ed25519 user@server ou confira o IdentityFile em ~/.ssh/config.
Verificação 2: permissões da chave privada, no cliente
ls -l ~/.ssh/id_ed25519
Qualquer coisa diferente de -rw------- (600) exige chmod 600 ~/.ssh/id_ed25519.
Verificação 3: permissões e conteúdo no servidor
ssh user@server 'ls -ld ~ ~/.ssh; ls -l ~/.ssh/authorized_keys; wc -l ~/.ssh/authorized_keys'
Se o diretório home, o ~/.ssh ou o authorized_keys estiver gravável por grupo ou por outros, o sshd ignora a chave.
Correção
- Volte as permissões para
700/600 - Execute o
ssh-copy-idnovamente - Se ainda falhar, leia o motivo no servidor com
sudo journalctl -u ssh -n 30(-u sshdem sistemas da família RHEL)
5. Gerenciar Conexões com ~/.ssh/config
Quando os destinos começam a se multiplicar, use o ~/.ssh/config. Ele permite salvar host, usuário e arquivo de chave sob um alias curto.
vim ~/.ssh/config
Exemplo de configuração:
Host myserver
HostName 192.168.1.100
User ubuntu
IdentityFile ~/.ssh/id_ed25519
Port 22
Host staging
HostName staging.example.com
User deploy
IdentityFile ~/.ssh/id_ed25519Após salvar, conecte-se apenas com ssh myserver.
chmod 600 ~/.ssh/config
Se o ~/.ssh/config estiver gravável por grupo ou por outros (664, por exemplo), o ssh exibe Bad owner or permissions on /home/user/.ssh/config e aborta a conexão, em vez de seguir em silencio. Mantenha em 600.
6. Gerenciar Passphrases com ssh-agent
ssh-agent mantém sua chave descriptografada na memória para que você digite a passphrase apenas uma vez por sessão. A chave fica somente na memória e desaparece quando você encerra a sessão.
# Iniciar o agente eval "$(ssh-agent -s)" # Adicionar sua chave (digite a passphrase uma vez) ssh-add ~/.ssh/id_ed25519
Identity added: /home/user/.ssh/id_ed25519 (your_email@example.com)
Listar chaves registradas:
ssh-add -l
No macOS, o Keychain do sistema integra-se com o ssh-agent. Adicione UseKeychain yes e AddKeysToAgent yes ao ~/.ssh/config para persistir as chaves entre reinicializações.
Resumo
| Comando | Finalidade |
|---|---|
ssh-keygen -t ed25519 |
Gerar par de chaves (ED25519) |
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server |
Implantar chave pública no servidor |
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys |
Corrigir permissões de diretório e arquivo |
ssh -v user@server |
Testar conexão com saída detalhada |
eval "$(ssh-agent -s)" && ssh-add |
Cachear passphrase para a sessão |