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, sollte aber mit geringem Aufwand auch auf andere Distribution übertragbar sein. |
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> Cryptographic API <M> AES cipher algorithims oder <M> AES cipher algorithims (i586) oder <M> AES cipher algorithims (x86_64) <M> SHA256 digest algorithm
Diese Optionen sind im SUSE-Standardkernel bereits aktiviert. Nur wer einen eigenen Kernel verwendet, muss diese Optionen berücksichtigen. Für i586 und x86_64 gibt es optimierte Versionen auf Assemblerbasis, es empfiehlt sich diese zu verwenden.
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 |
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` |
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` |
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 |
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 mit 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/usbcrypt2 Damit 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 /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 modprobe aes-i586 modprobe aes-x86_64
(Je nachdem, welches AES-Modul zutrifft.)
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-xts-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/usbkeys Damit 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 read-only 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 /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 remount,rw /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
|
Mit dd if=/dev/urandom of=/media/keys/home.key bs=1k count=2 einen Key erzeugen. Diesen 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 z.B. 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. Anschließend wird der Schlüssel als zusätzlicher Key hinzugefügt (ein Feature der LUKS-Erweiterung). |
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-xts-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/home Damit 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 /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
|
tar -C / -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 a+x /etc/init.d/boot.cryptdisks
und das Script in den Bootprozess einbinden:
chkconfig boot.cryptdisks B
Kontrolle:
chkconfig -l boot.cryptdisks
sollte dann
boot.cryptdisks 0:off 1:off 2:off 3:off 4:off 5:off 6:off B:on
ausgeben.
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-xts-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-xts-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-xts-essiv:sha256 none none
hinzufügen.
Links
http://www.saout.de/misc/dm-crypt http://luks.endorphin.org/dm-crypt