Automatisches Login per USB-Stick für mehrere Benutzer mit pamusb
Ziel ist es sich durch einen USB-Stick zu identifizieren und danach automatisch eingelogged zu werden, inklusive Start der grafischen Benutzeroberfläche.
ACHTUNG: Es ist jetzt der 13.08.2007 19:14. ich habe den Artikel gerade noch einmal überarbeitet und ein paar kleine Fehler ausgebügelt. Also bitte einmal die loginusb2 Scripte vergleichen!
Inhalt:
- Einführung
- Probleme mit Ubuntu/Kubuntu bzw allen Systemem die upstart oder initng verwenden
- pamusb einrichten
- Displaymanager (kdm/gdm) aus dem init-System entfernen
- Die Framebufferkonsole und fbi
- Script zur Überprüfung
- Ich will keinen Framebuffer, mir ist egal wie es aussieht! Geht es trotzdem?
- Ubuntu/Kubuntu: Konsolen manuell starten
- Fertig und letzte Hinweise
Einführung
Die Idee: Bevor das normale Login kommt soll das System anhalten und auf das Einstecken des richtigen USB-Sticks warten. Zur Überprüfung wird das pam-Modul pamusb benutzt.
Steckt nun ein Benutzer seinen USB-Stick an den Computer, wird überprüft ob der Benutzer registriert ist. Ist diese Abfrage erfolgreich, so startet der Desktop des Benutzers.
Ausserdem sollte das Ganze grafisch auch ansprechend sein. Dafür wird eine Framebufferkonsole und das Programm fbi benötigt. Aber später mehr dazu!
Probleme mit Ubuntu/Kubuntu bzw. allen Systemem die upstart oder initng verwenden
Bei Debian, und bei allen anderen Distributionen die das normale init-Script verwenden, werden die init-Scripte linear, also der Reihe nach, abgearbeitet. Aus diesem Grund werden die Konsolen und die Logins erst bereitgestellt, wenn alle init-Scripte abgearbeitet sind. In diesem Falle bedeutet es, dass man ohne den richtigen USB-Stick nicht zum Login kommt.
Bei Systemen die upstart oder initng einsetzen, wie Ubuntu und seine Derivate, werden die Scripte parallel ausgeführt. Dadurch werden im Hintergrund, wenn fbi läuft, die Konsolen bereitgestellt und man kann sich einloggen.
Es liegt also nahe, diese nicht automatisch zu initialisieren, sondern erst nach erfolgreicher Identifikation durch den USB-Stick. Wie das geht kann ganz am Ende des Artikels nachgelesen werden.
Hinweis: Alle folgenden Befehle werden als Root ausgeführt!
pamusb einrichten
pamusb erlaubt unter Linux eine Authentifizierung mit einem USB-Stick. Da es üder dieses Programm schon diverse HowTos gibt, werde ich auf die Einrichtung etc. nicht näher eingehen:
- The PAM_USB Project (Das Wiki des Projekts mit leicht verständlicher Anleitung, allerdings auf Englisch)
- Authentifizierung mit USB-Stick – ubuntuusers.de (deutsche Übersetzung der Original Anleitung, sollte der Englischen entsprechen)
ACHTUNG: Es darf pro USB-Stick nur ein Benutzer verknüpft sein, damit das System für mehrere Benutzer funktioniert!
Nachdem man pamusb eingerichtet hat, ist der erste Schritt getan.
Displaymanager (kdm/gdm) aus dem init-System entfernen
Nun wird der automatische Start des Displaymanager verhindert. Dafür wird er aus dem Multiuser-Runlevel entfernt, in dem der dazugehörige Link zum Beispiel im Homeverzeichniss von Root und dort in einen Backupordner verschoben wird. Die genau Linkbezeichnung kann dabei abweichen, je nachdem welchen man verwendet. Weiterhin muss festgestellt werden, welcher Runlevel der Multiuser-Runlevel ist. Bei Debian ist dies 2:
1 2 3 4 5 | # Beispiel für kdm: mv /etc/rc2.d/S99kdm /root/backup/S99kdm # Beispiel für gdm: mv /etc/rc2.d/S99gdm /root/backup/S99gdm |
Nun wird der Displaymanager nicht mehr automatisch gestartet.
Schritt 3: Die Framebufferkonsole und fbi
Damit in der Konsole ein Bild angezeigt werden kann, benötigt man zwei Sachen: Eine Framebuffer Konsole und das Programm fib. Die Framebufferkonsole erhält man, in dem man vga=0x31B an die kernel-Zeile des zu benutzenden Kernels in der /boot/grub/menu.lst hinzufügt:
1 2 3 4 5 | title Debian GNU/Linux, kernel 2.6.21-1-k7 root (hd0,6)</li> kernel /boot/vmlinuz-2.6.21-1-k7 root=/dev/hda7 ro vga=0x31B initrd /boot/initrd.img-2.6.21-1-k7 savedefault |
Eine Auflistung aller möglichen Framebuffer Modi:
| Farben\Auflösung | 640×480 | 800×600 | 1024×768 | 1280×1024 |
| 256 | 0×301 | 0×303 | 0×305 | 0×307 |
| 32k | 0×310 | 0×313 | 0×316 | 0×319 |
| 64k | 0×311 | 0×314 | 0×317 | 0x31A |
| 16M | 0×312 | 0×315 | 0×318 | 0x31B |
Nach einem Neustart sollte nun ein Framebufferkonsole in der Auflösung 1280×1024 bei 24Bit zur Verfügung stehen.
Um Bilder auf dieser Framebufferkonsole anzeigen zu lassen ist jetzt noch das Programm fbi nötig. Unter Debian genügt ein einfaches:
1 | apt-get install fbi |
um das Programm und seine Abhängigkeiten zu installieren.
Damit das nun auch nach was aussieht, hab ich hier mal das Bild, welches angezeigt wird beim Login: (auf das Bild klicken für die große Version)
Das bild nach /root/loginusb.jpg speichern. Zum Testen: (Funktioniert nicht in der Konsole unter X, sondern muss in der ersten Framebufferkonsole [Strg+Alt+F1] ausgeführt werden)
1 | fbi /root/loginusb.jpg |
Es sollte das Loginbild im Vollbild zu sehen sein.
Natürlich kann man auch ein eigenes Bild verwenden ;) Soweit so gut, nun kommen wir zum eigentlichen Script:
Schritt 4: Script zur Überprüfung
Das script heisst loginusb2 und wird in /usr/local/bin angelegt. Warum es loginusb2 heissen muss, wird gleich erklärt.
Das Script sieht folgendermaßen aus: (hier mit einem Beispiel für den Displaymanager KDM. Da ich selber kein GDM benutze, weiss ich leider auch nicht wie die entsprechenden Zeilen in den Konfigurationsdateien aussehen. Vielleicht könnte mir da jemand helfen?)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #!/bin/bash IFS=" " Y=1 while [ $Y == 1 ]; do for X in `grep "<user id=" /etc/pamusb.conf | cut -d "\"" -f 2 | cut -d "\"" -f 1` do if [ $X != "root" ] && [ $X != "scox" ]; then pamusb-check --quiet $X 2> /dev/null if [ $? == 0 ]; then Y=2 killall S99zloginusb kill `pidof fbi` #Beispiel konfiguration für den Displaymanager kdm: sed -i "s/\(^AutoLoginUser=\).*/1$X/" /etc/kde3/kdm/kdmrc sed -i "s/\(^NoPassUser=\).*/1$X/" /etc/kde3/kdm/kdmrc sed -i "s/\(^NoPassEnable=\).*/1true/" /etc/kde3/kdm/kdmrc sed -i "s/\(^AutoLoginEnable=\).*/1true/" /etc/kde3/kdm/kdmrc sed -i "s/\(^AutoLoginLocked=\).*/1false/" /etc/kde3/kdm/kdmrc /etc/init.d/kdm start & #Beispiel konfiguration für den Displaymanager gdm: sed -i "s/\(^AutoLoginUser=\).*/1$X/" /etc/gdm/gdm.conf-custom sed -i "s/\(^AutoLoginEnable=\).*/1true/" /etc/gdm/gdm.conf-custom /etc/init.d/gdm start & else sleep 2 fi fi done; done; |
Dieses Script macht Folgendes: Zuerst wird die Datei /etc/pamusb.conf geöffnet und die dort registrierten Benutzer werden ausgelesen. Jetzt wird mit Hilfe des Programmes pamusb-check getestet, ob einer der registrierten Benutzer seinen USB-Stick an den Computer angeschlossen hat. Dies wird durch eine Endlosschleife immer wieder geprüft.
Hat sich dann ein Benutzer erfolgreich identifiziert, wird der Displaymanager vorbereitet. D.h. in der Konfigurationsdatei wird der Autologin aktiviert und der Autologin Benutzer eingetragen. Letztendlich wird der Displaymanger gestartet und das Script beendet sich.
Nicht vergessen die Datei ausführbar zu machen:
1 | chmod +x /usr/local/bin/loginusb2 |
Nun ergibt sich ein Problem: Wenn das Script zuerst gestartet wird, kann man fbi zum Anzeigen des Bildes erst starten, wenn das Script fertig ist. Wenn das Script fertig ist, ist der Login aber schon vollzogen, das Bild also sinnlos.
Andersrum ist es ähnlich. Da fib ein Programm ist, wird das nachfolgende Programm in der init-Liste erst gestartet, wenn man fib beendet.
Auch das ist nicht Sinn der Sache. Also werden das Loginscript und fbi über ein zweites Script im Hintergrund gestartet. (Das muss auf diese Weise gelöst werden, da man init-Scripte nicht im Hintergrund starten kann)
Datei /usr/local/bin/loginusb anlegen, ausführbar machen und folgendes reinschreiben:
1 2 3 4 5 6 | #!/bin/bash /usr/local/bin/loginusb2& while true; do fbi --noverbose /root/loginusb.jpg done |
Die while-Schleife fängt den Fall ab, dass ein Benutzer fbi mit [q] beendet. In dieser Situation wird es einfach wieder neugestartet.
Damit das Script beim Starten ausgeführt wird, muss es in das init-System integriert werden.
(Das z nach S99 ist wichtig, damit das Script als letztes gestartet wird!)
1 | >ln -s /usr/local/bin/loginusb /etc/rc2.d/S99zloginusb |
Ich will keinen Framebuffer, mir ist egal wie es aussieht! Geht es trotzdem?
Ja es geht. Zuerst muss der Link /etc/rc2.d/S99zloginusb auf loginusb2 zeigen und nicht auf loginusb:
1 | ln -s /usr/local/bin/loginusb2 /etc/rc2.d/S99zloginusb |
Zweitens muss die loginusb2 bearbeitet werden. Da fbi nicht mehr gestartet wird, muss es auch nicht beendet werden. Ausserdem sollte noch eine kurze Nachricht erscheinen, damit der Benutzer weiss was passiert:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #!/bin/bash IFS=" " Y=1 clear echo "Willkommen" echo "Bitte identifizieren Sie sich mit Ihrem USB-Stick!" echo "Warte auf USB-Stick..." while [ $Y == 1 ]; do for X in `grep "<user id=" /etc/pamusb.conf | cut -d "\"" -f 2 | cut -d "\"" -f 1` do if [ $X != "root" ] && [ $X != "scox" ]; then pamusb-check --quiet $X 2> /dev/null if [ $? == 0 ]; then Y=2 echo "USB-Stick identifiziert. Sie werden angemeldet..." #Beispiel konfiguration für den Displaymanager kdm: sed -i "s/\(^AutoLoginUser=\).*/1$X/" /etc/kde3/kdm/kdmrc sed -i "s/\(^NoPassUser=\).*/1$X/" /etc/kde3/kdm/kdmrc sed -i "s/\(^NoPassEnable=\).*/1true/" /etc/kde3/kdm/kdmrc sed -i "s/\(^AutoLoginEnable=\).*/1true/" /etc/kde3/kdm/kdmrc sed -i "s/\(^AutoLoginLocked=\).*/1false/" /etc/kde3/kdm/kdmrc /etc/init.d/kdm start & #Beispiel konfiguration für den Displaymanager gdm: sed -i "s/\(^AutoLoginUser=\).*/1$X/" /etc/gdm/gdm.conf-custom sed -i "s/\(^AutoLoginEnable=\).*/1true/" /etc/gdm/gdm.conf-custom /etc/init.d/gdm start & else sleep 2 fi fi done; done; |
Natürlich muss der vga= Eintrag wieder aus der kernel-Zeile raus, ebensowenig braucht man für diese Methode das Programm fbi.
Ubuntu/Kubuntu: Konsolen manuell starten
Zuerst müssen die Konsolen aus upstart entfernt werden. Dazu werden die Startscripts einfach in den Backupordner unter /root/backup/ verschoben:
1 2 3 4 5 6 | mv /event.d/tty1 /root/backup/ mv /event.d/tty2 /root/backup/ mv /event.d/tty3 /root/backup/ mv /event.d/tty4 /root/backup/ mv /event.d/tty5 /root/backup/ mv /event.d/tty6 /root/backup/ |
Nun werden die Konsolen nicht mehr automatisch gestartet. Da natürlich nicht auf sie verzichtet werden kann, müssen sie manuell gestartet werden. Dies geschieht in /usr/loca/bin/loginusb2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | #!/bin/bash IFS=" " Y=1 while [ $Y == 1 ]; do for X in `grep "<user id=" /etc/pamusb.conf | cut -d "\"" -f 2 | cut -d "\"" -f 1` do if [ $X != "root" ] && [ $X != "scox" ]; then pamusb-check --quiet $X 2> /dev/null if [ $? == 0 ]; then Y=2 killall S99zloginusb kill `pidof fbi` getty 38400 tty1& getty 38400 tty2& getty 38400 tty3& getty 38400 tty4& getty 38400 tty5& getty 38400 tty6& #Beispiel konfiguration für den Displaymanager kdm: sed -i "s/\(^AutoLoginUser=\).*/1$X/" /etc/kde3/kdm/kdmrc sed -i "s/\(^NoPassUser=\).*/1$X/" /etc/kde3/kdm/kdmrc sed -i "s/\(^NoPassEnable=\).*/1true/" /etc/kde3/kdm/kdmrc sed -i "s/\(^AutoLoginEnable=\).*/1true/" /etc/kde3/kdm/kdmrc sed -i "s/\(^AutoLoginLocked=\).*/1false/" /etc/kde3/kdm/kdmrc /etc/init.d/kdm start & #Beispiel konfiguration für den Displaymanager gdm: sed -i "s/\(^AutoLoginUser=\).*/1$X/" /etc/gdm/gdm.conf-custom sed -i "s/\(^AutoLoginEnable=\).*/1true/" /etc/gdm/gdm.conf-custom /etc/init.d/gdm start & else sleep 2 fi fi done; done; |
Jetzt sollten die Konsolen erst starten, wenn die Identifikation durch den Benutzer erfolgreich war!
Fertig, Danksagungen und letzte Hinweise
Nun sollte eigentlich alles funktionieren.
Bedanken möchte ich mich an dieser Stelle bei folgenden Personen die mir beim erstellen dieses Artikels geholfen haben: Gerrit, yaccin und mreczio!
Falls noch irgendwelche Fragen bestehen, einfach ne E-Mail schicken! (siehe Impressum)
60,066
Radfahrer, Jogger, Fachinformatiker, Internetjunkie, 1983er, Blogger, HuWAG, Applejünger, Nichtraucher, Canon 450D, iPhone, Hannover, Schokolade, Californication, Friends, HIMYM, Dexter, TAAHM, Linux









