PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [howto] udev, dmcrypt und was man damit machen kann



MiGo
31.03.05, 09:36
Einleitung
Dieses How-To beschäftigt sich damit, beim Anstecken eines USB-Gerätes automatisch eine verschlüsselte Partition (geht allerdings auch mit einem Container) einzuhängen, der beim Abziehen des Gerätes wieder verschwindet.
Warum dieses How-To? Weil ich ein fauler Mensch bin. Und faule Menschen mögen keine Verschlüsselung, das ist zu viel Arbeit, jedes mal die Passwörter einzugeben. Also will ich meine Passwörter auf einem USB-Stick unterbringen, und meine Verschlüsselten Partitionen einhängen, indem ich einfach den Stick einstecke.

Es gibt schon eine Anleitung dieser Art von mir, letzes mal allerdings mit devfs und loop-aes. Da nun sowohl in der Verschlüsselung als auch im Umgang mit Gerätedateien "die nächste Generation" ansteht, dieses Update.

MiGo
31.03.05, 09:37
Dieses How-To ist unter Debian und für Debian geschrieben, und unter keiner anderen Distribution gestestet. Ich habe nämlich gerade keine andere :). Wenn jemand die Pfadewegen seiner Distribution anpassen muss, bitte ich um eine PN und werde die Distributionsspezifischen Pfade hier erwähnen
Ich habe eine verschlüsselte Partition /dev/hdb2 und einen USB-Stick der Firma "Twinmos", auf dem die Passwörter gepeichert werden sollen. /dev/hdb2 ist mittels dm-crypt verschlüsselt, und auf dem USB-Stick befindet sich eine Datei namens "twinpass", die das Passwort zu der Partition enthält.
Die Mountpunkte für die verschlüsselte Partition und den USB-Stick sind /mnt/crypt und /mnt/twinmos.

Ausserdem gehe ich davon aus, dass udev,dm-crypt sowie alle eventuell benötigten Kerneleinstellungen installiert und lauffähig sind. Für udev brauch man meiner Erinnerung nach nur die Pakete "udev" und "hotplug", dmcrypt erfordert das Paket "cryptsetup". Unter Debian sollte also ein "apt-get install udev hotplug cryptsetup" alle benötigten Pakete installieren.

Die Einrichtung von udev und dm-crypt werde ich hier nicht erklären; dazu gibt es genug Anleitungen im Netz und im Forum. Nützliche Links zu How-Tos:
http://glasnost.beeznest.org/articles/186 (Umstieg von devfs auf udev unter Sarge)
http://www.reactivated.net/udevrules.php
http://gentoo-wiki.com/HOWTO_dmcrypt

MiGo
31.03.05, 09:39
1.1 Verschlüsselte Partition einrichten
Die zu verschlüsselnde Partition liegt auf /dev/hdb2. Also werden erstmal alle Daten gesichert und die Partition verschlüsselt eingehängt:
cryptsetup -y create twincript /dev/hdb2
Danach wird die Partition mit "mkfs.ext2 /dev/mapper/twincrypt" formatiert, mittels "mkdir /mnt/crypt" der zugehörige Mountpunkt erstellt und mit "mount /dev/mapper/twincrypt /mnt/crypt" hängt man die Partition ein. Jetzt kann man, wenn man tapfer ist, seine Daten schon wieder zurückspielen.
Danach wird die Partition wieder ausgehängt ("umount /mnt/crypt") und die Verschlüsselung aufgehoben ("cryptsetup remove twincrypt").

1.2 ..und der Schlüssel
Der USB-Stick wird wie gewohnt eingehängt und mittels "echo MeinGeHeimEsPassWort > /mnt/usbstick/twinpass" legen wir die Datei mit dem Passwort an. Das sollte idealerweise exakt das gleiche Passwort sein, das wir beim Erstellen der verschlüsselten Partition verwendet haben :D.
Der Stick wird danach ausgehängt und abgezogen.

MiGo
31.03.05, 09:40
2.1 Informationen sammeln
Als erstes brauchen wir Informationen über den USB-Stick, den wir als Schlüssel verwenden wollen, um das Plugin-Script möglichst auf dieses eine Gerät zuzuschneiden. Die benötigten Informationen liefern uns die Befehle "dmesg" und "lsusb -v" als root:

dmesg ergibt:


