• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst]luks-Schlüssel auf USB-Stick - udev-Regel

halo44

Hacker
Wer kann mir bei folgendem Problem helfen?

Ich habe auf meinem Notebook eine Datenpartition nach dieser Anweisung http://de.opensuse.org/SDB:Sicherheit_Verschlüsselung_mit_LUKS verschlüsselt. Das Mounten beim Systemstart funktioniert planmäßig mit pam_mount.

Auch das Bereitstellen der Partition im Pseudo-Verzeichnis für den NFSv4-Zugriff von meinem Desktop-Rechner aus klappt, dank der
Mithilfe von spoensche prima.

Da ich aber die verschlüsselte Partition nicht immer brauche, wenn ich den Notebook benutze, habe ich das automatische Mounten deaktiviert, indem ich die Angabe zum Volume in der /etc/security/pam_mount.conf.xml auskommentiert habe. Ich möchte die Partition dann bei Bedarf mittels eines USB-Sticks mounten.

Hierzu habe ich auf einem USB-Stick nach dieser Anweisung http://raftaman.net/?p=300#4-udev-auto-magic einen Schlüssel erstellt und als weiteren Schlüssel für die verschlüsselte Partition dorthin übertragen.

Danach habe ich eine udev-Regel erstellt, die den USB-Stick anhand seiner Seriennummer erkennt, wenn er eingesteckt wird und dann ein Skript ausführt, welches die verschlüsselte Partition mounten soll.

So weit, so gut. - Leider aber funktioniert die Ausführung des Skripts nicht. Dies liegt vermutlich an der unvollkommenen "Zusammenarbeit" der beiden Beteiligten.

Meine udev-Regel (in /etc/udev/rules.d/99-unlock-luks.rules) :

Code:
BUS=="usb", KERNEL=="sd?1", SYSFS{serial}=="12345678", SYMLINK+="usbstick", RUN+="/usr/local/bin/unlock-luks"

Im Skript (in /usr/local/bin/unlock-luks) steht :

Code:
#!/bin/bash
dd if=/dev/usbstick bs=512 skip=4 count=8 | cryptsetup luksOpen /dev/sda8 geheim --key-file=- && mount /dev/mapper/geheim /Datenpartition

Wie gesagt: die Erkennung des Sticks gelingt und auch die Ausführung des Skripts funktioniert, wenn ich einen beliebigen anderen Befehl ins Skript einstelle (z.B. cp oder rm).

Das Skript ist auch syntaktisch in Ordnung. Wenn ich es nämlich "händisch" aufrufe mit

Code:
sudo sh /usr/local/bin/unlock-luks
wird die verschlüsselte Partition prompt gemountet.

Ich habe irgendwo (?) gelesen, daß in ein Skript, welches über udev gestartet wird, nur jeweils ein Befehl ausgeführt werden kann. Sehr wohl sollen aber mehrere Skripte hintereinander ausführbar sein. Aber auch ein Versuch in dieser Richtung verlief negativ.

Kann mir vielleicht jemand weiterhelfen? Hab ich was vergessen? Z.B. Distribution openSuse 12.1, KDE 4.7.2.

Ich wünsche Euch einen guten Rutsch.

Gruss H.
 

spoensche

Moderator
Teammitglied
halo44 schrieb:
BUS=="usb", KERNEL=="sd?1", SYSFS{serial}=="12345678", SYMLINK+="usbstick", RUN+="/usr/local/bin/unlock-luks"

Die Udev Regel stimmt so nicht ganz. Du verwendest den Bus-Typ für die Ermittlung, was aber nicht ausreicht, weil ein USB- Gerät auch eine BusID bekommt, damit das System weis, an welcher Adresse das Gerät angesprochen werden kann.

Die eigentliche Erkennung/bzw. der Zugriff erfolgt über ein Subsystem.

Folgende Regel sollte passen: (habe sie nicht getestet)
Code:
SUBSYSTEM=="block", ACTION=="add", ENV{product}==1234, ENV{vendor}==vendorid, SYMLINK+="usbstick", RUN+=/usr/local/bin/unlock-luks
 
OP
H

halo44

Hacker
josef-wien schrieb:
Trage im Skript jedes Programm mit dem vollen Pfad ein.

Wenn ich Dich richtig verstehe, muß mein Skript so aussehen :

Code:
    #!/bin/bash
    /bin/dd if=/dev/usbstick bs=512 skip=4 count=8 | /sbin/cryptsetup luksOpen /dev/sda8 geheim --key-file=- && /bin/mount /dev/mapper/geheim /Datenpartition

Das habe ich leider ohne Erfolg versucht.

Gruss H.
 
OP
H

halo44

Hacker
spoensche schrieb:
halo44 schrieb:
BUS=="usb", KERNEL=="sd?1", SYSFS{serial}=="12345678", SYMLINK+="usbstick", RUN+="/usr/local/bin/unlock-luks"

Die Udev Regel stimmt so nicht ganz. Du verwendest den Bus-Typ für die Ermittlung, was aber nicht ausreicht, weil ein USB- Gerät auch eine BusID bekommt, damit das System weis, an welcher Adresse das Gerät angesprochen werden kann.

Die eigentliche Erkennung/bzw. der Zugriff erfolgt über ein Subsystem.

Folgende Regel sollte passen: (habe sie nicht getestet)
Code:
SUBSYSTEM=="block", ACTION=="add", ENV{product}==1234, ENV{vendor}==vendorid, SYMLINK+="usbstick", RUN+=/usr/local/bin/unlock-luks

