Revista Informática

Cómo crear un segundo factor de autenticación en ssh

Publicado el 30 marzo 2016 por Drassill
Tras una semana santa de desconexión tecnológica total, hoy vuelvo con algo muy curioso que estoy seguro que os resultará útil. Más de una vez he comentado que las contraseñas "planas" están destinadas a desaparecer o evolucionar, ya que han demostrado ser altamente inseguras... La mejor opción (en mi opinión) es recurrir a métodos de autenticación basados en claves pública y privadas, como se hace muy a menudo para accesos seguros SSH, pero esa solución es muy técnica y no es cómoda para todos los usuarios, con lo que hoy vengo a hablaros de una alternativa muy popular que es usada también en otras plataformas, tales como el acceso a la cuenta de Google: Se trata de la autenticación en dos pasos, también conocida como segundo factor de autenticación.
Portada_authenticator
La autenticación en dos pasos, no es ni más ni menos que un recurso que tras introducir la clave del usuario, obliga a éste a introducir una segunda clave; clave que únicamente posee un dispositivo móvil y que es completamente aleatoria. Además dicha clave "extra" cambia tras pasar unos segundos, con lo que a menos que se posea el móvil en cuestión y se tenga la clave "habitual" del usuario, es muy complicado tener acceso a la cuenta protegida mediante dicho método. Imaginemos que alguien ha obtenido la contraseña de nuestro usuario... Éste no podría acceder a nuestra cuenta gracias a esta medida extra de seguridad, ya que solamente el dueño del móvil tendría la segunda clave en su poder, lo que hace que esta medida de seguridad sea muy interesante. Aunque hoy centraremos dicha funcionalidad en las conexiones ssh, podemos ver en la actualidad múltiples aplicaciones y/o servicios que contienen dicha medida de seguridad, con lo que en caso de tener la posibilidad de activar el segundo factor de autenticación en alguna cuenta y/o servicio web es muy recomendable hacerlo.
Para lograr el segundo factor de autenticación en conexiones SSH necesitaremos instalar Google Authenticator tanto en nuestro móvil como en el equipo que queremos salvaguardar. Para el primero con tan solo descargarlo del Play Store sería suficiente, pues es una aplicación gratuita que no tiene complicación alguna para instalarla... En cuanto a la instalación del la herramienta en el servidor, al ser una utilidad "poco habitual", no se encuentra dentro de los repositorios oficiales... Pero no pasa nada, ya que podemos obtenerla gracias al conocido git; si bien antes son necesarios instalar algunos paquetes; paquetes que en este caso sí que estarían incluidos en los repositorios. Estos paquetes serían ntp, make, gcc y libpam0g-dev:
apt-get install git ntp makegcc libpam0g-dev
Además de forma opcional podemos instalar qrencode, cosa que (en mi opinión) es bastante recomendable:
apt-get install qrencode
Con los requisitos cumplidos, ahora podemos obtener los paquetes relacionados con Google Authenticator; la URL en la que están alojados los paquetes sería https://github.com/google/google-authenticator, así que la operación para descargar e instalar esta utilidad sería la siguiente:
  1. mkdir /usr/src/2FA
  2. cd /usr/src/2FA
  3. git clone https://github.com/google/google-authenticator
  4. cd google-authenticator/libpam
  5. make & make install

Con esto la librería que trabaja con Google Authenticator estaría disponible, pero no activada... La librería está relacionada con los módulos PAM (Pluggable Authentication Modules); en concreto con el módulo PAM de ssh, el cual es /etc/pam.d/sshd. Hablar sobre PAM requeriría un post entero, ya que es algo muy completo y complejo, pero se podría decir a groso modo que el módulo PAM, sshd, se encargaría de gestionar las tareas de autenticación relacionadas con las conexiones ssh. En dicho módulo tenemos dos posibilidades:
  • Hacer que sea 100% necesario interactuar con el módulo de google en TODAS las conexiones ssh. Esto lo lograríamos ejecutando este comando:
echo'auth required pam_google_authenticator.so'>>/etc/pam.d/sshd
  • Hacer que se ejecute el segundo factor de autenticación únicamente en las cuentas preparadas para ello; es decir en cuentas que soporten dicha funcionalidad debido a que se ha creado una clave secreta que se usa para sincronizarse con el móvil. Generalmente es más recomendable esta opción ya que esto no nos obligaría a crear claves en todas las cuentas con acceso por ssh, sino que solamente aquellas que nosotros queramos.

echo'auth sufficient pam_google_authenticator.so'>>/etc/pam.d/sshd
Por motivos de compatiblidad con la modificación realizada en este módulo, es necesario también modificar el comportamiento del servicio ssh; en concreto sería necesario modificar el parámetro ChallengeResponseAuthentication. Este parámetro se encontraría dentro del fichero /etc/ssh/sshd_config y su valor por defecto sería "no"; aunque generalmente dicho valor no da problemas, en este caso habría que cambiar su valor a "yes" para que el módulo de google funcione correctamente, con lo que el valor quedaría tal que así:
ChallengeResponseAuthentication yes
Obviamente, para aplicar los cambios realizados en la configuración del servicio ssh habría que reiniciarlo:
/etc/init.d/ssh restart
Ahora únicamente habría que configurar las cuentas en las que queramos aplicar el segundo factor de autenticación; la sintaxis para hacerlo sería:
su - usuario -c /usr/local/bin/googe-authenticator
Por ejemplo para el usuario ivan sería:
su - ivan -c/usr/local/bin/googe-authenticator
Tras responder sí a todas las preguntas que nos vaya lanzando el comando habremos generado lo siguiente:
  • Una URL en la que podremos visualizar un código QR legible desde el móvil.
  • El mismo código QR en la consola en caso de haber instalado qrencode.
  • La clave que tendremos que introducir en el Google authenticator del móvil en caso de no tener lector de códigos QR.
  • El código de verificación que irá cambiando cada poco segundos.
  • Una lista de claves de emergencia que se pueden usar en caso de haber perdido el móvil.

Supongamos que tenemos la capacidad de leer el código QR, ya sea con la URL o mediante el QR mostrado en la terminal; solo habría que coger el móvil y abrir Google Authenticator; después tan solo habría que seleccionar la opción Seleccionar código de barras y leer el código QR.
ga1Pantalla principal Google Authenticator sin configurar
ga2
Configuración de nueva cuenta
Una vez sincronizados el smartphone y el equipo, veremos un código que cambia cada 30 segundos junto con el nombre del equipo con el que nos hemos sincronizado. Ahora si nos logueamos al equipo en cuestión por ssh, veremos que tras introducir la contraseña, nos pedirá un código de verificación; dicho código sería el mostrado en el smartphone:
codigo_verificacion
Con esto ya tendríamos un entorno con un segundo factor de autenticación perfectamente funcional.
Espero que os haya resultado útil.
Saludos.

Volver a la Portada de Logo Paperblog