Informatik und Kram

Da wir lange nicht wußten, wo wir das für die Uni ausgearbeitete Material unterbringen sollten und auch einen schrecklichen Drang hatten der Welt diverse Sachen aufzudrücken...

Laptop sperren mit dem Kartenleser
de-flagge aktiviert en-flagge deaktiviert

So ziemlich jeder neue Laptop kommt heute mit einem Kartenleser. Warum diesen Slot nicht dafür verwenden, um sein System zu sperren, wenn die Karte entfernt wird? Anfang des Jahres versuchten wir uns da schon einmal dran, was sich dann aber irgendwie im Sand verlaufen hat. Doch jetzt ist es endlich geschafft, ich bin schon fast 100% zufrieden und stell euch hier meine Arbeit mal vor. Ziel: Computer nur hochfahren, wenn die Karte eingesteckt ist, beim entfernen Sound muten, Screensaver starten und als Bonus sozusagen su ohne Passwortabfrage!

Vorraussetzungen

Natürlich sollte der Laptop über einen Cardreader verfügen, sonst macht der ganze Spaß keinen Sinn. Dieser wird dann anschließend von einer SD-Karte blockiert, aber ich benutze den Slot ohnehin nicht so oft. Und wenn doch, dann stoppe ich eben den Daemon und kann ganz normal damit arbeiten.

PAM

Als Grundlage dient uns hier der PAM (Pluggable Authentication Modules) für Linux und das dafür passende pam_usb Modul. PAM sind eine Softwarebibliothek, die eine allgemeine Programmierschnittstelle (API) für Authentisierungsdienste zur Verfügung stellt. Grob erklärt: Software braucht ne Benutzeridentifizierung, fragt bei PAM an, wie der Benutzer sich authentifizieren soll, macht das und bekommt anschließend ne Rückmeldung, ob die Erkennung funktioniert hat. Für PAM gibt es viele Module, die uns alle bekannte Passworteingabe, aber auch Fingerabdruckscanner werden unterstützt. Für uns ist jetzt das PAM_USB Project von Interesse. Mit pam_usb kann man sich am Computer mit einem USB Stick authentifizieren. Aber eine SD-Karte ist kein USB- Stick, also müssen wir da etwas tüdeln.

PAM_USB installieren

Die Quelldateien zu pam_usb gibt es hier. Nachdem man diese entpackt hat, muss man nur eine Kleinigkeit editieren. pam_usb prüft bei einem eingesteckten USB- Stick 3 Dinge über HAL: Die Seriennummer, den Hersteller und die Produkt-ID. Eine eingesteckte SD- Karte bietet aber nur die Seriennummer, die aber meiner Meinung nach vollkommen ausreichen sollte. Also müssen die beiden anderen Zeilen gelöscht werden, und zwar mit:
sed -i /opts-\>device.model,/d src/device.c
sed -i /opts-\>device.vendor,/d src/device.c
Danach kann man das Paket wie gewohnt übersetzen. Aus dem Ordner Tools brauchen wir nur den pamusb_agent. pamusb_conf funktioniert dann nicht mehr für uns, aber so eine Konfigurationsdatei kann man auch ohne Probleme von Hand erstellen. Installiert? Na super, dann kann es weiter gehen!
Du benutzt Archlinux? Man hast du ein Glück, hier gibts die PKGBUILD!

System konfigurieren