Ich werde Deine Anregung jetzt versuchen. Allerdings habe ich nicht das Problem, daß mein Gerät nicht erkannt wird.

Beim Stecken des Geräts wird es erkannt und unter /dev als "usbstick" eingetragen.

Wie ich schon schrieb, wird auch das Skript ausgeführt, wenn ich beliebige andere Befehle ausführe. So funktionierte z.B. folgendes Skript :

Code:
#!/bin/bash
rm test.txt

Nur mein Skript

Code:
    #!/bin/bash
    dd if=/dev/usbstick bs=512 skip=4 count=8 | cryptsetup luksOpen /dev/sda8 geheim --key-file=- && mount /dev/mapper/geheim /Datenpartition
ignoriert die Suse kaltherzig. Das trifft leider auch auf das nach josef-wien modifizierte Skript zu.

Trotzdem werde ich heute noch Deine Anregungen für die udev-Regel versuchen.

Ich berichte dann.

Gruss H.
 
OP
H

halo44

Hacker
Hallo spoensche,

auch mit Deiner Version der Regel

Code:
SUBSYSTEM=="block", ACTION=="add", ENV{ID_MODEL}=="Flash_Disk", ENV{ID_VENDOR}=="Generic", SYMLINK+="usbstick", RUN+="/usr/local/bin/unlock-luks"
wird der Stick erkannt und ihm wird /dev/usbstick zugewiesen.

Leider aber wird auch hiermit das Skript nicht ausgeführt.

Guten Rutsch wünscht Dir H.
 
OP
H

halo44

Hacker
Das Problem ist gelöst :

josef-wien gab mir den Hinweis, jeden Befehl im Skript mit dem vollen Pfad aufzurufen. Das war schon die halbe Lösung.

Vielleicht habe ich aber auch nur die Hälfte verstanden. Nicht nur im Skript muß jeder Befehl mit dem vollen Pfad gerufen werden - auch das Skript selber ist mit vollem Pfad aufzurufen, d.h. /bin/sh Pfad-zum-Skript :

Code:
BUS=="usb", KERNEL=="sd?1", SYSFS{serial}=="12345678", SYMLINK+="usbstick", RUN+="/bin/sh /usr/local/bin/unlock-luks"
Vielen Dank an meine Helfer.

Gruss H.
 

josef-wien

Ultimate Guru
halo44 schrieb:
auch das Skript selber ist mit vollem Pfad aufzurufen
Ein Skript ist üblicherweise als ausführbar definiert, dann reicht es, es mit /pfad/skriptname aufzurufen. Um ein nicht ausführbares Skript (wer rechnet schon damit?) durchzuführen, verwendet man das Programm /bin/bash (oder eine der darauf zeigenden Verknüpfungen) und übergibt den Namen des Skripts als Parameter.

halo44 schrieb:
BUS==..., SYSFS{serial}==...
Du verwendest Begriffe, die (wie Du auch /var/log/messages entnehmen kannst) in einiger Zeit nicht mehr möglich sein werden.
 
OP
H

halo44

Hacker
josef-wien schrieb:
... Um ein nicht ausführbares Skript (wer rechnet schon damit?) durchzuführen ...

Bei Anfängern :eek:ps: wie mir, muß man offensichtlich mit allem rechnen.

Ich habe etliche Versuche mit verschiedenen Skripten gemacht und auch anfangs darauf geachtet sie ausführbar zu machen. Bei irgendeinem "Zwischen-Skript" aber muß wohl diese Markierung verlorengegangen sein und ich habe sie weiter mitgeschleppt. - Asche auf mein Haupt!

josef-wien schrieb:
Du verwendest Begriffe, die (wie Du auch /var/log/messages entnehmen kannst) in einiger Zeit nicht mehr möglich sein werden.
Danke für den Hinweis. Ich werde mich schlau machen.

Gruss H.
 
OP
H

halo44

Hacker
So, ich habe mich schlau gemacht und meine Regel inzwischen angepasst. Und sie läuft zuverlässig.

Ich melde mich nur deshalb noch mal zu Wort, weil ich Euch noch mitteilen will, daß ich die Regel inzwischen auch erfolgreich auf das Entfernen des USB-Sticks erweitert habe.

Im Netz finden sich fast ausschliesslich Beiträge, in denen Klage darüber geführt wird, daß zwar das Einstecken des Sticks, aber nicht seine Entfernung erkannt werden. Vielfach wird erwähnt, daß nach Entfernen des Sticks Informationen über dessen Eigenschaften verloren gegangen sind.

Dies trift nur teilweise zu. In meinem Fall blieb z.B. der Inhalt der udev-Variablen ID_VENDOR und ID_SERIAL_SHORT erhalten, während der Inhalt der Variablen ID_MODEL wechselte. Beim Einstecken war der Wert "Flash_Disk", nach dem Entfernen "Mass_Storage".

Hier meine neue udev-Regel :

Code:
SUBSYSTEM=="block", ACTION=="add", ENV{ID_MODEL}=="Flash_Disk", ENV{ID_VENDOR}=="Generic", ENV{ID_SERIAL_SHORT}=="12345678", SYMLINK+="usbstick", RUN+="/bin/sh /usr/local/bin/unlock-luks"
ACTION=="remove", ENV{ID_VENDOR}=="Generic", ENV{ID_SERIAL_SHORT}=="12345678",RUN+="/bin/sh /usr/local/bin/umount-luks"

Vielleicht kann ich ja mit der Einstellung des Beitrags einem Suchenden helfen :roll: - weil ich selber laaaange gesucht habe, bis mir "udevadm" geholfen hat.

Gruss H.
 
Oben