Remplacer son mot de passe par un tag NFC

Introduction

Le but est de déverouiller son PC en approchant un tag NFC. Il faut pour ceci un ordinateur sous Linux, et un lecteur de tags NFC. J'ai utilisé un ACR122U.

PAM_nfc

pam_nfc permet d'ouvrir sa session et remplir le mot de passe demandé par sudo ou PolKit. Lorsque le système demande le mot de passe, il suffit d'approcher le tag et d'appuyer sur Entrée.

Pour dévérouiller sa session, les screensavers ne passent pas par PAM (Plugable Authentication Modules), il faut donc un script qui verrouille/dévérouille la session lorsqu'on approche un tag.

NFC-eventd

Pour ceci, on utilise nfc_eventd qui écoute le lecteur NFC en permanence. Il permet de lancer des commandes en réponse à un évènement (détéction ou perte de vue d'un tag).

Malheureusement, mon lecteur ne fonctionne pas correctement avec ces deux utilisations, car si deux programmes utilisent le lecteur NFC en même temps, il y a des erreurs.
Mon script ne permet donc pas de verrouiller automatiquement tout en conservant la fonctionnalité de PAM pour sudo.

Pour associer un tag à votre session, placez-le sur le lecteur et faites

$ pam_nfc add $(whoami)

Voilà pour PAM, ensuite il faut insérer l'UID du tag dans un fichier nfc_cards.conf pour le script à la fin de ce post.

nfc-list |grep UID|awk -F: '{print $2}'|awk '{print $1$2$3$4$5$6$7}'

note : Vous pouvez mettre plusieurs cartes

Configuration de NFC-eventd

nfc-eventd {

        # Run in background? Implies debug=false if true
        daemon = true;

        # show debug messages?
        debug = true;

        # polling time in seconds
        polling_time = 2;

        # expire time in seconds
        # default = 0 ( no expire )
        expire_time = 0;

        # list of events and actions
        module nem_execute {
                # Tag inserted
                event tag_insert {
                        # what to do if an action fail?
                        # ignore  : continue to next action
                        # return  : end action sequence
                        # quit    : end program
                        on_error = ignore ;

                        # You can enter several, comma-separated action entries
                        # they will be executed in turn
                        action = "/home/jean/.local/bin/nfc-lock.sh unlock $TAG_UID";
                }

                # Tag has been removed
                event tag_remove { 
                        on_error = return;
                        action = "/bin/false";
                }

                # Too much time card removed
                event expire_time { 
                        on_error = ignore;
                        action = "/bin/false";
                }
        }

}

Script de déverrouillage

#!/bin/bash
if [ $# -eq 0 ]; then
    echo "starting nfc-lock d-bus monitor"
        nfc-lock.sh monitor
fi
ACTION=$1
NFC_UID=$2
case $ACTION in
    lock|unlock)
        CMD=$(grep "$NFC_UID" /home/user/.local/etc/nfc_cards.conf |wc -l)
        if [ "$CMD" = "1" ]; then
            echo "carte trouvée dans le fichier nfc_cards.conf"
            #process $1 $2
            echo "$ACTION by $NFC_UID"
            case $ACTION in
                lock)
                   qdbus org.kde.plasma.browser_integration /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Pause
                   loginctl lock-session
                    ;;
                unlock)
                  xset dpms force on
                  qdbus org.kde.plasma.browser_integration /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Play
                    loginctl unlock-session
                    ;;
            esac
        else
            echo "erreur: $NFC_UID invalide"
        fi
        ;;
    stop)
        killall nfc-eventd ;sleep 3; loginctl unlock-session
        ;;
    help)
        echo "Usage : $0 start|stop"
        echo "$0 lock <uid>"
        echo "$0 unlock <uid>"
        echo "No arguments launches daemon"
                                ;;
          monitor)
                        dbus-monitor --session "type='signal',interface='org.freedesktop.ScreenSaver',path='/org/freedesktop/ScreenSaver'" |
                        while read x; do
                                case "$x" in
                                        *"boolean true"*)
                                                echo SCREEN_LOCKED
                                                qdbus org.kde.plasma.browser_integration /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Pause
                                                nfc-eventd --config_file=/home/user/.local/etc/nfc-eventd.conf &
                                                echo "nfc-eventd launched"
                                                ;;
                                        *"boolean false"*)
                                                echo SCREEN_UNLOCKED
                                                killall nfc-eventd
                                                echo "nfc eventd was killed, returning to dbus monitoring"
                                                ;;
                                esac
                        done
                echo "end dbus listen"
                ;;
esac