Automatisches Login per USB-Stick
ACHTUNG:
Dieser Artikel ist nicht mehr aktuell! Es gibt eine neuere Version, die auf pamusb beruht und damit sicherer und multi-user tauglich ist. siehe hier: Automatisches Login per USB-Stick für mehrere Benutzer mit pamusb Diese Version läuft dennoch hervorragend, wenn man aus welchen Gründen auch immer pamusb nicht benutzen kann oder möchte!
UPDATE: Es ist jetzt der 31.07.2007 10:41Uhr! Alle die den Artikel vorher bearbeitet haben, müssen ihn bitte nochmal komplett durchschauen, da ich einige Änderungen vorgenommen habe!
Ziel ist es sich durch einen USB-Stick zu identifizieren und danach automatisch eingelogged zu werden, inklusive Start von KDE.
Inhalt:
- Einführung
- Ich benutze kein kdm, sondern…
- Bei uns benutzen mehrere leute den PC. Ist das Autologin auch Multiuser tauglich?
- Probleme mit Ubuntu/Kubuntu bzw allen Systemem die upstart oder initng verwenden
- Ich will kein pamusb, kann man das denn nicht irgendwie anders machen?
- Schritt 1: Datei Anlegen beim Einstecken des USB-Sticks
- Schritt 2: kdm aus dem init-System entfernen
- Schritt 3: Die Framebufferkonsole und fbi
- Schritt 4: Script zur Überprüfung
- Schritt 5: KDM einrichten
- Ich will keinen Framebuffer, mir ist egal wie es aussieht! Geht es trotzdem?
- Ubuntu/Kubuntu: Sicher auch ohne pamusb
- Fertig und letzte Hinweise
Einführung
Sieht alles ein bisschen viel aus, ist aber nur sehr ausführlich! *g*
Die Idee: Bevor das normale Login kommt, das System anhalten und auf das Einstecken des richtigen USB-Sticks warten. (Da jeder USB-Stick eine eindeutige ID hat, ist sichergestellt, dass nur bestimmte Sticks Zugriff haben.) Dies wird realisiert, in dem eine Datei angelegt wird, wenn der richtige Stick angeschlossen wird. Ein Script prüft regelmäßig ob diese Datei existiert. Wird dann der richtige Stick an den PC angeschlossen, die Datei also existiert und dies durch ein Script überprüft wurde, soll kdm mit der Einstellung autologin gestartet werden.
Ausserdem soll das Ganze grafisch auch ansprechend sein. Dafür wird eine Framebufferkonsole und das Programm fbi benötigt. Aber später mehr dazu!
Will man das ganze ohne Framebuffer machen, bitte am Ende der Seite schauen.
Ich benutze kein kdm, sondern…
Das sollte eigentlich kein Problem sein. Einfach alle “kdm” durch gdm, xdm oder was auch immer ersetzen. Allerdings weiss ich nicht genau, wie man bei gdm und xdm den autologin aktiviert…Ich versuche das nachzureichen.
Bei uns benutzen mehrere leute den PC. Ist das Autologin auch Multiuser tauglich?
NOCH nicht. Aber ich arbeite dran! Am besten einfach regelmäßig vorbeischauen *g*
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, das 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 alle parallel ausgeführt. Dadurch kommt im Hintergrund, wenn fbi läuft, das Konsolenlogin und man kann sich einloggen.
Wenn man den USB-Stick-Auto-Login nur zur Bequemlichkeit einsetzt, ist dieser Umstand an sich nicht schlimm. Möchte man aber seinen PC sicher haben, und einen Login generell nur mit einem USB-Stick erlauben, so muss zusätzlich das Programm pamusb eingesetzt werden. Mithilfe dieses Programmes, kann man einrichten, dass ein Login am System, sei es auf der Konsole, bei KDM oder bei su, ausschließlich mit einem USB-Stick möglich ist. Gut beschrieben wird dies im Wiki bei ubuntuusers.de
Authentifizierung mit USB-Stick – ubuntuusers.de
Benutzt man nun pamusb und dieses howto, so hat man ein komfortables UND sicheres System!
Ich will kein pamusb, kann man das denn nicht irgendwie anders machen?
Ja, man kann. Das Problem sind, wie oben schon angesprochen die Konsolen. Es liegt also nahe, diese nicht zu automatisch zu initialisieren, sondern erst nach erfolgreicher Identifikation durch den USB-Stick. Wie das geht könnt ihr ganz am Ende des Artikels nachlesen.
Hinweis: Alle Befehle hier werden als Root ausgeführt!
Schritt 1: Datei Anlegen beim Einstecken des USB-Sticks
Mit udev kann man Regeln festlegen, die Steuern was passiert wenn ein USB-Stick angeschlossen wird. Sehr gut wird dies im Wiki von Ubuntuusers.de beschrieben, so dass ich mich darauf beziehe und dieses Thema hier nicht weiter bearbeite.
Nachdem man sich die Seite im Wiki angeschaut hat, legt man folgende Datei an:
/etc/udev/rules.d/001-loginusbstick-custom.rules
Darin stehen sollte (*SERIAL* ersetzen durch die Seriennummer des USB-Sticks, ausserdem muss alles in eine Zeile!):
BUS=="usb", KERNEL=="sd?1", SYSFS{serial}=="*SERIAL*", RUN+="/usr/local/bin/loginusbok"
Nicht vergessen die Datei ausführbar zu machen:
chmod +x /etc/udev/rules.d/001-loginusbstick-custom.rules
Nun wird das Script /usr/local/bin/loginusbok angelegt und ebenfalls ausführbar gemacht. Darein kommt:
#!/bin/bash touch /root/logintestok
Der erste Teil ist nun fertig. Beim Einstecken des USB-Stickes wird die Datei /root/loginusbok angelegt!
Schritt 2: kdm aus dem init-System entfernen
Nun wird der automatische Start von Start von kdm verhindert. Dafür wird kdm 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. Es ist aber der einzige Link mit kdm im Namen. Auch muss festgestellt werden, welche Runlevel der Multiuser-Runlevel ist. Bei Debian ist dies 2:
mv /etc/rc2.d/S99kdm /root/backup/S99kdm
Nun wird kdm 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:
title Debian GNU/Linux, kernel 2.6.21-1-k7 root (hd0,6) 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:
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: (Geht nicht in der Konsole unter X, sondern muss in der ersten Framebufferkonsole [Strg+Alt+F1] ausgeführt werden)
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, erkläre ich gleich.
Das Script sieht folgendermaßen aus:
#!/bin/bash rm /root/logintestok& udevtrigger x=1 while [ $x == 1 ]; do if [ -e /root/logintestok ]; then sleep 2 x=2 killall S99zloginusb kill `pidof fbi` /etc/init.d/kdm start & else sleep 3 fi done
Zuerst wird die von udev angelegte loginusbok Datei gel&oum;lscht, da sie ja auch noch vom letzten Mal übrig sein könnte. Dann wird alle zwei Sekunden geprüft ob diese Datei existiert, ob also der USB-Stick angeschlossen wurde. Ist dies der Fall, wird das Programm fbi beendet, kdm gestartet und das Script selber beendet sich.
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 so Recht in meinem Sinne. Also werden das Loginscript und fbi über ein zweites Script im Hintergrund gestartet. (Das muss so gelöst werden, weil man init-Scripte nicht im Hintergrund starten kann)
Datei /usr/local/bin/loginusb anlegen, ausführbar machen und folgendes reinschreiben:
#!/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 diesem Falle 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!)
ln -s /usr/local/bin/loginusb /etc/rc2.d/S99zloginusb
Schritt 5: KDM einrichten
Um automatisch eingelogged zu werden, muss man KDM noch dementsprechend einrichten:
Kontrollzentrum > Systemverwaltung > Anmeldungsmanager > Vereinfachung > Automatische Anmeldung erlauben [Benutzer einstellen] [immer = aktiv]
Ich will keinen Framebuffer, mir ist egal wie es aussieht! Geht es trotzdem?
Ja es geht *g* Ihr müsst erstens den link /etc/rc2.d/S99zloginusb auf loginusb2 und nicht auf loginusb zeigen lassen:
ln -s /usr/local/bin/loginusb2 /etc/rc2.d/S99zloginusb
Und zweitens die loginusb2 ein bisschen bearbeiten. Da fbi nicht mehr gestartet wird, muss man es auch nicht mehr beenden. Ausserdem sollte noch eine kurze Nachricht erscheinen, damit der Benutzer weiss was passiert:
#!/bin/bash rm /root/logintestok& x=1 clear echo "Willkommen" echo "Bitte identifizieren Sie sich mit Ihrem USB-Stick!" echo "Warte auf USB-Stick..." while [ $x == 1 ]; do if [ -e /root/logintestok ]; then sleep 2 x=2 echo "USB-Stick identifiziert. Sie werden angemeldet..." /etc/init.d/kdm start & else sleep 3 fi 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: Sicher auch ohne pamusb
Zuerst müssen die konsolen aus upstarte entfernt werden. Dazu werden die Startscripts einfach in den Backupordner unter /root/backup/ verschoben:
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 wir natürlich nicht drauf verzichten wollen, müssen wir sie manuell wieder starten. Dies geschit dann in /usr/loca/bin/loginusb2:
#!/bin/bash rm /root/logintestok& x=1 while [ $x == 1 ]; do if [ -e /root/logintestok ]; then sleep 2 x=2 killall S99zloginusb getty 38400 tty1& getty 38400 tty2& getty 38400 tty3& getty 38400 tty4& getty 38400 tty5& getty 38400 tty6& /etc/init.d/kdm start & else sleep 3 fi done
Jetzt sollten die Konsolen erst gestartet werden, wenn die Identifikation durch den USB-Stick erfolgreich war!
Fertig und letzte Hinweise
Nun sollte eigentlich alles funktionieren.
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









