1. O objetivo de um SSH seguro
SSH é a porta de entrada administrativa de muitos servidores. A meta não é esconder a porta nem confiar em um único mecanismo, mas combinar identidade forte, menor privilégio, configuração previsível e observabilidade.
2. Chaves e transição segura
ssh-keygen -t ed25519 -C "admin@empresa"
ssh-copy-id deploy@IP_DO_SERVIDOR
ssh -o IdentitiesOnly=yes deploy@IP_DO_SERVIDORMantenha a sessão atual aberta enquanto testa a nova chave. Só desative senha depois que uma segunda sessão funcionar.
3. Configuração do sshd
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AllowUsers deploy
MaxAuthTries 3
LoginGraceTime 30sudo sshd -t
sudo systemctl reload ssh4. Investigação e rotina
journalctl -u ssh --since today
last -ai
sudo ss -lntpCentralize logs quando houver mais de um servidor. Registre usuário, origem, motivo do acesso e janela de manutenção. Em ambientes maiores, um bastion reduz a quantidade de servidores expostos diretamente.
5. Checklist final
- Chave Ed25519 com passphrase
- Root sem login
- Senha desabilitada após teste
- AllowUsers ou grupo administrativo
- Logs revisados
- Plano de recuperação disponível
6. Troubleshooting
Se uma chave não funciona, confirme permissões de ~/.ssh, o usuário efetivo, o agente carregado e a saída detalhada de ssh -vv. Verifique também se o daemon carregou o arquivo de configuração esperado e se um include não está sobrescrevendo a regra.
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
7. Comandos e diretivas explicados
| Comando | O que faz |
|---|---|
ssh-keygen -t ed25519 -C "admin@empresa" | Gera um par de chaves. -t ed25519 escolhe o algoritmo e -C grava um comentário de identificação. |
ssh-copy-id deploy@IP_DO_SERVIDOR | Instala sua chave pública no ~/.ssh/authorized_keys do servidor. |
ssh -o IdentitiesOnly=yes deploy@IP | Usa só a chave indicada, sem tentar todas as chaves do agente (evita bloqueio por excesso de tentativas). |
sudo sshd -t | Testa a sintaxe do sshd_config sem aplicar nada. |
sudo systemctl reload ssh | Recarrega a configuração sem derrubar as sessões abertas. |
journalctl -u ssh --since today | Lê os logs do serviço SSH de hoje. |
last -ai | Lista os últimos logins, com o endereço IP de origem. |
sudo ss -lntp | Mostra as portas TCP em escuta e o processo de cada uma (-l escuta, -n números, -t TCP, -p processo). |
chmod 700 ~/.ssh | Só o dono acessa a pasta. |
chmod 600 ~/.ssh/authorized_keys | Só o dono lê e escreve o arquivo. |
Diretiva do sshd_config | O que faz |
|---|---|
PermitRootLogin no | Impede login direto como root. |
PasswordAuthentication no | Desativa login por senha, deixando só chaves. |
PubkeyAuthentication yes | Habilita autenticação por chave pública. |
AllowUsers deploy | Só o usuário deploy pode entrar por SSH. |
MaxAuthTries 3 | Máximo de tentativas de autenticação por conexão. |
LoginGraceTime 30 | Segundos para concluir o login antes de a conexão cair. |
8. Exemplo: alterar o SSH sem se trancar para fora
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sudo nano /etc/ssh/sshd_config
sudo sshd -t && sudo systemctl reload ssh
# em OUTRO terminal, antes de fechar o primeiro:
ssh -o IdentitiesOnly=yes deploy@IP_DO_SERVIDORO && garante que o reload só rode se o sshd -t não achar erros. A sessão antiga continua aberta como rede de segurança até o teste em outro terminal dar certo. Se algo falhar, restaure a cópia .bak.
9. Erros comuns e como resolver
| Sintoma | Causa provável | Solução |
|---|---|---|
Permission denied (publickey) | Chave não instalada, permissões erradas, usuário incorreto ou bloqueio por AllowUsers. | Rode ssh -vv, confira as permissões do ~/.ssh e a lista AllowUsers. |
REMOTE HOST IDENTIFICATION HAS CHANGED | O servidor foi reinstalado, ou alguém está interceptando a conexão. | Confirme a impressão digital por outro canal e, se for legítimo, use ssh-keygen -R host. |
O sshd -t mostra erro | Erro de digitação em uma diretiva. | Corrija a linha indicada e teste de novo antes do reload. |
O reload falha dizendo que o serviço não existe | O nome do serviço muda: ssh no Ubuntu e Debian, sshd em outras distribuições. | Use o nome certo com systemctl status ssh ou sshd. |