Como habilitar autenticação de 2 fatores baseada em OATH/TOTP no FreeBSD usando o Google Authenticator

O processo para habilitar o uso no FreeBSD de autenticação de 2 fatores baseada em OATH/TOTP é bastante simples, e consiste basicamente em instalar o app Google Authenticator no seu smartphone (iPhone ou Android), e instalar/habilitar o suporte ao mesmo no seu servidor configurando a biblioteca PAM do mesmo.

A forma mais simples de fazer a instalação do Google Authenticator no FreeBSD é através do sistema de ports, para isto basta executar os seguintes comandos, estando logado como root:

# cd /usr/ports/graphics/libqrencode/ 
# make install clean distclean 
# cd /usr/ports/security/pam_google_authenticator/ 
# make install clean distclean 

O Google Authenticator pode lhe fornecer códigos de verificação baseados em tempo ou baseados em eventos, para evitar que tenha problemas de sincronismo (o que lhe impedirá de logar no seu servidor) eu recomendo que você opte por gerar códigos de verificação baseados em tempo.

Desta forma, antes de iniciar a configuração certifique-se que o seu servidor está com a hora correta, a melhor forma de fazer isso é configurando o mesmo para sincronizar seu relógio com um servidor de tempo.

Para acertar o relógio manualmente execute o comando abaixo:

# /usr/sbin/ntpdate pool.ntp.br  
30 Jun 12:53:13 ntpdate[19012]: adjust time server 200.186.125.195 offset -0.285356 sec 

A melhor forma de prevenir que o horario do seu servidor fique fora de sincronia no futuro é automatizar a execução periódica do comando acima, para isto basta inserir uma tarefa no cron do usuário root.

Para agendar a execução todo dia a meia noite, adicione linha abaixo ao crontab do usuário root, usando o comando crontab -e

0 0 * * * /usr/sbin/ntpdate pool.ntp.br 

O próximo passo será configurar o uso do OATH/TOTP para o seu usuário, se você habilitar o uso da autenticação de 2 fatores no PAM antes de efetuar a configuração do seu usuário você estará correndo o risco de ficar impossibilitado de logar novamente.

Desta forma abra uma nova sessão com o seu usuário comum, e gere a configuração do seu token usando o comando (as respostas para as perguntas do aplicativo estão em verde):

$ google-authenticator

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

https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/tutorial01@Server01.fug.com.br%3Fsecret%3DGB5UNIM7EASZ3DMD



Your new secret key is: GB5UNIM7EASZ3DMD
Your verification code is 257156
Your emergency scratch codes are:
76825020
28509132
89057228
46743555
15753001

Do you want me to update your "/home/tutorial01/.google_authenticator" file (y/n) y

Do you want to disallow multiple uses of the same authentication
token? This restricts you to one login about every 30s, but it increases
your chances to notice or even prevent man-in-the-middle attacks (y/n) y

By default, tokens are good for 30 seconds and in order to compensate for
possible time-skew between the client and the server, we allow an extra
token before and after the current time. If you experience problems with poor
time synchronization, you can increase the window from its default
size of 1:30min to about 4min. Do you want to do so (y/n) n

If the computer that you are logging into isn't hardened against brute-force
login attempts, you can enable rate-limiting for the authentication module.
By default, this limits attackers to no more than 3 login attempts every 30s.
Do you want to enable rate-limiting (y/n) y
$

O aplicativo irá nos perguntar se queremos usar códigos de verificação baseados em tempo, devemos responder que sim. Se vc responder que não ele irá gerar uma configuração para tokens baseados em eventos.

Após responder está primeira pergunta o software irá exibir uma url a qual você poderá abrir no seu navegador para visualizar o qrcode necessário para a configuração do app no seu smartphone.

O qrcode também será exibido na sua tela, mesmo que você esteja executando a configuração em um terminal texto, exatamente como mostrado no exemplo acima. Fica a seu critério se vai usar a imagem que vai aparecer no terminal ou se vai gerá-la novamente a partir da URL. Para configurar o app é muito simples, basta clicar no botão “ADD”, e apontar a câmera do seu celular para a imagem 😉

Logo abaixo da imagem vai ser exibido a secret key do seu token, guarde-a em um local seguro para o caso de precisar reconfigurar o seu APP.

O software também irá fornecer uma lista com 5 códigos de emergência, os quais podem ser utilizados uma unica vez cada. Guarde-os em  um local seguro, você  irá precisar deles para validar seu acesso ao seu servidor caso tenha problemas com o seu smartphone.

Recomendo que você responda com “Yes” a pergunta seguinte,  com isso os seus tokens não poderão ser reutilizados e um novo token será gerado a cada 30 segundos.

Por default cada token gerado pode ser usado por até um minuto depois da sua geração, sendo que pode existir uma diferença de horário entre o smartphone e o servidor de até 30 segundos para mais ou para menos. Para aceitar essa janela de sincronismo responda “No” na próxima pergunta, caso queira trabalhar com uma janela de 4 minutos (2 minutos para mais ou para menos), basta responder com “Yes”.

A ultima pergunta lhe da a opção de impor um limite de 3 tentativas de login a cada 30 segundos, o que tem por objetivo dificultar um eventual ataque de força bruta. Recomendo habilitar esta opção, respondendo com “Yes”.

Agora que você já configurou o seu token, podemos prosseguir com a configuração do servidor e habilitar esta modalidade de autenticação no serviço desejado.

Por exemplo, para habilitar o uso do token OATH/TOTP com o serviço de SSH basta editar o arquivo /etc/pam.d/sshd de forma que as entradas do tipo auth fiquem idênticas as mostradas abaixo:

auth requisite pam_unix.so no_warn try_first_pass
auth requisite /usr/local/lib/pam_google_authenticator.so

Depois de editar o arquivo de configuração do PAM referente ao serviço de SSH, basta reiniciar o serviço com o comando abaixo

# /etc/rc.d/sshd restart

E pronto 🙂

Agora sempre que você for se logar por SSH no seu servidor você terá que digitar a sua senha, e se acertá-la será solicitado que digite o código de verificação que será exibido no app no seu smartphone.

O código de verificação não será solicitado se você errar a sua senha, e mesmo que vc digite a senha correta se você não digitar um código de verificação válido você não irá conseguir se logar.

O processo de login com sucesso vai ser semelhante ao mostrado abaixo:

Using username "tutorial01".
Password: ************
Verification code: ******
Last login: Fri Jun 29 22:50:24 2012 from 189.120.xxx.yyy

Vc pode habilitar o uso do token em qualquer serviço que faça uso do PAM, caso queira habilitar o uso do token por exemplo no login ao console do seu servidor, vc deve editar o arquivo /etc/pam.d/system e alterar a linha:

auth   required   pam_unix.so   no_warn try_first_pass nullok

e mudar a opção “required” para “requisite” e adicionando a chamada a biblioteca do google authenticator, como mostrado abaixo:

auth   requisite   pam_unix.so   no_warn try_first_pass nullok
auth   requisite   /usr/local/lib/pam_google_authenticator.so

Desta forma não será possivel logar no console sem o uso de um código de verificação. Se você optar por habilitar o uso de tokens no acesso via console, lembre-se de configurar o token também para o usuário root.

Boa sorte

[ ]’s Edson

Comments are closed.