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.
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:
- logar com o usuário;
- executar o programa google-authenticator;
- 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 yesReinicie 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.
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.soEntã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 : ALLAssumindo 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:
Postar um comentário