17 años en Internet

26 abril 2011

Login sin passwords, enchufa un lápiz USB como llave :)

Fuente: ubunteate.estrucolinux.com

Navegando por internet me encontré con un interesante how-to para configurar un lápiz USB como si se tratara de una contraseña de login. Básicamente lo que se realiza es la instalación de un módulo en el sistema de autenticación de Linux (pam) y la configuración del susodicho para que nuestro sistema pueda vincular lápices usb a usuarios determinados. Es una idea que tiene bastante utilidad si en casa tienes personas mayores o con problemas de memoria: adios passwords, vinculas un usb para su usuario y santas pascuas ;).

Lo que realiza este módulo (pam-usb) es leer la información privada de un lápiz USB y vincularlos a un usuario. Para ello el módulo extraerá varios datos "ocultos" del lápiz, tales como su fabricante o su número de serie asociado. Esto quiere decir dos cosas: La primera es que por mucho que formatees el dispositivo, siempre podrás realizar el login; La segunda es que incluso si realizan un backup del USB, sólamente el tuyo podrá servir para validar tu usuario.

Instalar esto no quiere decir que ya no pueda emplearse la contraseña de tu usuario, ni mucho menos. Ambos métodos de verificación pueden coexistir, de forma que o insertas el password de tu usuario o insertas el lápiz usb asociado. Bueno, si os interesa pasemos a la acción:

Primero instalaremos el módulo y una serie de herramientas definidas en el paquete pamusb-tools:
sudo apt-get install libpam-usb pamusb-tools
164KB de descarga, no te quejarás ;)


Coge el usb que quieres emplear e insértalo. En una shell ejecuta "sudo pamusb-conf --add-device llave" siendo "llave" el nombre identificativo del dispositivo. Puedes poner el nombre identificativo que quieras.

Esto memorizará los datos del USB dentro del /etc/pamusb.conf. La aplicación te pedirá que confirmes la acción.

Acto seguido vincularemos la llave con nuestro usuario: "sudo pamusb-conf --add-user sebas", siendo "sebas" el nombre de mi usuario. Lógicamente aquí no vas a poner sebas, vas a poner tu usuario =)

Confirma que quieres guardar los cambios en el /etc/pamusb.conf.

Ahora, antes de tocar nada más, vamos a verificar que tu lápiz está correctamente vinculado a tu usuario: "sudo pamusb-check sebas"

Ok, todo perfecto.

Por último vamos a editar la configuración del sistema de autenticación de Ubuntu: "sudo nano /etc/pam.d/common-auth" y añadimos la línea "auth sufficient pam_usb.so". Guarda y sal del archivo (control+o, control+x).



Ok, ya lo tienes todo listo. Reinicia y cuando te salga el GDM inserta tu lápiz usb y haz click en tu usuario. Verás que Gnome te iniciará la sesión sin ni siquiera haberte preguntado el password. Mola, ¿eh? Pues esto no se limita al login de GDM. También te permite loguearte a través de shell:

Login como root sin contraseña, conectando otro lápiz USB ;)


¿Problemas? ¿Errores? Don't panic!
¿Te da problemas el login con GDM? Primero revisa que tu configuración sea correcta. Si no puedes loguearte ni utilizando tu contraseña significa que has escrito alguna errata en los ficheros de configuración. No entres en pánico, coge un LiveCD, monta tu disco duro y revisa los archivos de configuración que tocaste. En el peor de los casos elimina la línea "auth sufficient pam_usb.so" del /etc/pam.d/common-auth".

Si no te funciona el login por USB pero sí por password, revisa el /var/log/auth.log. Ahí deberías de encontrar que es lo que está sucediendo. Pudiera ser que tu Ubuntu no monta los lápices USB cuando estás en GDM, en ubunteate.es explican el siguiente truco para solucionarlo (pero no lo recomiendo por que puede crearte conflictos, como montarte dos veces el mismo dispositivo en Gnome):

El primer paso es identificar la partición correspondiente a la primera unidad de nuestros lápices USB. En una shell haz un "df -h | grep media" y averigua el "/dev/" que tiene asociado tu lápiz.


En mi caso es "/dev/sdb1".

El segundo y último paso es permitir que el lápiz se monte en cualquier momento, independientemente de si estamos logueados o no: echo "/dev/sdb1" >> /etc/pmount.allow. Deberéis de convertiros en usuario root para realizar esta acción, puesto que las redirecciones hacen que el "sudo" se líe:

5 comentarios:

  1. Hace un par de años implementé algo similar en .net para un servicio web de la empresa sonde curraba. Simplemente metias el USB cuando la APP te lo pedia, y te hacia login en el server remoto con rsa y todo el rollo.

    Es un sistema cojonudo tambien cuando el usuario no es unico. Es decir, varios usuarios han de autenticar a una maquina, pero no los conoces a priori. Les das un USB común, y pueden entrar... si contratas a alguien nuevo, solo has de intercambiar el USB.

    ResponderEliminar
  2. Enorme....muy interesante. Lo comparto.

    ResponderEliminar
  3. @Smythsys gracias =)

    @Pau lo que hiciste suena interesante. Entiendo que lo que hacías era guardar la clave pub/rsa dentro del propio lápiz USB. ¿O guardabas esas claves dentro de la máquina y lo que hacía tu solución era vincular los datos del USB con una serie de claves almacenadas en el pc? Cuenta, cuenta, que tengo curiosidad :D

    ResponderEliminar
  4. No no, usaba lo mismo que hace linux. El numero de serie del USB era usado como password en el server, así que al introducir el USB, se negocia la clave privada con RSA entre la APP y el web service. Se manda el ID del USB encriptado al servicio web, y con ese ID, se asigna el token de sesion correspondiente.

    Así autenticas con un ID unico, y sin problemas. No queda nada almacenado en el PC, y el USB es completamente formateable, como en este caso. En muchos contextos es una funcionalidad interesante. Se deberia explotar más.

    ResponderEliminar
  5. Un interesante artículo.

    ResponderEliminar

Si te ha gustado la entrada o consideras que algún dato es erróneo o símplemente deseas dar algún consejo, no dudes en dejar un comentario. Todo feedback es bienvenido siempre que sea respetuoso. También puedes contactarme vía Twitter @Hamster_ruso si lo consideras necesario.