SSH Server com Autenticação 2FA

De ISPUP!
Revisão de 17h52min de 11 de julho de 2025 por Gondim (discussão | contribs)
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)
Ir para navegação Ir para pesquisar


Motivação

Recentemente em um treinamento do Patrick Brandão, vimos o quanto o SSH (Secure Shell), pode ser usado dentro da segurança de acesso a sistemas. Desde túneis criptográficos, redirecionamentos de portas e até em uso de Zero Trust. Sabemos o quanto este serviço é importante para nós de Tecnologia da Informação e para Operadores de Redes. Então resolvi escrever esse pequeno artigo de como vocês podem configurar seus servidores GNU/linux para autenticarem SSH usando 2FA com o Google Authenticator. Sim não é nada muito utilizado no nosso dia a dia, pois existem formas melhores e mais seguras como SSH-CA usando certificados digitais assinados e autenticação utilizando apenas chaves SSH. Mas se ainda assim preferirem uma autenticação utilizando usuário e senha, que vocês então implementem um 2FA no serviço SSH.

Ambiente de configuração

Como sou um defensor do Debian GNU/Linux, estaremos efetuando as configurações e testes abaixo em um Debian 12 (Bookworm) mas em teoria, pode ser aplicado em outras distribuições GNU/Linux. Para essa configuração precisaremos instalar apenas um pacote chamado libpam-google-authenticator.

# apt install libpam-google-authenticator

Gerando os códigos de recuperação e o QR Code e/ou chave para cadastro manual do token

Se logue no usuário para o qual vai querer habilitar o token e rode:

$ google-authenticator 

Do you want authentication tokens to be time-based (y/n) y

Ele irá exibir um QR Code para ser lido com o Google Authenticator ou se preferir uma secret key para ser cadastrado manualmente. Nesse momento já temos que ter o Google Authenticator instalado no nosso smartphone.

Abrimos o app no smartphone e pressionamos o sinal de +. Na sequência escolhemos ler o QR Code ou inserir a chave que seria aquela secret key.

Após escolhermos o QR Code, irá abrir a câmera do seu smartphone. Aponte para o QR Code e será configurado o token.

Abaixo temos o token sendo gerado.

Voltamos para o nosso servidor e agora passamos o token para a aplicação, para efetuarmos a confirmação da configuração:

Após confirmar, serão exibidos os 5 códigos de recuperação de emergência. Eles são importantes para recuperar os acessos caso perca seu smartphone. Cada código de recuperação só poderá ser usado uma única vez.

Se precisar consultá-los, eles ficam armazenados no home do usuário no arquivo .google_authenticator:

Na sequência ele irá perguntar se deseja proibir uso de múltiplo login, por segurança dizemos que sim. Depois ele pergunta sobre criação de tokens extras para compensar problemas de horários não sincronizados entre o cliente e o servidor. Nesse caso vamos dizer que não, porque é função nossa como sysadmin, configurar ajuste automático de horário no servidor usando NTP (Network Time Protocol). Por último aplicamos um rate-limit no nosso sistema para 3 tentativas a cada 30 segundos.

Configurando o sistema de autenticação do SSH para funcionar com o Google Authenticator

Em /etc/ssh/sshd_config vamos modificar o parâmetro abaixo de NO para YES:

KbdInteractiveAuthentication yes

Em versões antigas do openssh-server o parâmetro era este abaixo:

ChallengeResponseAuthentication yes

Reinicie o serviço SSH:

# systemctl restart sshd

Na sequência edite o arquivo /etc/pam.d/sshd e adicione no final dele a instrução:

auth required pam_google_authenticator.so

Cuidado! Não desconecte do servidor antes de testar se está funcionando ou que tenha acesso via console.

Para testarmos só fazermos um ssh para o servidor e irá acontecer algo como abaixo. Será pedida a senha do usuário e na sequência também será pedido o code do token gerado pelo Google Authenticator. Acertando os dois, a sessão é completada.

# ssh [email protected] 
([email protected]) Password: 
([email protected]) Verification code: 
Linux AMA-RR-FLOW-01 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (2025-05-22) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
You have new mail.
Last login: Fri Jul 11 01:40:37 2025 from 177.XXX.XXX.30
gondim@AMA-RR-FLOW-01:~$

Se quiser aplicar o mesmo bloqueio na console do servidor, basta incluir a mesma configuração só que em /etc/pam.d/login. Mas cuidado para não perder o acesso ao sistema. Não me responsabilizo por problemas gerados por este artigo.  :)