Zuerst einmal muss man die Serialnumber der Karte herausbekommen. Dazu lässt man die Karte aus dem Reader, macht ein ls /dev/disks/by-uuid/*, steckt die Karte wieder ein und schon hat man die UUID. Die Serial erhält man dann zum Beispiel so:
 
`--> hal-device| grep -A 10 -B 10 <uuid hier eintragen>
block.storage_device = '/org/freedesktop/Hal/devices/storage_serial_Y
finden wir die Serialnumber (eben das Y in der Form 0x123234234) der Karte. Das kann sich etwas hinziehen, bis man die richtige Nummer herausgefunden hat, aber was soll ich sagen, es lohnt sich ^^

/etc/pamusb.conf

Jetzt müssen wir die Karte in die Konfigurationsdateien von pam_usb eintragen.
<devices>
  <defaults>
    <option name="one_time_pad">false</option> 
  </defaults>

  <device id="MyKeyCard">
      <serial>EURE_SERIAL</serial>
      <volume_uuid>EURE_UUID</volume_uuid>
      <option name="debug">disable</option>
  </device>
</devices>
One-time-pad kann noch mal ein zusätzlicher Schutz sein, aber funktioniert so nicht mit unserer modifizierten Version von pam_usb, also deaktivieren wir das einfach mal.
Jetzt müssen wir noch den Benutzer einrichten, der diese Karte benutzen kann. Dazu trägt man in die Konfigurationsdatei noch folgendes ein:
<users>
  <user id="DEIN_BENUTZERNAME">
    <device>MyKeyCard</device>
    <option name="one_time_pad">false</option>
  </user>
  <user id="root">
    <device>MyKeyCard</device>
    <option name="one_time_pad">false</option>
  </user>
</users>
Das wars auch schon. Aber bevor man jetzt schön weiter konfiguriert, erst mal testen, ob das alles funktioniert. Dazu tippert man einfach folgendes ein, natürlich mit eingesteckter SD- Karte:
`--> pamusb-check andieh
* Authentication request for user "andieh" (pamusb-check)
* Device "MyKeyCard" is connected (good).
* Access granted.
Sollte hier etwas nicht stimmen, puh ja, keinen Plan. Das hat bei mir einfach alles geklappt. Einfach noch mal sicher gehen, das man die richtige Serial / UUID angegeben hat. Man kann auch das pamusb_conf Tool benutzen, dafür sind aber auch ein paar Modifikationen nötig, damit das funktioniert. Ansonsten schreibt hier einfach mal was in die Kommentare, vielleicht kann ich helfen.

Computer sperren

Im Moment sitze ich den ganzen Tag in der Bibliothek und lerne für meine Diplomprüfung. Der Laptop ist mit einem Kensington Schloss festgebunden. Die Oberfläche locke ich, indem ich einfach meine SD- Karte mitnehme, das ist äußerst praktisch!
Das Zauberwort heißt hier pamusb-agent, der seine Konfiguration auch aus der /etc/pamusb.conf bezieht. Dort kann man beliebige Befehle eintragen, die er beim rauswerfen oder einstecken der Karte ausführen soll. Als Screensaver ist hier der gnome-screensaver besonders geeignet, auch wenn der so mies zu konfigurieren ist und eigentlich eh total schlecht ist. Aber für meine Zwecke reichts! Also einfach folgendes in die pamusb.conf, unter den Benutzer, der eben gerade eingeloggt ist:
<agent event="lock">gnome-screensaver-command --lock</agent>
<agent event="lock">amixer set Master toggle</agent>
<agent event="unlock">gnome-screensaver-command --deactivate</agent>
<agent event="unlock">amixer set Master toggle</agent>
Der amixer Befehl muted noch meine Soundkarte. Ganz praktisch, wenn man den Rechner daheim laufen lassen will und mal schnell weg muss. Die Musik ist auch gleich mit aus!
Damit dann beim auswerfen und einstecken die Befehle ausgeführt werden, muss man pamusb_agent noch beim starten eures WM gestartet werden.

automatisch Authentifizieren

Naja hier noch die bequemste Neuerung für uns mit pam_usb. Mit Linux arbeitet man immer nur als User, niemals als root (Ja genau, speyer!). Einen Befehl führt man dann mit su -c "Befehl" nur temporär als root aus. Und mich fuckt das schon ab, jedesmal das Passwort eingeben zu müssen. Also nehmen wir dafür einfach pam_usb! Also schnell die entsprechende Konfigurationsdatei geöffnet (/etc/pam.d/su) und fügen folgende Zeile gleich am Anfang ein:
auth 		sufficient	pam_usb.so
Den Rest kann man einfach so lassen, das hat nämlich den Vorteil, das wenn die Karte mal kaputt ist, oder irgendwas nicht klappt, man immer noch ganz normal nach dem Passwort gefragt wird. Jetzt kann man übrigens ein schönes langes Passwort für den Benutzer root vergeben, schließlich muss man das nicht mehr so oft eingeben.
Ich liebe es, es klappt so wunderbar:
`--> mkdir /deine_muddi
mkdir: cannot create directory `/deine_muddi': Permission denied
.-(~)--------------------------------------------------(andieh@herkules)-
`--> su -c "mkdir /deine_muddi"
* pam_usb v0.4.2
* Authentication request for user "root" (su)
* Device "MyKeyCard" is connected (good).
* Access granted.
Padautz! Damit das funktioniert, muss aber in der /etc/pamusb.conf der Benutzer root angelegt sein. An alle Sicherheitsfanatiker: Ich hab mich von außen per ssh auf meinen Laptop verbunden und ja, su fragt dann immer noch nach dem Passwort. Wäre auch zu schön gewesen :D

automatisch Einloggen

Bisher habe ich nach dem Starten immer GDM geladen und musste mein Passwort angeben. Auch hier gibt es die Möglichkeit, pam_usb zu verwenden, dann gibt man nur seinen Benutzernamen ein und sein WM wird geladen. Konfiguriert man GDM noch so, das er automatisch einen Benutzer einloggen soll, dann sind wir schon so gut wie fertig. Karte eingesteckt beim booten -> ready to work, Karte draußen -> wir brauchen ein Passwort.
Wer aber komplett nur mit Karte booten will, der geht folgendermaßen vor: Beim booten wird, bevor GDM überhaupt gestartet wird, erstmal überprüft, ob die Karte eingesteckt ist. Ist das nicht der Fall, zeigen wir über den Framebuffer direkt ein Bild an, das uns an das Einstecken erinnert. Wird dann die Karte eingesteckt, starten wir den GDM- Daemon, der uns automatisch einloggt.
Das ganze ist ein wenig tricky. Damit das Anzeigen des Bildes nicht abgebrochen werden kann, muss man das ganze in eine while Schleife verpacken. Aber wie kommt man da wieder raus? Man braucht also 2 Dateien. Eine, die das Bild (startup_showimage) anzeigt, und eine (startup_checkcard), die auf die Karte wartet und dann gdm startet!
Zuerst legt man eine Datei startup_showimage an, die uns das Bild im Framebuffer anzeigt.
#!/bin/bash
/pfad/zu/startup_checkcard &
while true; do
  fbi --noverbose /pfad/zum/bild/waiting.jpg
done
Diese Datei startet dann sofort startup_checkcard, führt diese Datei aber im Hintergrund aus. Die while Schleife verhindert, das man fbi einfach beenden könnte und dann ganz normal das System geladen wird.
Die Datei startup_checkcard sieht dann so aus:
#!/bin/bash

unplugged=1
while [ $unplugged == 1 ]; do
    pamusb-check --quiet DEIN_BENUTZERNAME
    if [ $? == 0 ]; then
      unplugged=2
      sleep 1
      killall startup_showimage
      kill `pidof fbi`
      sed -i "s/\(^AutomaticLoginEnable=\).*/AutomaticLoginEnable=true/" /etc/gdm/custom.conf
      /etc/rc.d/gdm start &

      sleep 5
      sed -i "s/\(^AutomaticLoginEnable=\).*/AutomaticLoginEnable=false/" /etc/gdm/custom.conf

    else
      sleep 2
    fi
