pam_usb es un módulo que permite añadir autenticación hardware
utilizando unidades de almacenamiento extraíbles "normales", como
memorias USB, tarjetas SD/MMC, etc. Mediante pamusb
podemos
especificar que se ejecuten diversas acciones cuando reconoce el
dispositivo conectado, como por ejemplo iniciar sesión sin tener que
introducir la contraseña o desactivar el salvapantallas, por lo que se
puede utilizar para implantar un sistema de autenticación en dos pasos
(2FA).
Sirve cualquier USB, ya que el módulo no modifica su contenido, sino que comprueba el UUID, el número de serie, el fabricante y el modelo, por lo que, aunque se copie, no se podrá suplantar fácilmente.
Instalación
Instalamos el módulo:
$ api libpam-usb pamusb-tools
Configuración
USBs
Una vez conectado el USB que pensamos utilizar, aunque no hace falta que
esté montado, lo añadimos al archivo de configuración /etc/pamusb.conf
(podemos asignarle cualquier nombre):
$ sudo pamusb-conf --add-device myusb
Please select the device you wish to add.
* Using "Kingston Aurum (136C0932618F)" (only option)
Which volume would you like to use for storing data ?
* Using "/dev/sdb1 (UUID: 37AD-8A2F)" (only option)
Name : myusb
Vendor : Kingston
Model : Aurum
Serial : 136C0932618F
UUID : 37AD-8A2F
Save to /etc/pamusb.conf ?
[Y/n] Y
Done.
Deberemos repetir el proceso para cada USB que queramos utilizar.
Usuarios
El siguiente paso es configurar los usuarios que queremos que se autentiquen:
$ sudo pamusb-conf --add-user myuser
Which device would you like to use for authentication ?
* Using "myusb" (only option)
User : myuser
Device : myusb
Save to /etc/pamusb.conf ?
[Y/n] Y
Done.
Comprobación
Comprobamos la configuración, todavía con el USB conectado:
$ sudo pamusb-check myuser
* Authentication request for user "m" (pamusb-check)
* Device "myusb" is connected (good).
* Performing one time pad verification...
* Regenerating new pads...
* Access granted.
Si desconectamos el USB y volvemos a probar:
$ sudo pamusb-check myuser
* Authentication request for user "myuser" (pamusb-check)
* Device "myusb" is not connected.
* Access denied.
Módulo PAM
Para incluir pam_usb
en el proceso de autenticación del sistema,
deberemos editar el fichero /etc/pam.d/common-auth
y añadir la
siguiente linea:
auth sufficient pam_usb.so
antes de la línea:
auth required pam_unix.so nullok_secure
La opción sufficient
permite autenticar al usuario si el USB conectado
es correcto, y si no lo es continúa con el proceso de autenticación, es
decir, pide la contraseña. Si en su lugar ponemos required
se
necesitarán ambos, USB y contraseña, para acceder al sistema.
Si sólo queremos utilizar este sistema de autenticación para algún
módulo concreto, en lugar de usar el ficheo common-auth
editamos el
fichero correspondiente, por ejemplo lightdm
, sshd
, sudo
, etc.
No es necesario reiniciar para que los cambios tengan efecto. Con el USB desconectamos hacemos la siguiente prueba:
$ su myuser
* pam_usb v0.5.0
* Authentication request for user "myuser" (su)
* Device "myusb" is not connected.
* Access denied.
Contraseña:
Lo conectamos y volvemos a probar:
$ su myser
* pam_usb v0.5.0
* Authentication request for user "myuser" (su)
* Device "myusb" is connected (good).
* Performing one time pad verification...
* Access granted.
Agente
Si queremos que se ejecute un comando cuando detecte que se ha conectado
el USB, editamos el fichero /etc/pamusb.conf
, esta vez mediante un
editor de texto, y añadimos las siguientes líneas en la sección de
configuración de usuario. Hay un ejemplo incluído como el siguiente,
aunque está comentado, y lo que hace es activar o desactivar el
salvapantallas:
myusb
gnome-screensaver-command --lock
gnome-screensaver-command --deactivate
Es posible que necesitemos añadir pamusb-agent
para que se ejecute al
inicio, aunque con Ubuntu Precise Pangolin no me ha hecho falta. Si
tenemos un entorno de escritorio, podemos incluirlo a través del menú de
Aplicaciones al inicio.
Si queremos hacerlo desde el terminal, dependerá de si usamos init
o
upstart
.
Upstart
Si usamos el sistema upstart
, para hacer que se ejecute al inicio,
creamos el archivo /etc/init/pamusb-agent.conf
:
# pamusb-agent - pam_usb event handler
#
# pamusb-agent is in charge of executing commands upon USB device insertion
# (once authenticated through pam_usb) and removal.
description "pamusb-agent background daemon"
start on runlevel [2345]
stop on runlevel [!2345]
expect fork
respawn
exec /usr/bin/pamusb-agent
Mediante respawn
especificamos que se reinicie el proceso si termina
de forma inesperada.
Vamos al directorio /etc/init.d
y creamos el siguiente enlace
simbólico:
$ sudo ln -s /lib/init/upstart-job pamusb-agent
init
Si utilizamos init
, añadimos el siguiente script en el directorio
/etc/init.d
:
#!/usr/bin/env bash
/usr/bin/pamusb-agent
Le damos permisos de ejecución:
$ sudo chmod +x /etc/init.d/pamusb-agent
Lo añadimos al inicio:
$ sudo update-rc.d pamusb-agent defaults
update-rc.d: warning: /etc/init.d/pamusb-agent missing LSB information
update-rc.d: see
Adding system startup for /etc/init.d/pamusb-agent ...
/etc/rc0.d/K20pamusb-agent -> ../init.d/pamusb-agent
/etc/rc1.d/K20pamusb-agent -> ../init.d/pamusb-agent
/etc/rc6.d/K20pamusb-agent -> ../init.d/pamusb-agent
/etc/rc2.d/S20pamusb-agent -> ../init.d/pamusb-agent
/etc/rc3.d/S20pamusb-agent -> ../init.d/pamusb-agent
/etc/rc4.d/S20pamusb-agent -> ../init.d/pamusb-agent
/etc/rc5.d/S20pamusb-agent -> ../init.d/pamusb-agent
Para activarlo sin tener que reiniciar, ejecutamos:
$ sudo service pamusb-agent start