YubiKey : Udev

Published: 30-12-2014

Updated: 08-12-2017

By: Maxime de Roucy

tags: udev yubikey

Configuration udev spécifique à la YubiKey.

Droits

Pour pouvoir configurer la YubiKey vous devez avoir les droits en écriture sur le device. Sur Archlinux, il n’y a rien à faire, les paquets yubikey-personalization et yubikey-personalization-git contiennent le fichier de règles udev fixant les droits de la YubiKey.

max@laptop % cat /lib/udev/rules.d/69-yubikey.rules
ACTION!="add|change", GOTO="yubico_end"
ATTRS{idVendor}=="1050", ATTRS{idProduct}=="0010|0110|0111|0114|0116|0401|0403|0405|0407|0410", ENV{ID_SECURITY_TOKEN}="1"
LABEL="yubico_end"

Lancement de scripts

Cette section indique comment lancer un script à l’insertion ou l’extraction d’une YubiKey.

Créer votre fichier de règle udev :

max@laptop % cat /etc/udev/rules.d/70-yubikey.rules
# Lancement d'un script à l'insertion
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="1050", ATTRS{idProduct}=="0010", RUN+="/path/mon_script"
# Lancement d'un script à l'extraction
ACTION=="remove", SUBSYSTEM=="input", ENV{NAME}=="?Yubico Yubico Yubikey II?", ENV{ID_VENDOR_ID}=="1050", ENV{ID_MODEL_ID}=="0010", RUN+="/path/mon_script"

old

Pour l’exemple, voici le script que j’utilisais pour locker ma session gnome au retrait d’une YubiKey (ne fonctionne plus) :

#! /bin/bash
export DISPLAY=":0"
# for gnome 2
# su my_user -c "/usr/bin/gnome-screensaver-command -l"
# for gnome 3
su max -c "dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock"

Dans ce script, on utilise la commande « su » plutôt que le bit suid. Il n’est pas possible d’utiliser le bit suid sur un exécutable interprété (eg. un scripte shell).

update 1

Avec systemd le DBUS_SESSION_BUS_ADDRESS n’est plus enregistré dans ~/.dbus/session-bus, le précédent script ne fonctionne plus. Je l’ai modifié pour le suivant :

#! /bin/bash

export $(</proc/$(pgrep evolution-alarm)/environ tr \\0 \\n | grep -E '^DBUS_SESSION_BUS_ADDRESS=')
su max -c "dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock"

Je me suis inspiré de ce que j’ai trouvé sur stackexchange et le forum archlinux. En résumé, je récupère le DBUS_SESSION_BUS_ADDRESS depuis l’environement du processus « evolution-alarm » dont je sais qu’il est lancé une seul fois dans ma session graphique.

update 2

loginctl dispose de l’option lock-sessions qui permet de locker toutes les sessions (qui supporte le locking). J’utilise maintenant cette fonctionnalité et je lance loginctl directement depuis la règle udev :

max@laptop % cat /etc/udev/rules.d/70-yubikey.rules
# Lancement d'un script à l'extraction
ACTION=="remove", SUBSYSTEM=="usb", ENV{ID_VENDOR_ID}=="1050", ENV{ID_MODEL_ID}=="0010", RUN+="/usr/bin/loginctl lock-sessions"

update 3

Suite à un update récent (décembre 2017) de mon Archlinux, le script ne se lance plus à l’extraction de la clé. Les environment ne sont plus set pour les actions “remove”. Faute de mieux, la nouvelle règle est la suivante :

max@laptop % cat /etc/udev/rules.d/70-yubikey.rules
# Lancement d'un script à l'extraction
ACTION=="remove", SUBSYSTEM=="usb", ENV{PRODUCT}=="1050/10/*", RUN+="/usr/bin/loginctl lock-sessions"