usb 4-4.3: new high speed USB device using ehci_hcd and address 17
scsi9 : SCSI emulation for USB Mass Storage devices
usb-storage: device found at 17
usb-storage: waiting for device to settle before scanning
Vendor: USB 2.0 Model: Mobile Disk N4S Rev: 1.00
Type: Direct-Access ANSI SCSI revision: 02
SCSI device sda: 253952 512-byte hdwr sectors (130 MB)
sda: assuming Write Enabled
sda: assuming drive cache: write through
SCSI device sda: 253952 512-byte hdwr sectors (130 MB)
sda: assuming Write Enabled
sda: assuming drive cache: write through
sda: sda1
Attached scsi removable disk sda at scsi9, channel 0, id 0, lun 0
Attached scsi generic sg0 at scsi9, channel 0, id 0, lun 0, type 0
usb-storage: device scan complete

Das sagt uns erstmal nur, dass der Stick vorschriftsmässig erkannt worden ist. Hilft uns nur bedingt weiter.


"lsusb -v" ist da schon hilfreicher:


Bus 004 Device 017: ID 126f:1325 TwinMOS Mobile Disk
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x126f TwinMOS
idProduct 0x1325 Mobile Disk
bcdDevice 1.00
iManufacturer 16 TTI-WDE
iProduct 32 USB 2.0 Mobile Disk
iSerial 48 FF04120300020
.
[Rest gekürzt]
.

Und siehe da, interessant ist in erster Linie die Variable iSerial. Sollte die nicht gesetzt sein, helfen uns auch iManufacturer und iProduct weiter.
Sollte der Befehl "lsusb" fehlen, lässt er sich mit "apt-get install usbutils" nachinstallieren.


