06 enero 2011

Contraseñas de un solo uso en Linux

OTP son las siglas de 'One Time Password' es decir, contraseñas de un solo uso. Habitualmente empleadas en entornos con elevados requerimientos de seguridad, fueron popularizadas a través de los tokens 'RSA SecureID' como herramientas para hacer logins empleando factor doble de autenticación.

Groso modo, el sistema funciona de la siguiente manera:
  • No existe un concepto de contraseña inmutable 
  • Cada vez que se quiera acceder al sistema se necesita una contraseña nueva
Es decir, en cada momento el servidor espera una contraseña que va cambiando de forma que si esa contraseña fuera interceptada, apenas serviría para un corto periodo de tiempo.

Existen varias implementaciones de OTP, en este caso vamos a usar Mobile-OTP ya que se integra perfectamente en el subsistema PAM de linux y además tiene clientes para Iphone, Android o Windows mobile.

Mobile-OTP es bastante sencillo y funciona de la siguiente manera:
  1. El cliente genera el valor de md5(PIN+SECRET+TIME)
  2. Envía el valor al servidor
  3. El servidor calcula el valor de md5(PIN+SECRET+TIME) en un intervalo de 3 minutos hacia atrás
  4. Si el valor suministrado por el cliente coincide con alguno de los generados por el servidor, la autenticación será positiva
Para instalarlo necesitamos dos cosas, un cliente para generar las contraseñas y el módulo PAM para el servidor.

Como cliente, podemos usar cualquiera de los disponibles para teléfonos móviles (interesante tener el generador de tokens en el móvil) o bien un sencillo cliente hecho en Javascript que podemos ejecutar en casi cualquier navegador (e instalarlo en nuestro servidor).


Para el servidor descargamos el módulo PAM desde aquí y lo compilamos de la forma habitual:

# make

Si todo ha ido bien (necesitarás pam-devel instalado en tu sistema) se habrá creado el fichero pam_mobile_otp.so que debemos copiar en /lib/security/

# cp pam_mobile_otp.so /lib/security/

Después de eso copiamos el fichero de configuración con el listado de usuarios + PIN + Token:

# cp motp.conf /etc/security/

Un ejemplo de fichero de configuración para tener acceso OTP para el usuario root sería el siguiente:

# cat /etc/security/motp.conf

root    1234567890abcdef        1234    0

Lo que significa que el PIN del usuario root es 1234 (el módulo PAM tiene una limitación de 4 caracteres en el PIN) y su semilla 1234567890abcdef. Estos datos deben ser cambiados en tu instalación.

Con esto hecho, procedemos a configurar el servicio SSH para que acepte esta nueva fórmula de autenticación editando /etc/pam.d/sshd dejándolo así:

#%PAM-1.0

auth  sufficient /lib/security/pam_mobile_otp.so not_set_pass
password required /lib/security/pam_mobile_otp.so debug
account required /lib/security/pam_mobile_otp.so

auth       required     pam_sepermit.so
auth       include      system-auth
account    required     pam_nologin.so
account    include      system-auth
password   include      system-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      system-auth

Con esta configuración seguimos aceptando autenticación 'normal' basada en contraseña mapeada en /etc/shadow y además passwords OTP. Si únicamente pretendemos aceptar contraseñas OTP podemos modificar /etc/pam.d/sshd

Una vez configurado el servidor, si volvemos a la pagina web generadora de contraseñas, podemos rellenar los campos

PIN --> 1234
Secret --> 1234567890abcdef

y nos dará como respuesta una contraseña temporal para acceder con el usuario root al sistema vía SSH.

Notas: Esta configuración ha sido probada en una Fedora Core 11. Es MUY IMPORTANTE que la hora del cliente y la del servidor estén sincronizadas, de lo contrario las contraseñas temporales NO funcionaran, asegúrate que el comando

# date +%s

devuelve valores parecidos en cliente y servidor

10 comments :

AdultDivx dijo...
Este comentario ha sido eliminado por el autor.
AdultDivx dijo...

Muy interesante articulo.....

Gonzalo Asensio dijo...

Articulo contundente, sencillo, directo y muy práctico. Gracias Yago!

Anónimo dijo...

Yo lo tengo de otra forma...
- El cliente, mediante acceso WEB a una página, solicita acceso por n minutos (lo que estime)...
- El server le envía a su móvil el password que le dará acceso por n minutos, sólo para la IP desde donde lo pidió.
- El cliente se conecta al REALM con el password que ha recibido en el móvil...
- Si acaba antes, el cliente puede cancelar la sesión en cualquier momento.

=;-)

FErArg dijo...

Muy buen artículo, una capa extra de seguridad.

Ya lo estoy probando en una VM para implementar en los servers.

Muchas Gracias

RoMaNSoFt dijo...

Alguna vez hice alguna prueba con OPIE y también me funcionó bien. Algo del estilo a:
http://www.delta-xi.net/index.php?/archives/16-OTPs-Using-sKey-with-SSH-via-OPIE.html

¿Has comparado diferentes alternativas? ¿Pros/contras?

Yago Jesus dijo...

@Romansoft no conocía OPIE, gran aporte, me lo apunto para un próximo post. Gracias

RoMaNSoFt dijo...

Alguna vez hice alguna prueba con OPIE y también me funcionó bien. Algo del estilo a:
http://www.delta-xi.net/index.php?/archives/16-OTPs-Using-sKey-with-SSH-via-OPIE.html

¿Has comparado diferentes alternativas? ¿Pros/contras?

FErArg dijo...

Muy buen artículo, una capa extra de seguridad.

Ya lo estoy probando en una VM para implementar en los servers.

Muchas Gracias

borman dijo...

http://quepagina.es/security/contrasenas-de-un-solo-uso.html