terça-feira, 18 de novembro de 2014

Configurando Autenticação em 2 Passos no CentOS 6

Introdução


Autenticação em 2 passos é aquele processo que além do seu usuário e senha tradicionais é solicitado um código validador adicional. Esse código validador pode ser enviado por SMS, gerado por algum programa ou gerado por token.

A cada intervalo de tempo, geralmente 30s, um novo código é gerado e o código anterior é invalidado.

Então mesmo que uma pessoa conheça seu usuário e senha, provavelmente ela não conseguira ter acesso ao sistema se não tiver o código validador daquele exato momento, aumentando a segurança no acesso do servidor.

Nesse artigo vamos mostrar como configurar a autenticação em 2 passos para conexões via SSH no servidor e utilizaremos para isso a libpam google-authenticator.

O Google Authenticator implementa tokens de segurança TOTP (timebased one-time-password) de acordo com a RFC6238 via o aplicativo de celular Google Authenticator. O Authenticator fornece um código de 6 dígitos que deverá ser fornecido juntamente com o usuário e senha no login, que geralmente é chamado de autenticação em dois passos.

Sincronização do relógio


Os tokens de segurança TOTP são algoritmos sensíveis ao tempo, ou seja, é necessário que o relógio das várias máquinas envolvidas no processo de criação do token e validação do mesmo estejam com seus relógios sincronizados.

Algumas implementações possuem uma tolerância para permitir que pequenas diferenças entre os relógios não afetem a validação do código.

Então a primeira etapa desse processo é habilitar o serviço ntpd no servidor e garantir que o mesmo suba sempre que o servidor for reiniciado.
sudo service ntpd start
sudo chkconfig ntpd on

Instalação do google-authenticator


Teremos que baixar o código fonte do google-authenticator e compilá-lo. Para isso vamos instalar antes alguns pacotes necessários.
sudo yum install make gcc pam-devel
Baixe o código fonte do google-authenticator. 
cd /tmp
wget https://github.com/google/google-authenticator/archive/master.zip
unzip master.zip
cd google-authenticator-master/libpam
Agora compile e instale as libs.
sudo make
sudo make install
O "make install" basicamente copiará dois arquivos:
  • a lib pam_google_authenticator.so para /lib64/security
  • o executável google-authenticator para /usr/local/lib

Configurando o Google Authenticator


Antes de configurar o SSH, vamos primeiro configurar o google authenticator para um usuário. As etapas desse processo serão basicamente:
  1. logar com o usuário;
  2. executar o programa google-authenticator;
  3. responder as perguntas.
su - kleyson
$ google-authenticator
Do you want me to update your "~/.google_authenticator" file (y/n) y
 
https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/user@server%3Fsecret%3DABCD12E3FGHIJKLMN
Your new secret key is: ABCD12E3FGHIJKLMN
Your verification code is 98765432
Your emergency scratch codes are:
  01234567
  89012345
  67890123
  45678901
  23456789
 
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) y
 
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
Essas configurações serão gravadas dentro do diretório home do usuário no arquivo "~/.google-authenticator". 

Guarde em algum lugar seguro os dados mostrados na tela:
  • secret key
  • verification code
  • emergency codes
Os "emergency codes" poderão serem utilizados como emergência em momento que você precise logar no servidor e por alguma razão seu smartphone não esteja com você. Por isso a necessidade de guardar esses códigos em algum lugar seguro.

Instalando e Configurando o Google Authenticator app


Entre na loja de aplicativos oficial do seu smartphone e procure pelo aplicativo "Google Authenticator" que é disponibilizado pela própria Google e faça a instalação do mesmo.

No processo de configuração do google-authenticator para o usuário, foi gerado e mostrado na tela uma URL. Abra a respectiva URL no seu navegador. Deverá ser exibido um QR code.

Esse QR code é gerado baseado no "secret key" gerado anteriormente.

Agora abra o Google Authenticator no seu smartphone. Na tela terá o ícone de um lápis, clique nele e depois clique no ícone de um "+" para adicionar uma nova entrada.