2.2. Die udev-Regel
Damit können wir jetzt eine udev-Regel zusammenbauen. Diese Regeln liegen in /etc/udev/rules.d/*.rules und werden in alphabetischer Reihenfolge abgearbeitet. Damit unsere Regel möglichst früh ausgeführt wird, sollte daher die Datei, die unsere Regeln enthält am besten mit "a" anfangen ;)
Diese Regeln folgen immer dem Aufbau
Schlüssel=Wert[, Schlüssel=Wert, ...] Devicename [, Link zu dem Device]
ein Beispiel:
BUS="usb", KERNEL="sd?1",SYSFS{serial}="23DE7394D4E2CD0A" , NAME="%k", SYMLINK="player"
Das Gerät hängt also am USB-Bus, findet sich normalerweise unter /dev/sdX1 und bekommt einen Symlink nach /dev/player. Jedes der Schlüssel/Wert-Paare muss passen, damit die Regel auch angewandt wird.

Die Datei "/etc/udev/rules.d/atwinmos.rules" erstellen wir also mit folgenden Inhalt:


BUS="usb", KERNEL="sd?1",SYSFS{serial}="FF04120300020" , NAME="twinmos"

Somit sollte beim Einstöpseln der Stick unter /dev/twinmos auftauchen.
Wir erkennen iSerial wieder, die in diesem Fall das Gerät eindeutig identifiziert. Als Alternative könnten wir auch idVendor oder idProduct verwenden (-> SYSFS{idVendor}="126f"). Man kann auch weitere USB-Sticks oder Geräte in diese Datei packen, für jedes Gerät eine eigene Datei anzulegen ist unnötig (und unsinnig, weil jedesmal alle Dateien durchsucht werden...)
Nachdem die Datei erstellt ist, testen wir das Ganze. "/var/log/syslog" sollte nach dem Einstecken des Sticks in etwa so aussehen:


Mar 30 22:39:19 localhost udev[12869]: creating device node '/dev/sda'
Mar 30 22:39:19 localhost udev[12870]: configured rule in '/etc/udev/rules.d/atwinmos.rules[1]' applied, 'sda1' becomes 'twinmos'
Mar 30 22:39:19 localhost udev[12870]: creating device node '/dev/twinmos'
Mar 30 22:39:19 localhost udev[12872]: creating device node '/dev/sg0'


Jetzt basteln wir uns noch einen passenden Mountpunkt dazu, und damit ist der erste Teil erledigt: "mkdir /mnt/twinmos"

MiGo
31.03.05, 09:41
udev kann - wie hotplug - ein oder mehrere Scripte beim Einstecken des Gerätes ausführen. Diese liegen in /etc/dev.d und folgen der Namensregel "/etc/dev.d/$(DEVNAME)/*.dev". Wie bei udev üblich werden die Scripte im Verzeichnis - sofern sie den Namensregeln folgen - in alphabetischer Reihenfolge ausgeführt.
Weitere Möglichkeiten, Scripte unterzubringen sind /etc/dev.d/$(SUBSYSTEM)/*.dev (z.B. "net") und /etc/dev.d/default/*.dev.

Unser Device heisst "twinmos", also legen wir das Verzeichnis /etc/dev.d/twinmos an und erstellen darin unser Script "twinmos.dev" (hm, wer hätte diesen Namen vermutet..).

3.1 Mount-Script erstellen
Dem Script stehet u.A. die Variable $ACTION zur Verfügung; sie nimmt den Wert "add" oder "remove" an, je nachdem, ob das Gerät gerade angesteckt ("add")oder entfernt worden ("remove") ist.
Damit bietet sich folgendes Script an:



#!/bin/sh
if [ $ACTION = "add" ];
then
# usb-stick einhängen
mount /dev/twinmos /mnt/twinmos

# Datei mit Passwort verwenden, um die verschlüsselte Partition zu entschlüsseln
cat /mnt/twinmos/twinpass|cryptsetup create twincrypt /dev/hdb2

# und einhängen.
mount /dev/mapper/twincrypt /mnt/crypt

#und den stick wieder entsorgen
umount /mnt/twinmos --force

fi;


if [ $ACTION = "remove" ];
then

#*

# Partition aushängen
umount /mnt/crypt --force

# und das dm-crypt-Gerät entfernen
cryptsetup remove twincrypt

fi;


* Eventuell bietet sich auch noch folgender Zusatz an:


#erst zart
for i in `lsof /mnt/crypt |grep -v PID |awk '{print $2 }'`; do kill $i; done;
sleep 1;

#dann hart.
for i in `lsof /mnt/crypt|grep -v PID |awk '{print $2 }'`; do kill -9 $i; done;

Das sollte (vermutlich) brachial jeden Prozess töten, der das Aushängen von /mnt/crypt eventuell behindert. Ist allerdings ungetestet.


Und damit endet diese Anleitung. Das war zwar viel Arbeit, aber wenn auch nur ein User "des anderen BS" beim Vorführen dieser Faulen-Verschlüsselung sagt: "Das ist ja toll! Und wie mache ich das?" hat sich die Arbeit gelohnt.
Bei Lob, Kritik oder Ergänzungen bitte PM an mich. Auch wenn einer weiss, _wie_ man das unter Windows macht. Ich weiss es nämlich nicht ;)

BSM
09.05.07, 15:46
Habe gerade mal versucht das ganze auf Ubuntu Feisty zu übertragen und bin mal spontan gescheitert :)

Meine Probleme:

Liegt wohl an einer anderen (neuren?) udev Version, hier steht wie man udev unter Feisty konfiguriert: http://ubuntuforums.org/showthread.php?t=398073

In der udev .rules Datei muss sowas drinstehen:

SUBSYSTEMS=="usb", ATTRS{serial}=="DEF10CC005D7", KERNEL=="sd?1", NAME="firelite", SYMLINK="usbdevices/firelite"

Das zweite Problem war bei mir das aushängen der Partition. So sieht bei mir jetzt die .rules Datei aus:


root@robert:/etc/udev/rules.d# cat 21-afujitsustick_mountcrypt.rules
ACTION=="add",SUBSYSTEMS=="usb", ATTRS{serial}=="2848604190992E48", KERNEL=="sd?2", NAME="cryptstick", RUN+="/home/rob/bin/openmp3",ENV{cryptstick}="%p"
ACTION=="remove", ATTRS{serial}=="2848604190992E48", RUN+="/home/rob/bin/closemp3"


Weiterhin würde ich NIEMALS einfach das Passwort auf den USB Stick legen und dort versauern lassen. Wenn jemand den USB Stick klaut, lacht man dich im besten Fall noch aus weil dein Passwort so niedlich ist.
Am besten erstellt man ein 128 oder auch 2048Bittiges garantiert zufälliges Passwort, welches man zusätzlich mit GPG verschlüsselt. Beim anstecken des Sticks kommt nun eine Passwortabfrage, welche das Passwort entschlüsselt und die Partition einhängt.
Z.Zt. arbeite ich daran, wie man dieese Passwortabfrage am besten hinbekommt (mit einem zweiten Stick :D :ugly: ).

-robert