Login über USB-Stick

Erstellt am 03.02.2008

Login über USB-Stick

Mal wieder ein neues kleines HowTo, das sich dieses Mal mit dem Thema pamusb unter SuSE-Linux beschäftigt. Damit ist es möglich, sich an seinem Computer über einen USB-Stick anzumelden - ohne Passwort. Eine recht ausführliche Anleitung bietet bereits das HowTo von Prolinux Automatisches Login per USB-Stick, das allerdings auf ein Script zur Anmeldung zurückgreift und nicht auf das eigentliche PAM-Modul. Außerdem möchte ich hier gerne die zwei drei Kniffe zeigen, die unter SuSE noch zu beachten sind. Installiert habe ich das ganze auf openSUSE 10.3 x86_64 (daher auch im weiteren verlauf jeweils die 64Bit-Versionen - sollte mit 32Bit genauso funktionieren).

pamusb installieren

Um pamusb zu installieren benötigt man zunächst das Source-Archiv von der pamusb-Projektseite. Dieses am besten in einen eigenen Ordner speichern, da in diesen auch gleich noch ein paar RPMs und evtl. auch Bilder geladen werden müssen. Wenn Ihr die entwickler-Pakete (also gcc und make und den ganzen Tamtam) installiert habt, dann brauch ihr noch das pam-devel-, libxml2-devel- und hal-devel-Paket. Jetzt kann installiert werden:

tar xzvf pam_usb-0.4.2.tar.gz
cd pam_usb-0.4.2/ make su # checkinstall # rpm -Uvh /usr/src/packages/RPMS/x86_64/pam_usb-0.4.2-1.x86_64.rpm

Ich empfehle dringend die Verwendung von checkinstall da hiermit neue Versionen wesentlich einfacher eingespielt werden können und auch das Löschen bei Nichtgefallen gewährleistet ist.

Jetzt ist pam_usb-Bereits installiert und muss eingerichtet werden:

# pamusb-conf --add-device USBStick01
Please select the device you wish to add.
* Using "GENERIC USB DISK DEVICE (XXXX_Generic_USB_Disk_Device_Generic_USB_Disk_Device)" (only option)

Which volume would you like to use for storing data ?
* Using "/dev/sde1 (UUID: XXXX-XXXX)" (only option)

Name     : USBStick01
Vendor   : GENERIC
Model    : USB DISK DEVICE
Serial   : XXXX_Generic_USB_Disk_Device_Generic_USB_Disk_Device
UUID     : XXXX-XXXX

Save to /etc/pamusb.conf ?
[Y/n] y
#
#
# pamusb-conf --add-user <dein-Username>
Which device would you like to use for authentication ?
* Using "USBStick01" (only option)

User     : <dein-Username>
Device   : USBStick01

Save to /etc/pamusb.conf ?
[Y/n] y
#

