PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Login via USB Stick



msi
06.01.04, 01:09
Hallo,

heute möchte ich euch vorstellen, wie es möglich wird, sich nur mithilfe seines usb Sticks einzuloggen. Sobald der Stick entfernt wird, wird auch der user ausgeloggt. Aufgrund der eindeutigen ID, die ein USB Stick hat, wird festgestellt, um welchen User es sich handelt und somit ist das ganze natürlich multiuser fähig.

1. Auf einem einzel Desktop System (sprich zuhause)
1.1. Wie es funktioniert
1.2. Systemvorraussetzung
1.3. Konfiguration der Scripte und des Systems
1.4. Starten des Systems

2. Umsetzung bei einem LTSP System
2.1. Wie es funktioniert
2.2. Systemvorraussetzung

msi
06.01.04, 01:26
1.1. Wie es funktioniert
Auf dem Rechner wird ein Script gestartet, welches die /proc/bus/usb/devices überwacht und schaut, ob ein USB Stick angeschlossen wird. Sobald dies passiert, wird überprüft, ob es sich dabei um einen bekannten handelt, und falls dem so ist, wird der entsprechende User eingeloggt.
Falls der Stick entfernt wird, stellt das Script dies auch fest und der User wird ausgeloggt.
TODO: Erklären wie die Authentification des X Servers funktioniert

1.2. Systemvorraussetzung
Es wird ein System benötigt, auf dem X und kde (kann auf einen beliebigen anderen Windowmanager geändert werden) installiert sind. Es muss außerdem USB in den Kernel einkompiliert sein, folgende Optionen sind beim 2.4er Kernel nötig:
CONFIG_USB
CONFIG_USB_DEVICEFS
CONFIG_USB_STORAGE
CONFIG_BLK_DEV_SD zur SCSI Emulation des Sticks, da wir dort das homeverzeichnis ablegen wollen (optional)
es müssen außerdem beim Booten die entsprechenden Module (usb-storage, sd_mod)
außerdem muss das usbdevfs auf /proc/bus/usb gemountet sein, dies geschieht mit folgendem eintrag in der fstab:


none /proc/bus/usb usbdevfs defaults 0 0


1.3. Konfiguration der Scripte und des Systems
im script (angehängt) muss die Zeile


my %users = ( 'keydesstick' => 'zuguser',
'2stick' => 'deruser',
'3stick' => 'user' );

entsprechend geändert werden. der Key des Sticks kann mit folgendem Befehl ermittelt werden:
1. Möglichkeit


lsusb -v | grep Serial

einer der keys ist der des sticks, um herauszufinden welcher, einfach den befehl einmal mit stick und einmal ohne eingeben, der eintrag, der nur einmal vorhanden war ist der, des sticks.

2. Möglichkeit


cat /proc/bus/usb/devices | grep Serial

einer der keys ist der des sticks, um herauszufinden welcher, einfach den befehl einmal mit stick und einmal ohne eingeben, der eintrag, der nur einmal vorhanden war ist der, des sticks.

die entsprechenden User müssen natürlich existieren, sonst kann das script sie auch nicht einloggen.

1.4 Starten des Systems
Gestart wird das ganze dann, indem das Script als root aufgerufen wird. Es wird automatisch X geöffnet und eine Nachricht (kann in dem Script geändert werden) angezeigt.
TODO:
-Script für die Initscripts fähig machen (muss ich noch testen etc)
- Bugs beheben (Zombie Prozesse sterben nicht)