Escolha a opção "Ler código de barras" e aponte a câmera para o QR code no navegador. O app então deverá incluir uma nova entrada e começara a gerar um novo código a cada 30s.

Se por algum motivo não conseguir utilizar a opção "Ler código de barras" selecione a opção "Inserir manualmente". Insira então um nome para a "Conta" e sua "secret key" e confirme.

Você não deverá ter problema de sincronia da hora, pois a hora dos nossos celulares são sincronizados com a operadora, que com certeza devem estar sincronizados com algum servidor NTP.

OBS.: As instruções acima foram baseadas no aplicativo do iphone.

Configurando o PAM


Vamos agora configurar o PAM do SSH para utilizar a lib do google authenticator. Edite o arquivo "/etc/pam.d/sshd" e adicione no topo do arquivo a linha "auth required pam_google_authenticator.so".
sudo vi /etc/pam.d/sshd
#%PAM-1.0
auth required pam_google_authenticator.so
auth required pam_sepermit.so
auth include password-auth
account required pam_nologin.so
account include password-auth
password include password-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session required pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the
user context
session required pam_selinux.so open env_params
session optional pam_keyinit.so force revoke
session include password-auth 
Com essa configuração todos usuários que tentarem logar via SSH será solicitado um código de verificação.

Caso queira exigir autenticação em 2 passos apenas para usuários que tenham o google authenticator configurado para suas contas (se o arquivo ~/.google_authenticator existir), então inclua o comando "nullok" na configuração do pam.
#%PAM-1.0
auth required pam_google_authenticator.so nullok
auth required pam_sepermit.so
auth include password-auth
account required pam_nologin.so
account include password-auth
password include password-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session required pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the
user context
session required pam_selinux.so open env_params
session optional pam_keyinit.so force revoke
session include password-auth 
A ordem que você inclui essa configuração é importante. Dado essa configuração, primeiro será solicitado a você o código de verificação do google authenticator para então depois solicitar a senha do usuário.

Configurando o SSH


Edite o arquivo "/etc/ssh/sshd_config" e verifique as seguintes configurações:
PasswordAuthentication yes
ChallengeResponseAuthentication yes
UsePAM yes
Reinicie o SSH.
service sshd restart
Pronto! Agora quando você logar via SSH no servidor com um usuário que tenha google authenticator configurado para sua conta, você terá que entrar primeiramente com o código de verificação, que é exibido pelo Google Authenticator app, e apenas depois entrar com a senha do usuário.


Possíveis Erros


Se você tiver algum problema verifique os arquivos de log, principalmente o "/var/log/secure".

Se você tiver SELinux ativo, talvez você não consiga logar e o seguinte erro pode ser gerado no "/var/log/secure" .
Jan  3 23:42:50 hostname sshd(pam_google_authenticator)[1654]: Failed to update secret file "/home/username/.google_authenticator"
Jan  3 23:42:50 hostname  sshd[1652]: error: PAM: Cannot make/remove an entry for the specified session for username from 192.168.0.5
Nesse caso tente desativar o SELinux.

Para mais informações sobre esse problema veja aqui.

Bypass o google authenticator se o logon é da rede local


Se você confia nos sistemas da sua rede local, podemos então desativar o google authenticator para os logons SSH originados na sua rede local.

Edite o arquivo "/etc/pam.d/sshd" e o deixe parecido com a configuração abaixo:
auth [success=1 default=ignore] pam_access.so accessfile=/etc/security/access-local.conf
auth       required     pam_google_authenticator.so
Então crie o arquivo "/etc/security/access-local.conf" com a configuração abaixo:
# Google Authenticator can be skipped on local network
+ : ALL : 192.168.0.0/24
+ : ALL : LOCAL
- : ALL : ALL
Assumindo que o endereço da sua rede local é 192.168.0.0/24.

Referências



Sites que utilizei como referências para as respectivas configurações.

Two-Step Authentication for SSH on CentOS 6 Using Google Authenticator
google-authenticator


Abraços.

Nenhum comentário: