SSH Server com Autenticação 2FA

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.
