Verschluesselung: dm-crypt/luks unter openSUSE
Inhaltsverzeichnis
Verschlüsselung: dm-crypt/luks unter openSUSE
Dieser Artikel beschreibt das Verschlüsseln einer /home-Partion mit cryptsetup (mit LUKS-Erweiterung) mit einem Key-File,
das auf einer ebenfalls verschlüsselten Partition auf einem USB-Stick gespeichert ist und während des Bootvorgangs eingebunden wird.
Dabei wird für den USB-Stick ein Passwort abgefragt, um eine Partition zu mounten, auf der verschiedene Schlüssel liegen,
mit denen weitere Partitionen automatisch eingebunden werden können.
Des Weiteren wird beim Booten eine verschlüsselte swap-Partitionen angelegt.
Hinweis: |
Dieser Artikel beschreibt die Einrichtung einer verschlüsselten Partition unter openSUSE, |
Allgemeines
Voraussetzungen
Installation von cryptsetup (mit LUKS-Erweiterung)
Unter openSUSE 10.2 ist das Programm cryptsetup im Paket
util-linux-crypt
enthalten.
Bis einschließlich SuSE Linux 10.1 gibt es das Paket
cryptsetup-luks
bei Packman.
Unterstützung von dm-crypt und AES im Kernel
Um den Device-Mapper dm-crypt und AES-Verschlüsselung zu nutzen, müssen folgende Optionen im Kernel aktiviert sein:
Code maturity level options ---> [*] Prompt for development and/or incomplete code/drivers Device Drivers --> RAID and LVM Support --> [*] Multiple devices driver support (RAID and LVM) <M> Device mapper support <M> Crypt target support Cryptographic Options --> <M> AES cipher algorithims (i586) <M> SHA256 digest algorithm
Diese Optionen sind im SUSE-Standardkernel bereits aktiviert.
Nur wer einen eigenen Kernel verwendet, muss diese Optionen berücksichtigen.
Kontrollieren lassen sich diese Einstellungen mit:
zcat /proc/config.gz | egrep 'DM_CRYPT|_AES|SHA256|CRYPTO='
oder
egrep 'DM_CRYPT|_AES|SHA256|CRYPTO=' /boot/config-*-default
Beispiel: /proc/config.gz
|
# zcat /proc/config.gz | egrep 'DM_CRYPT|_AES|SHA256|CRYPTO=' CONFIG_DM_CRYPT=m CONFIG_CRYPTO=y CONFIG_CRYPTO_SHA256=m CONFIG_CRYPTO_AES=m CONFIG_CRYPTO_AES_X86_64=m |
Einbinden des USB-Sticks
Um den USB-Stick immer über dasselbe Device ansprechen zu können, muss eine entsprechende UDEV-Regel erstellt, werden,
die automatisch einen Symlink auf den Stick (und die jeweiligen Partitionen) anlegt.
Zuerst ermittelt man die Seriennummer des USB-Sticks
(anhand dieser Nummer kann das Device später eindeutig zugeordnet werden):
udevinfo -a -p `udevinfo -q path -n /dev/<USB-Device>` | grep "ATTRS{serial}"
Beispiel: USB-Device: /dev/sdc
|
# udevinfo -a -p `udevinfo -q path -n /dev/sdc` | grep "ATTRS{serial}" ATTRS{serial}=="076A1A939BC2" ATTRS{serial}=="0000:00:02.1" |
Welche Herstellerbezeichnung nun zum USB-Stick gehört ermittelt man mit:
udevinfo -a -p `udevinfo -q path -n /dev/<USB-Device>` | grep "ATTRS{product}"
Beispiel: USB-Device: /dev/sdc
|
# udevinfo -a -p `udevinfo -q path -n /dev/sdc` | grep "ATTRS{product}" ATTRS{product}=="USB DISK 28X" ATTRS{product}=="USB2.0 Hub" ATTRS{product}=="EHCI Host Controller" In diesem Fall gehört also die erste Seriennummer zum USB-Stick. ATTRS{serial}=="076A1A939BC2" |
Anschließend eine UDEV-Regel erstellen:
Mit einem beliebigen Editor die Datei
/etc/udev/rules.d/01-usb-crypto.rules
mit dem Inhalt
# udev-rule for encrypted usb-pen SUBSYSTEMS=="usb", ATTRS{serial}=="<Seriennummer>", KERNEL=="sd*", NAME="%k", SYMLINK+="<Device-Name>%n"
erstellen.
Wobei
ATTRS{serial}=="<Seriennummer>"
natürlich durch die Seriennummer des eigenen USB-Sticks ersetzt werden muss
und mit
SYMLINK+="<Device-Name>%n"
festgelegt wird, unter welchem Devicenamen der Stick später verwendet wird.
Beispiel: Seriennummer: 076A1A939BC2, USB-Device: /dev/usbcrypt
|
# udev-rule for encrypted usb-pen SUBSYSTEMS=="usb", ATTRS{serial}=="076A1A939BC2", KERNEL=="sd*", NAME="%k", SYMLINK+="usbcrypt%n" Der komplette Stick kann in diesem Fall mit /dev/usbcrypt die erste Partition mit /dev/usbcrypt1 die zweite Partition mit /dev/usbcrypt2 usw. angesprochen werden. |
Anschließend die UDEV-Regeln mit
udevcontrol reload_rules
neu laden und den USB-Stick einstecken.
Unter
/dev
sollte dann mindestens (je nachdem wieviele Partitionen auf dem Stick existieren), das Device
/dev/usbcrypt
auftauchen unter dem der Stick dann - unabhängig von dem echten Device, dass z.B. bei fdisk -l angezeigt wird - angesprochen werden kann.
USB-Stick partitionieren/formatieren
Zum Partitionieren bieten sich diverse Programme an:
- Konsole:
fdisk cfdisk sfdisk parted
- GUI:
GParted (empfohlen) QtParted
Es wird mindestens eine Partition benötigt, auf der später die Schlüssel (Keys) gespeichert werden.
Im folgenden Beispiel werden auf einem leeren USB-Stick zwei neue Partitionen angelegt.
Auf der ersten Partition (50MB) wird später der Schlüssel für die /home-Partition gespeichert - die zweite kann für Daten genutzt werden (unverschlüsselt).
Achtung: |
Mit der folgenden Eingabe werden alle Daten auf dem Stick gelöscht! |
Beispiel: Anlegen von zwei Partitionen auf einem leeren/neuen USB-Stick mitt sfdisk
|
sfdisk -uM /dev/usbcrypt << "EOF" 0,50,L,+ ,,L EOF |
Anschließend wird die zweite Partition (unverschlüsselte Datenpartition) formatiert:
Beispiel: Partition /dev/usbcrypt2 mit dem ext3-Dateisystemformatieren
|
mkfs.ext3 -L Daten -c /dev/usbcrypt2 tune2fs -m 0 /dev/usbcrypt2 tune2fs -c 0 -i 0 /dev/usbcrypt2 tune2fs -O dir_index /dev/usbcrypt2 tune2fs -o journal_data /dev/usbcrypt2 e2fsck -D /dev/usbcrypt2Damit werden ein ext3-Dateisystem erzeugt, der für root reservierte Platz auf 0%, die mount-Option journal_data sowie die Dateisystem-Option dir_index gesetzt und die automatischen Dateisystemchecks deaktiviert. Für Einzelheiten zu den Optionen siehe: man tune2fs Anschließend wird das Dateisystem noch überprüft. |
Für die formatierte Partition noch einen Eintrag in der /etc/fstab anlegen.
Danach noch den den Mountpoint erstellen und die Partition mounten.
Beispiel: Partition /dev/usbcrypt2 einbinden
|
In der /etc/fstab die Zeile /dev/usbcrypt2 /media/daten ext3 noauto,noexec,nodev 0 0 einfügen, den Mountpoint erzeugen mkdir -p /media/daten und die Partition einbinden mount /media/daten |
Verschlüsselte Partitionen anlegen
Vorbereitung
Benötigte Module laden:
- Device-Mapper:
modprobe dm-crypt
- AES:
modprobe aes
USB-Stick
Zuerst wird die erste Partition auf dem USB-Stick verschlüsselt auf der anschließend der Schlüssel für die /home-Partition gespeichert wird.
Die Partition mit AES verschlüsseln:
cryptsetup -c aes-cbc-essiv:sha256 -y luksFormat /dev/usbcrypt1
- Mit YES bestätigen.
- Passwort eingeben.
- Passwort bestätigen.
Die neu erstellte Partition kann nun geöffnet werden:
cryptsetup luksOpen /dev/usbcrypt1 usbkeys
- Passwort eingeben.
Die verschlüsselte Partition wurde damit auf usbkeys "gemappt".
Unter
/dev/mapper
sollte nun das Device
usbkeys
auftauchen.
Dieses Device kann nun formatiert werden:
Beispiel: Partition /dev/mapper/usbkeys mit dem ext3-Dateisystemformatieren
|
mkfs.ext3 -L Keys -c /dev/mapper/usbkeys tune2fs -m 0 /dev/mapper/usbkeys tune2fs -c 0 -i 0 /dev/mapper/usbkeys tune2fs -O dir_index /dev/mapper/usbkeys tune2fs -o journal_data /dev/mapper/usbkeys e2fsck -D /dev/mapper/usbkeysDamit werden ein ext3-Dateisystem erzeugt, der für root reservierte Platz auf 0%, die mount-Option journal_data sowie die Dateisystem-Option dir_index gesetzt und die automatischen Dateisystemchecks deaktiviert. Für Einzelheiten zu den Optionen siehe: man tune2fs Anschließend wird das Dateisystem noch überprüft. |
Für die formatierte Partition wird noch Eintrag in der /etc/fstab angelegt (sicherheitshalber wird die Partition Standardmäßig nur readonly eingebunden).
Danach noch den den Mountpoint erstellen und die Partition mounten (dabei wird die Partition ausnahmsweise auch schreibbar eingebunden, um anschließend den Schlüssel speichern zu können).
Beispiel: Partition /dev/mapper/usbkeys einbinden
|
In der /etc/fstab die Zeile /dev/mapper/usbkeys /media/keys ext3 ro,noauto,noexec,nodev 0 0 einfügen, den Mountpoint erzeugen mkdir -p /media/keys die Partition einbinden mount /media/keys und "beschreibbar" 'remounten mount -o rw,remount /media/keys |
/home-Partition
Vorbereitung
Bevor nun die /home-Partition verschlüsselt wird, muss noch mit dd ein entsprechender Key erzeugt werden:
Beispiel: Schlüssel für die /home-Partition erstellen
|
In der dd if=/dev/urandom of=/media/keys/home.key bs=1k count=2 Schlüssel nur für root lesbar machen: chown root:root /media/keys/home.key chmod 0400 /media/keys/home.key |
Da beim Verschlüsseln einer Partition die vorhandenen Daten gelöscht werden, muss das vorhandene Homeverzeichnis zuvor gesichert werden:
Achtung: |
Auf der Sicherungs-Partition muss genügend Platz für das Homeverzeichnis vorhanden sein! |
Das Homeverzeichnis mit tar auf eine andere Partition (in diesem Fall die root-Partition) sichern:
Beispiel: Homeverzeichnis mit tar auf /media sichern
|
tar -cjpvf /media/home.tar.bz2 /home |
Anschließend kann die /home-Partition ausgehängt werden:
umount /home
Verschlüsselung
Jetzt kann die Partition verschlüsselt werden:
Hinweis: |
Um die /home-Partition im Notfall auch ohne Schlüssel mounten zu können wird die Partition zuerst mit einer Passphrase verschlüsselt. |
Im folgenden Beispiel wird die /home-Partition /dev/hda3 verschlüsselt:
Achtung: |
Mit der folgenden Eingabe werden alle Daten auf der Partition gelöscht! |
Beispiel: Verschlüsselung mit Passwort und Key-File
|
Die Partition mit AES verschlüsseln: cryptsetup -c aes-cbc-essiv:sha256 -y luksFormat /dev/hda3
Schlüssel hinzufügen: cryptsetup luksAddKey /dev/hda3 /media/keys/home.key
|
Die neu erstellte Partition kann nun geöffnet werden:
cryptsetup -d /media/keys/home.key luksOpen /dev/hda3 home
Die verschlüsselte Partition wurde damit auf home "gemappt".
Unter
/dev/mapper
sollte nun das Device
home
auftauchen.
Dieses Device kann nun formatiert werden:
Beispiel: Partition /dev/mapper/home mit dem ext3-Dateisystemformatieren
|
mkfs.ext3 -L Home -c /dev/mapper/home tune2fs -c 0 -i 0 /dev/mapper/home tune2fs -O dir_index /dev/mapper/home tune2fs -o journal_data /dev/mapper/home e2fsck -D /dev/mapper/homeDamit werden ein ext3-Dateisystem erzeugt, die mount-Option journal_data sowie die Dateisystem-Option dir_index gesetzt und die automatischen Dateisystemchecks deaktiviert. Für Einzelheiten zu den Optionen siehe: man tune2fs Anschließend wird das Dateisystem noch überprüft. |
Für die formatierte Partition noch den Eintrag in der /etc/fstab anlegen und danach den den Mountpoint erstellen sowie die Partition mounten.
Beispiel: Partition /dev/mapper/home einbinden
|
In der /etc/fstab den "alten" Eintrag für /home von /dev/hda3 /home ext3 defaults 1 2 auf /dev/mapper/home /home ext3 noauto 0 0 ändern und die Partition einbinden mount /home |
Daten zurückspielen
Wenn die "neue" /home-Partition ins Dateisystem eingebunden wurde, kann das Backup des "alten" Homeverzeichnisses zurückgespielt werden:
Beispiel: Das mit tar gesicherte Homeverzeichnis wieder einspielen
|
cd / tar -xjvpf /media/home.tar.bz2 |
Verschlüsselte Partitionen beim Systemstart einbinden
Vorbereitung
Um die angelegten Partitionen beim Systemstart einzubinden wird ein entsprechendes Bootscript benötigt.
Folgendes Script kopieren und unter
/etc/init.d/boot.cryptdisks
speichern.
openSUSE:
|
Die Rechte für das Script setzen (ausführbar machen):
chown root:root /etc/init.d/boot.cryptdisks chmod 0700 /etc/init.d/boot.cryptdisks
Anschließend die Datei
/etc/crypttab
mit folgendem Inhalt anlegen:
# /etc/crypttab # crypttab: Mappings for encrypted partitions # # NAME = name for device-mapper # SOURCE DEVICE = encrypted devive # MOUNTPOINT = where to mount the encrypted partition # FILESYSTEM = filesystem-type of the device # CIPHER = encryption method: aes, twofish, ... # OPTS = options for the enccryption: # cryptsetup LUKS: hash-length (swap-devices) # cryptsetup: keylength bits # KEY = path to keyfile to decrypt partition # NAME SOURCE DEVICE MOUNTPOINT FILESYSTEM CIPHER OPTS KEY
swap
Um beim Systemstart eine verschlüsselte swap-Partition anzulegen:
In der
/etc/fstab
den swap-Eintrag entfernen (auskommentieren mit "#"):
Beispiel: swap-Partition /dev/hda1 aus der /etc/fstab entfernen
|
Den Eintrag /dev/hda1 swap swap defaults 0 0 in #/dev/hda1 swap swap defaults 0 0 ändern |
In der
/etc/crypttab
die Zeile
swap0 /dev/sda2 swap swap aes-cbc-essiv:sha256 sha256 /dev/urandom
hinzufügen.
USB-Stick
Um die verschlüsselte Partition des USB-Sticks beim Systemstart einzubinden:
In der
/etc/crypttab
die Zeile
usbkeys /dev/usbcrypt1 /media/keys ext3 aes-cbc-essiv:sha256 none none
hinzufügen.
/home-Partition
Um die verschlüsselte /home-Partition beim Systemstart einzubinden:
In der
/etc/crypttab
unterhalb des Eintrags für den USB-Stick die Zeile
home /dev/hda3 /home ext3 aes-cbc-essiv:sha256 none none
hinzufügen.
Links
http://www.saout.de/misc/dm-crypt
http://luks.endorphin.org/dm-crypt