Autenticación de dos pasos en Linux

Hace tiempo Google añadió un sistema de autenticación a las cuentas de GMail consistente en un paso extra: una aplicación de Android sincronizada con la cuenta a través de una clave secreta que nos genera passwords aleatorios cada 30 segundos. Al hacer login en GMail, además de nuestra contraseña deberemos introducir la clave generada por esta aplicación dentro de ese espacio de tiempo.

Gracias a esto, aunque en algún momento alguien consiguiese nuestra clave (o incluso el código temporal que usamos para entrar en ese momento) no podría acceder a nuestra cuenta.

Pues, visto que la idea es buena, ¿por qué no usar esto mismo en Linux?

Para implementarlo necesitaremos dos cosas:

  • Instalar en nuestro móvil Android la aplicación Google Authenticator.
  • Instalar en nuestro Linux el PAM para la autenticación de dos pasos.

Un PAM (Pluggable Authentication Module) es un mecanismo que permite añadir métodos de autenticación al sistema (como por ejemplo sensores biométricos) o personalizarlos estableciendo horas de acceso permitido o desde qué máquinas remotas se puede conectar.

En este caso el PAM que vamos a instalar nos permite establecer una clave temporal que se recicla cada 30 segundos, y que se generará en la aplicación Google Authenticator.

Para instalar el PAM:

sudo apt-get install libpam-google-authenticator

Una vez instalado ejecutamos este comando para configurarlo (debemos ejecutarlo con el usuario con el que querremos acceder posteriormente usando la autenticación de dos pasos):

google-authenticator

Esto nos generará en primer lugar un código QR en la consola (es posible que tengamos que ampliar el tamaño de la ventana de la consola para que se vea entero). En este momento abrimos la aplicación Google Authenticator en el móvil, pulsamos la tecla de menú y seleccionamos “Escanear un código de barras”.

Apuntamos con la cámara al código que tenemos en la pantalla y automáticamente lo reconocerá y añadirá una nueva sección en la pantalla principal de la aplicación con nuestro nombre de usuario, el nombre del PC y debajo el código temporal que se va generando cada 30 segundos.

En la consola nos aparecerá además algo como esto:

Your new secret key is: [secret_key]
Your verification code is [verification_code]
Your emergency scratch codes are:
[code1]
[code2]
[code3]
[code4]

Copiad ese texto que os aparece en algún sitio seguro, sobre todo los cuatro últimos códigos (y preferentemente no en la misma máquina en la que estamos activando la autenticación de dos pasos, ya que si algo fuese mal no podríamos acceder a ellos de forma inmediata).

Esas cuatro claves son claves de un sólo uso que nos permitirán acceder al sistema usándolas en lugar del código generado por Google Authenticator, lo cual es realmente útil si por ejemplo perdemos el móvil o se nos estropea.

A continuación se nos hacen una serie de preguntas:

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

Respondemos “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)

Si somos particularmente paranoicos podemos responder “y”. Esto hará que una clave generada por Google Authenticator sólo pueda ser usada una única vez, y si queremos abrir otro login deberemos esperar otros 30 segundos a que se genere la siguiente clave.

Si no lo tienes claro puedes responder “n” tranquilamente.

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)

La generación de claves aleatorias depende de la sincronización de tiempo entre el programa Google Authenticator y nuestro PC, ya que la clave va asociada a la hora. Si los relojes de nuestro PC y nuestro móvil están iguales o con una diferencia menor de un minuto y medio podemos responder “n” sin problemas.

Si hay más diferencia de tiempo podemos corregir el reloj de uno de los dos dispositivos, o responder “y” aquí para después indicarle un margen de tiempo más amplio (por ejemplo 4 minutos).

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)

Si queremos limitar los intentos fallidos de login a 3 cada 30s responderemos “y” aquí. Si no nos importa que se puedan realizar intentos ilimitados de login responderemos “n”, aunque esto hará el sistema de autenticación más vulnerable a ataques de fuerza bruta.

La opción por defecto está bien, así que ante la duda puedes responder “y” tranquilamente.

Hasta aquí aun no hemos hecho nada que afecte a nuestro login, simplemente hemos configurado las herramientas que nos permitirán a continuación agregar la autenticación en dos pasos a diversas partes del sistema.

ADVERTENCIA:

Aunque este procedimiento ha sido probado, ten en cuenta que la modificación de la configuración de login de tu ordenador es una configuración relativamente crítica. En caso de no realizarla correctamente podrías no ser capaz de hacer login, y si tu carpeta personal está encriptada perderás el acceso a tus datos. 
Esto tiene solución, pero tenlo en cuenta antes de hacer modificaciones.

Tenemos principalmente dos situaciones en las que podemos querer usar este sistema:

1.- La más útil: accesos remotos SSH

Editamos el archivo /etc/pam.d/sshd y añadimos al final esta línea:

auth required pam_google_authenticator.so

Editamos el archivo /etc/ssh/sshd_config y modificamos (si ya existía) o añadimos esta línea de forma que quede así:

ChallengeResponseAuthentication yes

Reiniciamos el servicio sshd:

sudo service ssh restart

Cuando intentemos conectarnos a la máquina por ssh, además de nuestra contraseña veremos que nos pide el código de verificación.

2.- La no tan útil: en el login local de nuestra máquina

Dependiendo de la versión de Linux que usemos, el archivo a editar será uno de estos:

  • /etc/pam.d/gdm
  • /etc/pam.d/lightdm
  • /etc/pam.d/kdm

Abrimos el que corresponda (lo normal es que sólo encontremos uno de ellos) y añadimos esta línea al final del archivo:

auth required pam_google_authenticator.so

Cuando hagamos login veremos que después de haber introducido correctamente el password se nos preguntará el código de verificación:

Como apunte, ¿por qué digo que este segundo uso es el “menos útil”?

La autenticación en dos pasos mantendrá fuera de nuestro PC a cualquiera que no tenga también acceso a nuestro móvil, pero por otra parte tened en cuenta que alguien con acceso físico a nuestro PC, con conocimientos y suficiente tiempo puede arrancarlo desde un LiveCD, entrar en nuestra carpeta de usuario y acceder a la clave privada de autenticación, con lo que podría generar posteriormente sus propios códigos temporales válidos.

Esto no hace que deje de ser útil, pero conviene recordar siempre (no sólo en este caso) que es imposible proteger un ordenador de alguien con acceso físico al mismo.

  • Buenas.

    Me gustaría añadir algo respecto a la seguridad ante atacantes con acceso físico.

    Si tienen acceso local y te has molestado en cifrar el sistema con cryptsetup o similares, esto dificultaría al atacante el acceso al sistema. Al cifrar el sistema raíz (e incluso la swap) y no solo la carpeta personal, evitamos que alguien pueda modificar el sistema con una LiveCD. Recordemos que el cifrado puede realizarse con una SmartCard o una llave USB (más cómoda pero menos segura).

    En conjunción, tendríamos un arranque de sistema cifrado y un inicio de sesión local/remoto con clave estática y un token.

    Si disponemos de un teléfono con el Google Authenticator… este mismo dispositivo podría valer como llave USB para el encendido de la máquina.

  • Pingback: Enrutando tu tráfico a través de SSH | TechCat()