Guia
Como configurar autenticação SSH com chave pública
Aprenda a criar uma chave SSH, copiá-la para sua VPS, testar o acesso e desativar senhas com segurança no Ubuntu, Debian, AlmaLinux e Rocky Linux via SSH.
Tempo estimado: 15 a 20 minutos
Dificuldade: iniciante
Neste guia, você vai trocar o login SSH baseado em senha por autenticação com chave pública. O procedimento funciona em versões atuais do Ubuntu, Debian, AlmaLinux e Rocky Linux que utilizam OpenSSH.
O que você vai aprender
Ao concluir a configuração, você saberá:
- Criar um par de chaves SSH Ed25519 no computador local.
- Identificar a diferença entre chave privada e chave pública.
- Instalar a chave pública na conta de usuário da VPS.
- Ajustar as permissões exigidas pelo OpenSSH.
- Fazer backup da configuração antes de alterá-la.
- Desabilitar login por senha sem interromper o acesso atual.
- Testar se a VPS aceita a chave e rejeita tentativas por senha.
A chave privada continuará somente no seu computador. A VPS receberá a chave pública, que pode autorizar o acesso, mas não permite reconstruir a parte privada. Esse modelo reduz a exposição a ataques automatizados de força bruta contra senhas.
Pré-requisitos
Você precisa de uma VPS Linux acessível por SSH, uma conta com permissão para executar sudo e a senha atual desse usuário. O computador local pode usar Linux, macOS ou Windows 10 e 11 com o cliente OpenSSH instalado.
Descubra o endereço IP público e o usuário administrativo fornecidos pelo provedor. Nos exemplos, usaremos o IP reservado para documentação 203.0.113.10 e o usuário ubuntu. Substitua esses dois valores pelos dados reais da sua VPS antes de conectar:
export SERVER_IP="203.0.113.10"
export SSH_USER="ubuntu"
Confira se as variáveis foram preenchidas:
printf 'Usuário: %s\nServidor: %s\n' "$SSH_USER" "$SERVER_IP"
A saída deve seguir este formato:
Usuário: ubuntu
Servidor: 203.0.113.10
Mantenha a sessão SSH atual aberta durante todo o procedimento. Abra uma segunda janela de terminal para os testes. Assim, se uma regra estiver incorreta, você ainda poderá corrigir o arquivo pela conexão original.
Caso ainda esteja escolhendo uma máquina, consulte a seleção de melhores VPS no Brasil. Para entender os critérios técnicos usados nas análises, veja como avaliamos serviços de VPS.
Passo 1: Criar uma chave SSH no computador local
Primeiro, confirme que o cliente OpenSSH está disponível no seu computador. Execute este comando localmente, não dentro da VPS:
ssh -V
Você deve receber uma versão semelhante a esta:
OpenSSH_9.6p1, OpenSSL 3.0.13 30 Jan 2024
No Windows PowerShell, a saída também começa com OpenSSH_for_Windows. Se o comando não existir no Ubuntu ou Debian, instale o cliente com sudo apt update && sudo apt install openssh-client. No Windows, ative o recurso Cliente OpenSSH nas configurações de recursos opcionais.
Crie o diretório local que armazenará as chaves e limite seu acesso ao usuário atual:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
Agora gere uma chave Ed25519 dedicada para a VPS:
ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_ed25519_vps -C "$(whoami)@$(hostname)-vps"
O programa solicitará uma passphrase. Use uma frase longa e exclusiva para proteger a chave privada caso seu computador seja perdido ou comprometido. Ao finalizar, a saída será parecida com:
Generating public/private ed25519 key pair.
Your identification has been saved in /home/ana/.ssh/id_ed25519_vps
Your public key has been saved in /home/ana/.ssh/id_ed25519_vps.pub
The key fingerprint is:
SHA256:8YpQm5B3Yc0y2qQpN5uSvrIvnL1F7AC2kX0aLrM9XvE ana@notebook-vps
Confira os arquivos sem exibir o conteúdo da chave privada:
ls -l ~/.ssh/id_ed25519_vps ~/.ssh/id_ed25519_vps.pub
O resultado esperado mostra a chave privada com acesso restrito e a pública legível:
-rw------- 1 ana ana 464 Sep 21 10:15 /home/ana/.ssh/id_ed25519_vps
-rw-r--r-- 1 ana ana 104 Sep 21 10:15 /home/ana/.ssh/id_ed25519_vps.pub
Nunca envie o arquivo id_ed25519_vps para a VPS, por e-mail ou por aplicativos de mensagem. Somente o arquivo terminado em .pub deve ser compartilhado.
Passo 2: Copiar a chave pública para a VPS
Antes de instalar a chave, registre sua impressão digital. Esse identificador ajuda a confirmar posteriormente qual chave foi autorizada:
ssh-keygen -lf ~/.ssh/id_ed25519_vps.pub
A saída terá o tipo ED25519 e uma impressão SHA256:
256 SHA256:8YpQm5B3Yc0y2qQpN5uSvrIvnL1F7AC2kX0aLrM9XvE ana@notebook-vps (ED25519)
Teste o acesso atual por senha antes de alterar qualquer configuração. Esse teste confirma que IP, usuário e porta estão corretos:
ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no "$SSH_USER@$SERVER_IP"
Na primeira conexão, confira a impressão digital do servidor no painel do provedor antes de responder yes. Depois de informar a senha, você deverá ver o prompt remoto, por exemplo:
ubuntu@vps-segura:~$
Digite exit para voltar ao computador local. Em seguida, copie a chave pública usando ssh-copy-id:
ssh-copy-id -i ~/.ssh/id_ed25519_vps.pub "$SSH_USER@$SERVER_IP"
Informe a senha atual quando solicitado. O utilitário deve confirmar a inclusão:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '[email protected]'"
Teste imediatamente a autenticação com a chave específica:
ssh -i ~/.ssh/id_ed25519_vps -o IdentitiesOnly=yes "$SSH_USER@$SERVER_IP"
Você poderá receber uma solicitação da passphrase da chave. Isso acontece no computador local e não é a senha da VPS. Após digitá-la, o prompt remoto deve aparecer sem solicitar a senha da conta Linux.
Dentro da VPS, confirme quem está conectado:
whoami && hostname
Uma saída válida será semelhante a:
ubuntu
vps-segura
Não avance se esse teste falhar. A autenticação por senha ainda será necessária para corrigir o problema, e desabilitá-la agora poderá bloquear seu acesso.
Passo 3: Conferir a chave e corrigir as permissões
Continue conectado à VPS pela chave. O OpenSSH ignora arquivos autorizados quando o diretório .ssh ou o arquivo authorized_keys permite escrita por outros usuários. Por isso, você vai criar um backup e aplicar permissões seguras.
Confirme que o arquivo existe:
ls -la ~/.ssh ~/.ssh/authorized_keys
A saída deve incluir o diretório e o arquivo:
drwx------ 2 ubuntu ubuntu 4096 Sep 21 10:25 /home/ubuntu/.ssh
-rw------- 1 ubuntu ubuntu 104 Sep 21 10:25 /home/ubuntu/.ssh/authorized_keys
Faça uma cópia antes de editar permissões ou conteúdo. Esse comando não remove dados e adiciona data e hora ao nome do backup:
cp -a ~/.ssh/authorized_keys ~/.ssh/authorized_keys.backup.$(date +%Y%m%d%H%M%S)
Verifique se a cópia foi criada:
ls -1t ~/.ssh/authorized_keys* | head
O retorno esperado contém os dois arquivos:
/home/ubuntu/.ssh/authorized_keys.backup.20260921102830
/home/ubuntu/.ssh/authorized_keys
Ajuste o proprietário e as permissões. Os comandos usam a conta conectada, então funcionam mesmo quando o usuário não se chama ubuntu:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R "$(id -un):$(id -gn)" ~/.ssh
Valide os números das permissões com stat:
stat -c '%a %U:%G %n' ~/.ssh ~/.ssh/authorized_keys
No Linux, você deve receber algo semelhante a:
700 ubuntu:ubuntu /home/ubuntu/.ssh
600 ubuntu:ubuntu /home/ubuntu/.ssh/authorized_keys
Confira também se a chave autorizada tem a mesma impressão digital da chave local. Execute na VPS:
ssh-keygen -lf ~/.ssh/authorized_keys
Compare o valor SHA256 com o registrado no passo anterior. Se houver várias chaves, o comando mostrará uma linha para cada entrada válida. Só continue quando reconhecer a impressão da sua chave.
Passo 4: Desabilitar a autenticação por senha
Agora você vai alterar a configuração do servidor OpenSSH. Uma opção incorreta pode impedir novas conexões. Mantenha a sessão atual aberta e confirme mais uma vez, em outro terminal, que a chave funciona.
Na VPS, localize o arquivo principal e confira se ele carrega o diretório de configurações adicionais:
grep -nE '^Include|^[# ]*PasswordAuthentication' /etc/ssh/sshd_config
Em instalações atuais, uma saída comum é:
12:Include /etc/ssh/sshd_config.d/*.conf
57:#PasswordAuthentication yes
Faça backup do arquivo principal e de qualquer configuração anterior com o mesmo nome:
sudo cp -a /etc/ssh/sshd_config /etc/ssh/sshd_config.backup.$(date +%Y%m%d%H%M%S)
sudo test ! -e /etc/ssh/sshd_config.d/99-key-auth.conf || sudo cp -a /etc/ssh/sshd_config.d/99-key-auth.conf /etc/ssh/sshd_config.d/99-key-auth.conf.backup.$(date +%Y%m%d%H%M%S)
Crie o diretório de configuração, caso ele ainda não exista:
sudo install -d -m 0755 /etc/ssh/sshd_config.d
Grave as regras de autenticação:
printf '%s\n' \
'PubkeyAuthentication yes' \
'PasswordAuthentication no' \
'KbdInteractiveAuthentication no' \
'PermitRootLogin prohibit-password' \
| sudo tee /etc/ssh/sshd_config.d/99-key-auth.conf
A saída deve repetir as quatro diretivas:
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-password
PasswordAuthentication no bloqueia senhas comuns. KbdInteractiveAuthentication no também bloqueia desafios de senha via teclado interativo. PermitRootLogin prohibit-password permite chave para root, mas rejeita senha. É mais seguro usar um usuário administrativo comum com sudo.
Confirme o conteúdo antes de recarregar o serviço:
sudo cat /etc/ssh/sshd_config.d/99-key-auth.conf
Se o grep inicial não mostrou uma diretiva Include, não recarregue ainda. Adicione Include /etc/ssh/sshd_config.d/*.conf no início do arquivo principal com um editor, ou aplique as quatro diretivas diretamente no final de /etc/ssh/sshd_config após preservar o backup.
Passo 5: Validar e recarregar o serviço SSH
O OpenSSH possui uma verificação de sintaxe que deve ser executada antes de qualquer recarga. Na VPS, rode:
sudo sshd -t
Sucesso não produz saída. Confira o código de retorno:
echo $?
O resultado esperado é:
0
Se aparecer uma mensagem como Bad configuration option ou Missing argument, não recarregue o serviço. Revise a linha informada ou restaure o backup. Sua sessão atual deve permanecer aberta enquanto você corrige o arquivo.
Confira a configuração efetiva, já considerando arquivos incluídos e possíveis diretivas anteriores:
sudo sshd -T | grep -E '^(pubkeyauthentication|passwordauthentication|kbdinteractiveauthentication|permitrootlogin) '
A saída correta será semelhante a:
permitrootlogin without-password
pubkeyauthentication yes
passwordauthentication no
kbdinteractiveauthentication no
Algumas versões exibem prohibit-password no lugar de without-password. Os dois valores têm o mesmo propósito nesse contexto.
Identifique o nome da unidade do serviço. Ubuntu e Debian normalmente usam ssh, enquanto AlmaLinux e Rocky Linux usam sshd:
if systemctl list-unit-files ssh.service --no-legend 2>/dev/null | grep -q '^ssh.service'; then SERVICE=ssh; else SERVICE=sshd; fi
printf 'Serviço detectado: %s\n' "$SERVICE"
Você verá um dos seguintes resultados:
Serviço detectado: ssh
ou:
Serviço detectado: sshd
Recarregue, sem interromper deliberadamente as conexões existentes:
sudo systemctl reload "$SERVICE"
sudo systemctl is-active "$SERVICE"
O retorno esperado é:
active
Use reload em vez de restart para reduzir o risco de interromper a sessão atual. Mesmo assim, não feche esse terminal. Abra outro e faça os testes finais antes de considerar a alteração concluída.
Verificação e testes
Em uma nova janela do computador local, force o uso da chave criada:
ssh -i ~/.ssh/id_ed25519_vps -o IdentitiesOnly=yes "$SSH_USER@$SERVER_IP"
A conexão deve abrir normalmente. Na VPS, confira o método registrado pelo serviço:
sudo journalctl -u ssh -u sshd --since '5 minutes ago' --no-pager | tail -20
Uma linha típica informa autenticação por chave pública:
Accepted publickey for ubuntu from 198.51.100.25 port 53142 ssh2: ED25519 SHA256:8YpQm5B3Yc0y2qQpN5uSvrIvnL1F7AC2kX0aLrM9XvE
Saia dessa sessão e tente conectar forçando senha, sem oferecer chaves:
ssh -o PubkeyAuthentication=no -o PreferredAuthentications=password,keyboard-interactive "$SSH_USER@$SERVER_IP"
A resposta esperada é uma recusa, não um pedido funcional de senha:
[email protected]: Permission denied (publickey).
Por fim, teste o acesso normal, como você usará no dia a dia:
ssh -i ~/.ssh/id_ed25519_vps "$SSH_USER@$SERVER_IP"
Se quiser evitar a opção -i, crie uma entrada local em ~/.ssh/config com Host, HostName, User, IdentityFile e IdentitiesOnly yes. Confirme primeiro que os dois testes anteriores passaram. Só então encerre a sessão original que ficou aberta durante a configuração.
Troubleshooting
Permission denied (publickey)
Execute o cliente em modo detalhado para descobrir qual chave está sendo oferecida:
ssh -vvv -i ~/.ssh/id_ed25519_vps -o IdentitiesOnly=yes "$SSH_USER@$SERVER_IP"
Procure por Offering public key e Server accepts key. Se a chave não for aceita, volte pela sessão original e confira ~/.ssh/authorized_keys, a impressão digital e as permissões 700 e 600. Confirme também que o arquivo pertence ao usuário correto.
O ssh-copy-id não está disponível
No macOS, instale o utilitário pelo gerenciador de pacotes ou copie a chave por uma conexão SSH existente:
cat ~/.ssh/id_ed25519_vps.pub | ssh "$SSH_USER@$SERVER_IP" 'umask 077; mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys'
Depois, conecte com ssh -i e execute ssh-keygen -lf ~/.ssh/authorized_keys na VPS. O redirecionamento acrescenta a chave e não apaga entradas existentes.
O serviço SSH não recarrega
Verifique a sintaxe e os logs sem fechar a sessão ativa:
sudo sshd -t
sudo journalctl -u ssh -u sshd -n 50 --no-pager
Se o erro começou após a criação do arquivo adicional, compare-o com o backup. Corrija a diretiva indicada e repita sudo sshd -t. Não reinicie a VPS como tentativa de correção, pois ela poderá voltar sem aceitar SSH.
A senha ainda é aceita
Consulte os valores realmente aplicados:
sudo sshd -T | grep -E '^(passwordauthentication|kbdinteractiveauthentication) '
Se algum valor aparecer como yes, procure diretivas concorrentes:
sudo grep -RniE '^[[:space:]]*(PasswordAuthentication|KbdInteractiveAuthentication)' /etc/ssh/sshd_config /etc/ssh/sshd_config.d
Corrija a precedência, valide com sshd -t, recarregue o serviço e repita o teste forçando senha.
Próximos passos
Configure ~/.ssh/config no computador para simplificar a conexão e use ssh-agent para armazenar temporariamente a passphrase. Gere uma chave separada para cada dispositivo, pois isso permite revogar um computador sem substituir todas as credenciais.
Depois, restrinja o firewall à porta SSH usada, mantenha o OpenSSH atualizado e monitore tentativas de acesso nos logs. Não troque a porta como única medida de segurança. Chaves, atualizações e controle de rede oferecem proteção mais consistente.
Se a máquina hospedar aplicações e ambientes de programação, consulte o guia de escolha de VPS para desenvolvedores para relacionar segurança, recursos e fluxo de deploy. Guarde também uma cópia criptografada da chave privada e documente como acessar o console de recuperação do provedor.
Perguntas frequentes
Qual tipo de chave SSH devo usar em uma VPS atual?
Use Ed25519 quando o computador local e o servidor executarem versões atuais do OpenSSH. Esse algoritmo produz chaves pequenas, rápidas e seguras. O comando recomendado é `ssh-keygen -t ed25519 -a 100`, sendo `-a 100` o número de rodadas usadas para proteger a chave privada com a passphrase. Se você precisar integrar sistemas antigos ou equipamentos que não aceitam Ed25519, use RSA com pelo menos 3072 bits. Não use DSA, pois o algoritmo é obsoleto e costuma estar desabilitado nas versões recentes do OpenSSH.
Posso configurar a chave SSH sem usar uma passphrase?
Tecnicamente, sim, mas isso reduz a proteção da chave privada. Sem passphrase, qualquer pessoa ou processo que obtenha o arquivo poderá tentar utilizá-lo imediatamente. Para acesso interativo, prefira uma passphrase longa e use `ssh-agent` para evitar digitá-la em cada conexão. Chaves sem passphrase podem ser necessárias em automações, mas devem ficar em ambientes isolados, ter permissões restritas e usar limitações no `authorized_keys`, como comando permitido, endereço de origem e desativação de encaminhamentos.
Desabilitar PasswordAuthentication impede o uso de sudo?
Não. `PasswordAuthentication no` controla apenas como o servidor SSH autentica novas conexões remotas. O comportamento do `sudo` continua definido pelas políticas locais da VPS e pode solicitar a senha da conta depois que você entra com a chave. Se a conta foi configurada com `NOPASSWD`, o `sudo` não solicitará senha, independentemente do método SSH. Não altere a política do `sudo` apenas para configurar chaves. Primeiro confirme que a conta correta possui privilégios administrativos e mantenha um método de recuperação pelo painel do provedor.
Como revogar a chave de um computador perdido?
Entre na VPS usando outra chave autorizada ou o console de recuperação do provedor. Abra `~/.ssh/authorized_keys`, identifique a entrada pela descrição no final da linha ou pela impressão obtida com `ssh-keygen -lf ~/.ssh/authorized_keys` e remova somente essa linha. Faça um backup do arquivo antes da edição. Depois, mantenha as permissões `600` e teste uma chave alternativa em outra sessão. Se houver suspeita de uso indevido, consulte os logs do SSH, troque credenciais relacionadas e revogue chaves semelhantes em outros servidores.
Por que a VPS ainda pede uma senha depois de instalar a chave?
A solicitação pode ser a passphrase local da chave privada, e não a senha da conta da VPS. Verifique o texto exibido pelo terminal. Se o servidor realmente pedir a senha do usuário, execute `ssh -vvv -i ~/.ssh/id_ed25519_vps -o IdentitiesOnly=yes usuario@ip` e procure as mensagens `Offering public key` e `Server accepts key`. As causas comuns incluem usuário incorreto, chave pública ausente, permissões inadequadas, proprietário errado ou configuração `PubkeyAuthentication no`. Corrija o problema antes de desabilitar senhas para evitar bloqueio.
Devo permitir login direto do usuário root com chave?
Para a maioria das VPS, use uma conta administrativa comum e execute tarefas privilegiadas com `sudo`. Isso melhora a rastreabilidade e reduz a exposição direta da conta `root`. A opção `PermitRootLogin prohibit-password` bloqueia senha para `root`, mas ainda permite uma chave autorizada. Se você não precisa de login direto, pode usar `PermitRootLogin no` depois de confirmar que outro usuário possui `sudo` funcional e acesso por chave. Mantenha uma sessão ativa durante a mudança e conheça o console de recuperação do provedor antes de bloquear completamente o root.
Fontes consultadas
- OpenBSD Manual Pages: ssh-keygen · coletado em 21/09/2026
- OpenBSD Manual Pages: sshd_config · coletado em 21/09/2026
- Ubuntu Server Documentation: OpenSSH server · coletado em 21/09/2026
- Red Hat Enterprise Linux Documentation: Using secure communications between two systems with OpenSSH · coletado em 21/09/2026