Mit der ersten Option wird der hoffentlich eingesteckte USB-Stick unter dem Namen USBStick01 (kann ein beliebiger Name sein) in der pamusb.conf eingetragen. Anschließend kann diesem Stick ein User zugeordnet werden: Das bedeutet, dass dieser Benutzer anstatt seines Passworts zukünftig nurmehr seinen Stick einstecken muss, um authentifiziert zu werden. Einem Stick können beliebige und beliebig viele Benutzer zugeordnet werden (also theoretisch auch root; aus Sicherheitsgründen würde ich jedoch davon abraten, weil dann jeder über su ohne Eingabe eines Passworts (solange der Stick steckt) zum root-User mutieren könnte - hier ist ein Passwort wohl doch das Sicherere.

Mit dem Befehl pamusb-check <dein-Username> kann überprüft werden, ob das ganze funktioniert:

pamusb-check moritz
* Authentication request for user "moritz" (pamusb-check)
* Device "USBStick01" is connected (good).
* Performing one time pad verification...
* Regenerating new pads...
* Access granted.

Damit fehlt jetzt nur noch die Einrichtung im PAM-System:
Dem System muss nun mitgeteilt werden, dass es das pam_usb-Modul verwenden soll. Dies geht in der Datei /etc/pam.d/common-auth die zu folgendem Inhalt abgeändert werden muss (Achtung: Merkt euch umbedingt, wie die Datei aussieht, damit ihr im Fehlerfall über eine Rettungskonsole das System wieder zurücksetzen könnt - ansonsten gelingt kein Login mehr!):

#%PAM-1.0
#
# This file is autogenerated by pam-config. All changes
# will be overwritten.
#
# Authentication-related modules common to all services
#
# This file is included from other service-specific PAM config files,
# and should contain a list of the authentication modules that define
# the central authentication scheme for use on the system
# (e.g., /etc/shadow, LDAP, Kerberos, etc.). The default is to use the
# traditional Unix authentication mechanisms.
#
auth   required     pam_env.so
auth   sufficient   /lib/security/pam_usb.so
auth   required     pam_unix2.so   nullok_secure

Das besagt nun, dass die Authentifizierung zunächst über pam_usb versucht werden soll und wenn dies misslingt wieder normal über pam_unix2 erfolgen soll. Die Option nullok_secure ist eine angepasste Version von nullok, die nach meinen Recherchen von Debianentwicklern stammt und eine sicherere Anmeldung ohne Passworteingabe ermöglicht (siehe RedHat-Mailingliste).

Jetzt kann einmal xlock gestartet werden und sollte nun solange der USB-Stick steckt durch einen Druck auf Return bei der Passwortabfrage wieder beendet werden (sollte dem einmal nicht so sein, müsste es nach wie vor funktionieren das Passwort einzugeben).

Diese Funktion sollte jetzt in jedem Programm verwendet werden können, welches auf das PAM-Backend zurück greift, also auch su, sudo, kdm bzw. gdm oder die diversen Screensaver.

Der pamusb-agent

Damit dieser Agent richtig funktionieren kann, wird zunächst das Programm pmount benötigt (herunterzuladen auf http://www.piware.de/projects/ - einfach die neueste Version herunterladen). Die Installation gestaltet sich ähnlich einfach, wie schon das pamusb-Modul:

tar xzvf pmount-0.9.13.tar.gz
cd pmount-0.9.13/
./configure
make
su
# checkinstall
# rpm -Uvh /usr/src/packages/RPMS/x86_64/pmount-0.9.13-1.x86_64.rpm

Dieses Programm ermöglicht es nichtpreviligierten Benutzern USB-Geräte zu mounten. Das wird dann benötigt, wenn der pamusb-agent versucht ein neues Pad (Einmalpasswort) auf den Stick zu schreiben, bevor der recht träge Hal-Daemon den Stick gemountet hat.

Da auf dieses Programm aber auch beim Anmelden zurück gegriffen wird, es sich aber durch das Selberkompilieren in /usr/local/bin/pmount befindet, das dann nicht in $PATH steht, erstellt ihr am besten einen Link nach /usr/bin/pmount bzw. /usr/bin/pumount:

# cd /usr/bin
# ln -s ../local/bin/pmount .
# ln -s ../local/bin/pumount .

Jetzt kann der pamusb-agent konfiguriert werden:
Für meinen PC habe ich ihn so eingestellt, dass sobald der Stick abgezogen wird, das Programm kdesktop_lock --forcelock ausgeführt wird. Wenn der Stick wieder eingesteckt wird, lasse ich killall kdesktop_lock ausführen, womit der Desktop wieder freigegeben wird.

Den dafür zuständigen Abschnitt der Konfigurationsdatei (/etc/pamusb.conf) dazu seht ihr hier:

<user id="moritz">
  <device>
    USBStick01
  </device>
  <agent event="lock" >runbg kdesktop_lock --forcelock</agent>
  <agent event="unlock" >killall kdesktop_lock</agent>
</user>

Bei event="lock" wird der Befehl runbg kdesktop_lock --forcelock ausgeführt. Bei dem Befehl runbg handelt es sich um ein kleines Script das ich noch selbst in /usr/local/bin/runbg erstellt habe, welches das angegebene Programm im Hintergrund startet. Das ist nötig, da der pamusb-agent so lange wartet, bis der Befehl ausgeführt wurde, bevor er weitere Events entgegen nimmt. Daher musste ein kleines Script her, welches Programme im Hintergrund startet:

#!/bin/sh
if [ "$1" = "" ]; then
    echo "Usage: runbg <program> [arguments]";
    exit;
fi progr=`whereis $1 | awk '{print $2}'`; if [ -x ${progr} ]; then echo "executing $* in background"; $* & else echo "$1 is not an executeable!"; fi echo;

Damit wird der übergebene Befehl sofern er existiert (also sich in $PATH befindet und ausführbar ist) im Hintergrund gestartet und ihm kann ein Argument übergeben werden (also hier z.B. --forcelock). Mit diesem Script kann man aber auch beliebige andere Programme starten, eben je nachdem was man braucht.

Legt man nun das Programm pamusb-agent in den Autostart seiner Session (also bei KDE in ~/.kde/Autostart oder bei WindowMaker ~/GNUstep/Library/WindowMaker/autostart (mit pamusb-agent & eintragen!!)), so wird der Desktop gesperrt sobald der Stick abgezogen wird und die Sperrung aufgehoben, sobald er wieder steckt.

Fehler und Probleme

Bei der Einrichtung gab es eigentlich nur zwei Probleme:

Das erste Problem ergab sich, als ich einen xterm in meiner XSession startete, der eine eigene Session öffnet (also z.B. tty pts/3). Hier lieferte pamus-check folgende Meldung:

pamusb-check --debug moritz
* Authentication request for user "moritz" (pamusb-check)
[src/local.c:032] Checking whether the caller is local or not...
[src/local.c:041] Authentication request from tty pts/3
* Remote authentication request: 
* Access denied.

Dieses Problem lässt sich umgehen, indem man das Programm von der richtigen Session aus startet (also z.B. die KDE-konsole oder eine rxvt oder Befehl ausführen)

Das zweite Problem entstand, nachdem ich meinen Stick formatierte - dadurch änderte sich die UUID und ich musste ihn neu in die pamusb.conf eintragen - die Fehlermeldung lautete in etwa wie folgt:

pamusb-check moritz
* Authentication request for user "moritz" (pamusb-check) * Device "USBStick01" is connected (good). * Performing one time pad verification... * Probing volume (this could take a while)... * Access denied.

In diesem Fall wie gesagt einfach versuchen den Stick aus der pamusb.conf zu löschen und neu einzufügen.

Und nun viel Spaß mit eurem USB-Login.

Seitenanfang