Configuração de Autenticação por Chave SSH - Login Seguro sem Senha

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_keys
  • ssh-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)

  1. Execute ssh-keygen -t ed25519 para gerar um par de chaves
  2. Execute ssh-copy-id user@server para implantar a chave pública
  3. 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ões 600. Este arquivo fica na sua própria máquina.
  • id_ed25519.pub (chave pública): é ela que você adiciona ao ~/.ssh/authorized_keys no servidor.

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"

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

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

  1. Mantenha aberta a sessão SSH atual. Não a feche
  2. Em outro terminal, abra uma nova sessão e confirme que o login por chave funciona
  3. Só então altere a configuração e execute sudo systemctl reload ssh (sshd em sistemas da família RHEL)
  4. 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

  1. Volte as permissões para 700 / 600
  2. Execute o ssh-copy-id novamente
  3. Se ainda falhar, leia o motivo no servidor com sudo journalctl -u ssh -n 30 (-u sshd em 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_ed25519

Apó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

Próximas Leituras