edit: die aktuelle Version gibts weiter unten (hier) (http://www.linuxforen.de/forums/showthread.php?s=&action=showpost&postid=699453#699453)

msi
06.01.04, 01:29
2.1. Wie es funktioniert
Auf den Clients wird ein Script laufen, welches die /proc/bus/usb/devices Datei wie bei der alten Variante durchcheckt. Falls ein Stick reingesteckt wird, wird dies übers Netzwerk an den Server übertragen (nicht fälschbar durch Public Key Kryptographie). Dieser checkt ob in der Datenbank ein entsprechender Eintrag existiert, richtet die Rechte für den Xserver entsprechen ein und startet kde des Users. Ausloggen funktioniert auf dieselbe Art.

2.2. Systemvorraussetzung
...
TODO: Script schreiben, testen und posten

msi
06.01.04, 02:13
neue Version für die Home Version

Changelog:
- Bug mit dem Zombies behoben
- Script unterstützt jetzt ein start und stop als commandline argument
- Sciprt läuft unbemerkt im Hintergrund
- Logs werden nach /dev/null geleitet (X Server sollte ja bereits konfiguriert sein)

TODO:
- Testen ob sich das Script bei den initscripts ausführen lässt (wer will wer mag??) und es dementsprechend anpassen
- log features einbauen (sessreg, etc)
- home verzeichnis oder Teil davon (kde configs/gpg keys/ssh keys oder sonst was) auf den USB Stick speicherbar machen (konfigurierbar)
- was anderes als xmessage benutzen (nicht beendbar, da man sonst uU Prozesse kicken kann und schöner aussehend)
- Hintergrundbild beim "aufn USB stick" warten

floschuh
06.01.04, 12:21
Kann es sein, dass das ganze bei Kernel 2.6 nicht funktioniert?!??
Hab nämlich als SerialNumber USB00000001.

Hab ich was falsch gemacht??

msi
06.01.04, 13:21
Original geschrieben von floschuh
Kann es sein, dass das ganze bei Kernel 2.6 nicht funktioniert?!??
Hab nämlich als SerialNumber USB00000001.

Hab ich was falsch gemacht??

gibt es bei dir die datei /proc/bus/usb/devices, wenn ja posten sie, wenn der usb stick angeschlossen ist und wenn er draußen ist!

floschuh
06.01.04, 14:53
MIT:
========================
T: Bus=03 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 3
B: Alloc= 0/900 us ( 0%), #Int= 0, #Iso= 0
D: Ver= 1.10 Cls=09(hub ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=0000 ProdID=0000 Rev= 2.06
S: Manufacturer=Linux 2.6.0 ohci_hcd
S: Product=OHCI Host Controller
S: SerialNumber=0000:00:02.1
C:* #Ifs= 1 Cfg#= 1 Atr=40 MxPwr= 0mA
I: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 2 Ivl=255ms

T: Bus=02 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 3
B: Alloc= 0/900 us ( 0%), #Int= 0, #Iso= 0
D: Ver= 1.10 Cls=09(hub ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=0000 ProdID=0000 Rev= 2.06
S: Manufacturer=Linux 2.6.0 ohci_hcd
S: Product=OHCI Host Controller
S: SerialNumber=0000:00:02.0
C:* #Ifs= 1 Cfg#= 1 Atr=40 MxPwr= 0mA
I: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 2 Ivl=255ms

T: Bus=02 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#= 8 Spd=12 MxCh= 0
D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=0c76 ProdID=0007 Rev= 1.00
S: Manufacturer=GENERIC
S: Product=USB Mass Storage
S: SerialNumber=USB000000001
C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=100mA
I: If#= 0 Alt= 0 #EPs= 3 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
E: Ad=81(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms
E: Ad=02(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms
E: Ad=83(I) Atr=03(Int.) MxPS= 8 Ivl=10ms

T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=480 MxCh= 6
B: Alloc= 0/800 us ( 0%), #Int= 0, #Iso= 0
D: Ver= 2.00 Cls=09(hub ) Sub=00 Prot=01 MxPS= 8 #Cfgs= 1
P: Vendor=0000 ProdID=0000 Rev= 2.06
S: Manufacturer=Linux 2.6.0 ehci_hcd
S: Product=EHCI Host Controller
S: SerialNumber=0000:00:02.2
C:* #Ifs= 1 Cfg#= 1 Atr=40 MxPwr= 0mA
I: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 2 Ivl=256ms

========================
OHNE:
========================
T: Bus=03 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 3
B: Alloc= 0/900 us ( 0%), #Int= 0, #Iso= 0
D: Ver= 1.10 Cls=09(hub ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=0000 ProdID=0000 Rev= 2.06
S: Manufacturer=Linux 2.6.0 ohci_hcd
S: Product=OHCI Host Controller
S: SerialNumber=0000:00:02.1
C:* #Ifs= 1 Cfg#= 1 Atr=40 MxPwr= 0mA
I: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 2 Ivl=255ms

T: Bus=02 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 3
B: Alloc= 0/900 us ( 0%), #Int= 0, #Iso= 0
D: Ver= 1.10 Cls=09(hub ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=0000 ProdID=0000 Rev= 2.06
S: Manufacturer=Linux 2.6.0 ohci_hcd
S: Product=OHCI Host Controller
S: SerialNumber=0000:00:02.0
C:* #Ifs= 1 Cfg#= 1 Atr=40 MxPwr= 0mA
I: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 2 Ivl=255ms

T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=480 MxCh= 6
B: Alloc= 0/800 us ( 0%), #Int= 0, #Iso= 0
D: Ver= 2.00 Cls=09(hub ) Sub=00 Prot=01 MxPS= 8 #Cfgs= 1
P: Vendor=0000 ProdID=0000 Rev= 2.06
S: Manufacturer=Linux 2.6.0 ehci_hcd
S: Product=EHCI Host Controller
S: SerialNumber=0000:00:02.2
C:* #Ifs= 1 Cfg#= 1 Atr=40 MxPwr= 0mA
I: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 2 Ivl=256ms

========================

ThorstenHirsch
06.01.04, 15:14
Hmmm, das geht doch bestimmt auch mit nem X.509-Zertifikat, das man auf dem Stick hat. Oder?

floschuh
06.01.04, 15:21
Mit sicherheit!! Man muss den usbstick nur ständig mounten und unmounten, was ziemlich umständlich ist. Hab mir dazu mal ein script geschrieben

http://www.linuxforen.de/forums/showthread.php?s=&threadid=115136&highlight=usbstick

Läuft zwar über md5, aber das is ja Änderbar

msi
06.01.04, 16:09
Original geschrieben von floschuh
Mit sicherheit!! Man muss den usbstick nur ständig mounten und unmounten, was ziemlich umständlich ist. Hab mir dazu mal ein script geschrieben

http://www.linuxforen.de/forums/showthread.php?s=&threadid=115136&highlight=usbstick

Läuft zwar über md5, aber das is ja Änderbar

genau das sollte ich ja vermeiden, da man dann einfach den stick kopieren kann. Klar fällts auf, weil der normale user dann nicht mehr reinkommt (falls der wert ständig geändert wird), aber trotzdem will ich das genau so nicht haben, es ist einfach zu leicht kurz mal den inhalt zu kopieren.



T: Bus=02 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#= 8 Spd=12 MxCh= 0
D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=0c76 ProdID=0007 Rev= 1.00
S: Manufacturer=GENERIC
S: Product=USB Mass Storage
S: SerialNumber=USB000000001
C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=100mA
I: If#= 0 Alt= 0 #EPs= 3 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
E: Ad=81(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms
E: Ad=02(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms
E: Ad=83(I) Atr=03(Int.) MxPS= 8 Ivl=10ms

von welchem hersteller ist denn dein stick? hast du vielleicht noch andere um zu testen ob bei denen die SerialNumber richtig angezeigt wird?
denn so wies aussieht wird der stick nicht erkannt.

Kip
06.01.04, 17:23
Original geschrieben von msi
genau das sollte ich ja vermeiden, da man dann einfach den stick kopieren kann. Klar fällts auf, weil der normale user dann nicht mehr reinkommt (falls der wert ständig geändert wird), aber trotzdem will ich das genau so nicht haben, es ist einfach zu leicht kurz mal den inhalt zu kopieren.

... dann sollte man mal schaun ob es nicht möglich ist eine kombination aus beidem zu realisieren. D.h. ID des USB Sticks + passendes Zertifikat ... will das demnächst auch mal ausprobieren und werde das auf jeden Fall mal testen ...

msi
06.01.04, 18:44
Original geschrieben von Kip
... dann sollte man mal schaun ob es nicht möglich ist eine kombination aus beidem zu realisieren. D.h. ID des USB Sticks + passendes Zertifikat ... will das demnächst auch mal ausprobieren und werde das auf jeden Fall mal testen ...

jo das wollte/werde ich auch machen, aber vorerst will ich erstmal schauen, dass man das ganze auch bei ltsp hernehmen kann.

msi
06.01.04, 22:06
So hier ist das Script in der Version 0.3.

Changelog:
- Es wird ein Bild anstatt der xmessage benutzt (der Pfad muss im Script angepasst werden)
- beim Einloggen wird eine Nachricht angezeigt
- kurz vorm Ausloggen (gezwungen durch stop oder durch ziehen des Sticks) erschein auch eine Message
- start und stop Code verbessert
- code Fehler ausgebessert
- script auf strict mode gestellt
- script im Bootmodus getestet (link muss im rc.d verzeichnis existieren) und kleine Fehler ausgebessert
- sessreg wird benutzt um den systemlogs mitzuteilen, dass ein user da ist (wtmp und utmp)

edit:
was jetzt neu benötigt wird ist xli, ein programm das Bilder darstellt.