Por que trocar a senha por chaves
Com o login por senha ligado, qualquer um que alcance a porta SSH do servidor pode ficar tentando adivinhar. O OpenSSH vem assim por padrão: o manual indica que o padrão de PasswordAuthentication é yes. Chaves são muito mais difíceis de adivinhar, e desligar a senha também bloqueia falhas na própria verificação da senha. A falha do OpenSSH no Alpine Linux desta semana é um exemplo: o alerta do Alpine diz que servidores com o login por senha desligado não são afetados.
Você precisa de um usuário no servidor que já consiga acessar, com permissão para usar sudo ou doas.
1. Crie uma chave no seu computador
Rode isto no seu próprio computador, não no servidor:
ssh-keygen -t ed25519
Aperte Enter para aceitar o local padrão e digite uma frase-senhauma senha que protege o próprio arquivo da chave, para que uma cópia roubada do arquivo não baste para entrar. Você ganha dois arquivos na pasta .ssh da sua pasta pessoal: id_ed25519, a chave privada, que nunca sai do seu computador, e id_ed25519.pub, a chave pública, que vai para o servidor.
2. Copie a chave pública para o servidor
No Linux e no macOS:
ssh-copy-id usuario@servidor
Ele pede a sua senha uma última vez e adiciona a chave em ~/.ssh/authorized_keys no servidor. Se o ssh-copy-id não existir, por exemplo no Windows, abra o id_ed25519.pub, copie a única linha dele e cole em ~/.ssh/authorized_keys no servidor. A pasta .ssh deve ser legível só por você (chmod 700 ~/.ssh e chmod 600 ~/.ssh/authorized_keys).
3. Teste a chave antes de mudar qualquer coisa
Deixe a sessão atual aberta. Numa nova janela do terminal, rode ssh usuario@servidor. Se ele pedir a frase-senha da chave, ou entrar direto, a chave funciona. Se pedir a senha da conta, pare e corrija a chave primeiro, senão você vai ficar trancado do lado de fora no próximo passo.
4. Desligue o login por senha
No servidor, acrescente estas duas linhas às configurações do servidor SSH, no arquivo /etc/ssh/sshd_config ou num arquivo novo em /etc/ssh/sshd_config.d/, se o seu sistema usa essa pasta:
PasswordAuthentication no
KbdInteractiveAuthentication no
A segunda linha fecha o outro método parecido com senha, o keyboard-interactiveum método de login em que o servidor faz perguntas, normalmente a senha, por um prompt; o nome antigo da opção é ChallengeResponseAuthentication. Para a conta root, o padrão do OpenSSH, PermitRootLogin prohibit-password, já bloqueia o login por senha.
Existe uma armadilha. O manual diz que, para cada opção, "o primeiro valor obtido será usado". Alguns sistemas, entre eles algumas imagens de nuvem, trazem um arquivo próprio em sshd_config.d com PasswordAuthentication yes, e se esse arquivo for lido primeiro, a sua linha não tem efeito. O passo 6 mostra como descobrir isso.
5. Confira o arquivo e reinicie o serviço
Rode sudo sshd -t. Ele confere a configuração e não mostra nada se estiver tudo certo. Depois reinicie o serviço SSH:
- Debian e Ubuntu:
sudo systemctl restart ssh - Fedora, Red Hat e parecidos:
sudo systemctl restart sshd - Alpine:
rc-service sshd restart
Mantenha a sessão antiga aberta até terminar o próximo passo.
6. Confirme que deu certo
No servidor, rode:
sudo sshd -T | grep -i -E 'passwordauthentication|kbdinteractiveauthentication'
O sshd -T mostra as configurações que o sshd vai realmente usar. As duas linhas devem terminar em no. Se uma disser yes, procure em /etc/ssh/sshd_config.d/ um arquivo que defina essa opção antes.
No seu computador, tente forçar um login por senha:
ssh -o PubkeyAuthentication=no usuario@servidor
O servidor deve recusar com "Permission denied (publickey)". O seu ssh usuario@servidor normal deve continuar funcionando com a chave.
Se algo der errado
Se você perder o acesso, use o console que o seu provedor de hospedagem ou o programa da máquina virtual oferece, desfaça a mudança e reinicie o serviço SSH. É por isso que a sessão antiga fica aberta até o fim. Guarde uma cópia da chave privada num lugar seguro: se você perder a única cópia, vai precisar desse console para adicionar uma chave pública nova.
Fontes
Fontes primárias conferidas para este artigo: