Bloquear y desbloquear GNU/Linux automáticamente mediante un pendrive usando pam_usb

Estos días he estado buscando una forma de desbloquear y bloquear mi Kubuntu de forma automática ya que en mi trabajo debo desbloquear y bloquear el equipo delante de gente muchas veces al día y como mi contraseña es bastante compleja me agota mucho ponerla una y otra vez o tener que cambiarla por seguridad por si te están grabando en vídeo los dedos u observándolos. Para hacerlo he utilizado pam_usb que dispone de una licencia libre GPL-2.0 license.

Por cierto ahora que no la tengo que poner tantas veces la he hecho todavía más compleja 😂

Instalación de pam_usb

La instalación la vamos a hacer por repositorio APT si tu distribución GNU/Linux no deriva de Debian no te preocupes hay instrucciones en su Wiki para otras distros.

Añadimos el repositorio

Nos hacemos root y abrimos el souces.list para añadir el repositorio.

sudo -i
nano /etc/apt/sources.list

Introducimos está linea en sources.list y guardamos.

deb https://apt.mcdope.org/ ./

Importamos la clave GPG y nos salimos de root (ctrl+d)

sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 913558C8A5E552A7

Instalamos pam_usb

Ahora que ya tenemos el repositorio de pam_usb y hemos importado la firma solo nos quedaría instalarlo y reiniciar.

sudo apt update && sudo apt upgrade
sudo apt install libpam-usb
sudo reboot

Añadiendo dispositivos y usuarios a pam_usb

Ahora deberemos de conectar el pendrive que queremos utilizar como substitutivo de la contraseña, y le ponemos un nombre yo le he puesto pendrive_GNU. Si tienes varias particiones o varios dispositivos (Pendrive, SD…) conectados deberás elegir uno.

sudo pamusb-conf --add-device pendrive_GNU

Añadimos el usuario y lo asociamos al dispositivo que acabamos de crear, en el ejemplo el dispositivo es el número 1.

sudo pamusb-conf --add-user ElCondonRotoDeGNU

Testeamos que todo funciona con pamusb-check

pamusb-check ElCondonRotoDeGNU

Y ya podemos autenticarnos por contraseña o por dispositivo

Bloqueando y desbloqueando el equipo automáticamente

El comportamiento que vamos a programar será el siguiente:

  • Al conectar el dispositivo se bloqueará la sesión del usuario.
  • Al desconectar el dispositivo se desbloqueará la sesión.

Puedes programar otro comportamiento o varios, además puedes tener diferentes dispositivos y que cada uno haga cosas diferentes (Por ejemplo borrar datos sensibles, enviar un correo…).

Yo lo he hecho con KDE Plasma. Si tú utilizas otro escritorio mira en la wiki del proyecto o busca como bloquear la sesión en tu escritorio.

Comprobamos que el comando para bloquear la sesión y el comando para desbloquear la sesión funciona.

loginctl lock-session && sleep 10 && loginctl unlock-session

Comprobaremos que el servicio pamusb-agent.service no este habilitado, ya que no lo vamos a utilizar en este caso, si lo está lo paramos y lo deshabilitamos.

systemctl status pamusb-agent.service
systemctl stop pamusb-agent.service
systemctl disable pamusb-agent.service
systemctl status pamusb-agent.service

Modificamos pam_usb.conf

sudo nano /etc/security/pam_usb.conf

Añadimos estás líneas dentro de la etiqueta <user>.

<agent event="lock"><cmd>loginctl lock-session</cmd></agent>
<agent event="unlock"><cmd>loginctl unlock-session</cmd></agent>

Quedando así:

</user>
        <user id="ElCondonRotoDeGNU">
        <device>Pendrive_GNU</device>
         <agent event="lock">
           <cmd>loginctl lock-session</cmd>
         </agent>
         <agent event="unlock">
           <cmd>loginctl unlock-session</cmd>
         </agent>
        </user>

</users>

Lo podemos testear con:

sudo pamusb-agent

Si todo funciona bien lo único que nos queda es hacer un script para llamarlo cuando se inicie la sesión.

touch Pamusb-agent.sh
sudo chmod +x Pamusb-agent.sh
nano Pamusb-agent.sh

Con el siguiente contenido:

#!/bin/bash
sudo pamusb-agent

Por último solo nos queda programar el script para que se inicie al iniciar sesión en Preferencias del sistema/Arranque y apagado/Inicio automático/Añadir/+ Añadir guion de inicio de sesión… (Solo para Plasma, si utilizas otra cosa tendrás que buscar la forma)

Pero si ingresamos al equipo alguna vez por contraseña, sin el dispositivo conectado, ese script no nos funcionará ya que necesita la contraseña de sudo. Para solucionarlo vamos a editar el archivo sudoers para que cuando ejecutemos ese comando no nos pida la contraseña.

sudo visudo

Le añadimos/modificamos estás líneas:

...
Cmnd_Alias PAM_USB_AGENT= /usr/bin/pamusb-agent
...
ElCondonRotoDeGNU    ALL=(ALL:ALL) PAM_USB_AGENT
...

Quedando así:

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
Defaults        use_pty

# This preserves proxy settings from user environments of root
# equivalent users (group sudo)
#Defaults:%sudo env_keep += "http_proxy https_proxy ftp_proxy all_proxy no_proxy"

# This allows running arbitrary commands, but so does ALL, and it means
# different sudoers have their choice of editor respected.
#Defaults:%sudo env_keep += "EDITOR"

# Completely harmless preservation of a user preference.
#Defaults:%sudo env_keep += "GREP_COLOR"

# While you shouldn't normally run git as root, you need to with etckeeper
#Defaults:%sudo env_keep += "GIT_AUTHOR_* GIT_COMMITTER_*"

# Per-user preferences; root won't have sensible values for them.
#Defaults:%sudo env_keep += "EMAIL DEBEMAIL DEBFULLNAME"

# "sudo scp" or "sudo rsync" should be able to use your SSH agent.
#Defaults:%sudo env_keep += "SSH_AGENT_PID SSH_AUTH_SOCK"

# Ditto for GPG agent
#Defaults:%sudo env_keep += "GPG_AGENT_INFO"

# Host alias specification

# User alias specification

# Cmnd alias specification
Cmnd_Alias PAM_USB_AGENT= /usr/bin/pamusb-agent

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL
ElCondonRotoDeGNU    ALL=(ALL:ALL) PAM_USB_AGENT
# See sudoers(5) for more information on "@include" directives:

@includedir /etc/sudoers.d

Y esto sería todo, espero que te funcione, y si lo haces en otra distribución diferente y/o escritorio no estaría de más ponerlo en los comentarios para ayudarme a mi yo del futuro o a otro usuario. Gracias 😊

¡ Nos vemos en otra entrada !

Enlaces de interés:

Deja un comentario