done;
Die Datei ist meiner Meinung nach selbsterklärend. pamusb_check prüft, ob die Karte eingesteckt ist, wenn ja, beendet es fbi und unser startup_showimage. Anschließend wird gdm gestartet. Nach einer kurzen Wartezeit ändert es aber die GDM Konfiguration so, das sich GDM nicht mehr automatisch einloggt. Sicherheit und so.
Nach dem erzeugen der Datei nicht vergessen, die Dateien ausführbar zu machen (mit chmod +x). Jetzt wie gesagt nur noch startup_showimage beim starten eurer Distribution zu laden. Bei Archlinux fügt man einfach den Pfad zur Datei in die /etc/rc.local.
ACHTUNG: Checkt die Dateien lieber drei Mal! Lasst das alles mal so durchlaufen (in der Konsole), um sicher zu gehen, das alles funktioniert. Solltet ihr euch trotzdem aus eurem System aussperren, können wir da absolut gar nix zu!

Ausblick

Immer mehr Anwendungen benutzen PAM. Bei Arch gibt es leider keine "Standardkonfiguration", die alle Software automatisch das PAM_USB Modul benutzen lässt. Jede Software muss da von Hand freigeschaltet werden, was auch gut sein kann. Egal, mehr Software mit pam_usb, das is das Ziel!
Außerdem möchte ich in Zukunft noch meine /home/ Verschlüsseln, der Schlüssel dafür soll auf die SD- Karte, mounten dann natürlich auch nur, wenn die Karte drin ist. Aber das mach ich erst, wenn ich irgendwann mal die Zeit finde, mein System neu zu partitionieren / installieren.
Sonst bin ich aber rundum zufrieden. Die Zeit benutz ich jetzt erst mal zum testen, damit ich sichergehen kann, das alles richtig funktioniert, bevor ich dann irgendwann die Passwortabfrage komplett entferne und nur noch mit der Karte arbeite.
Außerdem brauch ich schleunigst neu weitere Karte als "Zweitschlüssel", sonst könnte das ganz fies enden!

Anhang

Die PKGBUILD für Archlinux:Mein Bild, das angezeigt wird, wenn man beim booten keine Karte eingesteckt hat (1280x768):Die komplette /etc/pamusb.confUnd noch die Datei startup_checkcard, startup_showimage kriegt noch jeder selber hin.

Kommentare

Das is ja echt geil, kann ich beliebige Sachen dann in pamusb.conf kloppen? also auch von mir aus nen EncFS mount inklusive nen 2048bit key auf der SD-Card? is ja deluxe

jipp!
Gerade beim Starten würde ich dann die Partitionen mounten. Über den pamusb-agent würde ich das dann aber nicht machen, weil schon eher schlecht, wenn die home auf einmal unmountet wird, wenn man noch eingeloggt ist. Hehe geht ja dann eh nicht. Bla bla

Ja eh nicht so die ganze Home, ich hab da nur son EncFS laufen, das ist auf FUSE aufgesetzt und effektiv nur ein File, was halt als EncryptedFS mountbar ist....

btw, wenn man mal die alte karte verliert, bzw. der access verwehrt wird, weil die Pad-Verification fehlschlägt,
einfach im home-verzeichnis das komplette .pamusb verzeichnis löschen, dann gehts wieder!

Ich finde die idee selber klasse aber ich habe das problem das ich selber windows nutzer bin und weder die programmiererischen fähigkeiten noch über das nötige wissen verfüge als das ich eine virtuelle maschiene auf einem linux basierendem system erstellen könnte um dann windows zu laden
habt ihr einen weg oder ein programm um das ganze auch für windows gängig zu machen?

Kommentar schreiben