Dm-crypt: Unterschied zwischen den Versionen

Aus wiki.archlinux.de
ZaphodX (Diskussion | Beiträge)
Keine Bearbeitungszusammenfassung
Stfischr (Diskussion | Beiträge)
Ergänzung für systemd-hooks
 
(120 dazwischenliegende Versionen von 36 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
==Festplatte verschlüsseln==
{{SEITENTITEL:dm-crypt}}
[[en:Dm-crypt]]
{{achtung|Nach der Verschlüsselung der Festplatte sind etwaige vorherige Daten nicht mehr zu rekonstruieren! In jedem Fall sollte also ein Backup alter Daten erstellt werden}}


Eine komplett verschlüsselte Festplatte kann in vielen Fällen sinnvoll sein. Zum Beispiel kann es sehr schnell passieren, dass der private Laptop mit den privaten Daten irgendwo liegen gelassen oder geklaut wird. In solchen Fällen ist es immer besser, wenn niemand auf die Daten zugreifen kann.  
Eine komplett verschlüsselte Festplatte kann in vielen Fällen sinnvoll sein. Zum Beispiel kann es sehr schnell passieren, dass der private Laptop mit den privaten Daten irgendwo liegen gelassen oder geklaut wird. In solchen Fällen ist es immer besser, wenn niemand auf die Daten zugreifen kann. In diesem Beitrag werden zwei Varianten vorgestellt wie sich Festplatten bereits während der Installation von Arch Linux verschlüsseln lassen. Beide Varianten sind gleich sicher, erstere Variante verlangt allerdings weniger Konfigurationsaufwand.


Für alle folgenden Schritte wird keine Haftung übernommen! Es wird empfohlen, vorher ein komplettes Backup aller wichtigen Daten zu erstellen.  
==Festplatte Verschlüsseln==
Das Ver- und Entschlüsseln wird über das Kryptographie-Modul des Devicemappers des Kernels abgewickelt. Dieser stellt uns ein virtuelles Device zu Verfügung, über das auf die verschlüsselten Partitionen zugegriffen werden kann.
Der Verschlüsselungsalgorithmus, die Größe des Schlüssels und viele weitere Dinge die die Verschlüsselung beeinflussen, können selber festgelegt werden. Nähere Informationen zu den verfügbaren Parametern gibt es hier auf der [http://www.saout.de/misc/dm-crypt/ Seite von dm-crypt].
Informationen über die Geschwindigkeit der einzelnen Algorithmen gibt es [http://web.archive.org/web/20070519171434/http://www.saout.de/tikiwiki/tiki-index.php?page=UserPageChonhulio hier] übersichtlich dargestellt.
 
===Verschlüsselte LVM Partition(Variante 1)===
Dies ist die meist verbreitete Variante zumal viele andere Distributionen solch eine Verschlüsselung automatisch bei der Installation anbieten. Man kann den normalen [[Arch Install Scripts]] bzw. der  [[Anleitung für Einsteiger]] folgen und muss nur an einigen Punkten abweichen.
 
====Partitionslayout====
Man folge den Anleitungen bis zur Partitionierung, danach folge man dieser Anleitung bis auf weiteres.
 
Das Grundlayout solch einer Festplatte sieht vor, dass bis auf eine kleine Bootpartition die gesamte Platte verschlüsselt wird. Innerhalb des verschlüsselten Bereichs wird eine [[LVM]] angelegt. In dieser können wiederum eine unbegrenzte Anzahl von Logical Volumes angelegt werden. D.h. man partitioniert die Festplatte wie in der Anleitung mit dem Unterschied, dass man nur zwei Partitionen benötigt, einmal die besagte Bootpartition und einmal eine, die verschlüsselt wird und in der später logische Partitionen für z.B. die Root- oder Homepartition angelegt werden. Ein beispielhaftes Layout auf einem reinen Linuxsystem könnte also so aussehen:
 
/dev/sda1 - ca. 100MB(Bootpartition)
/dev/sda2 - Rest der Festplatte
 
====Verschlüsselung anlegen====
Um alte Daten loszuwerden, sollte man die zu verschlüsselnde Partition überschreiben:
# shred -v -n 1 /dev/sda2
shred überschreibt die Festplatte mit (Pseudo-)Zufallswerten. Bei SSD kann man alternativ auch TRIM anwenden:
# blkdiscard /dev/sda2
Das ist insbesondere dann sinnvoll, wenn TRIM trotz Verschlüsselung eingesetzt werden soll.
{{Hinweis|Einmal überschreiben genügt, siehe auch: [http://www.heise.de/newsticker/meldung/Sicheres-Loeschen-Einmal-ueberschreiben-genuegt-198816.html Heise]}}
 
Dann müssen die benötigten Kernelmodule geladen werden:
# modprobe dm-crypt
Danach verschlüsselt man sda2 mit folgendem Befehl:
# cryptsetup -c aes-xts-plain64 -y -s 512 luksFormat /dev/sda2
Den Befehl mit großem "YES" bestätigen und das gewünschte Passwort eingeben, wobei man beachte, dass das Passwort [https://de.wikipedia.org/wiki/Passwort#Wahl_sicherer_Passw.C3.B6rter sicher] ist.


===Partitionslayout festlegen===
Zur Auswahl alternativer Algorithmen konsultiere man die Manpage von Cryptsetup:
# man cryptsetup
Eine Übersicht vermittelt auch der eingebaute Benchmark:
# cryptsetup benchmark


Die Festplatte (in meinem Fall /dev/sda) sollte für alle folgenden Schritte folgendermaßen partitioniert sein:
Für die weiteren Schritte muss man die eben verschlüsselte Partition gleich einbinden:
# cryptsetup luksOpen /dev/sda2 lvm
Im Falle einer SSD mit gewünschter TRIM-Funktion ist hier noch der Parameter --allow-discards hinzuzufügen.


  /dev/sda1 -> /boot (32-64MB, bis zu 100MB)
In dem Ordner /dev/mapper erscheint jetzt die neue Gerätedatei lvm.
  /dev/sda2 -> swap (je nach Größe des Arbeitsspeichers, 1,2 x Arbeitsspeicher)
  /dev/sda3 -> / (10-15GB, ggf. 20?)
  /dev/sda4 -> /home


Die Größe der einzelnen Partitionen kann variieren.
====LVM einrichten====
Mit
# pvcreate /dev/mapper/lvm
# vgcreate main /dev/mapper/lvm
richtet man jetzt die LVM und eine Volume Group (hier im Beispiel mit dem Namen main) ein. Jetzt muss man noch die jeweiligen Logical Volumes einrichten. Logical Volumes sind so etwas wie virtuelle Partitionen, die von Linux wie richtige Partitionen gemountet und verwendet werden können. Zuallererst sollte man sich über das gewünschte Layout im klaren sein.


===Crypto-Devices anlegen===
/ → etwa 10GB (evtl. mehr, einige Pakete wie urbanterror (>1GB) oder auch texlive-full (=1GB) füllen schnell 10GB)
/swap → abhängig von der Größe des verbauten RAM (siehe [[Swap]])
/home → restlicher Festplattenplatz
Das Layout ist nur eine Empfehlung und kann beliebig verändert werden.


Das Ver- und Entschlüsseln wird über das Kryptographie-Modul des Devicemappers des Kernels abgewickelt. Dieser stellt uns ein virtuelles Device zu Verfügung, über das auf die verschlüsselten Partitionen zugegriffen werden kann.
Um obiges Layout im LVM anzulegen muss man folgende Befehle verwenden:
Den Verschlüsselungsalgorithmus, die Größe des Schlüssels und viele weitere Dinge die die Verschlüsselung beeinflussen, können selber festgelegt werden. Nähere Informationen zu den verfügbaren Parametern gibt es hier auf der Seite von dm-crypt [http://www.saout.de/misc/dm-crypt/]
# lvcreate -L 10GB -n root main
Informationen über die Geschwindigkeit der einzelnen Algorithmen gibt es hier [http://web.archive.org/web/20070519171434/http://www.saout.de/tikiwiki/tiki-index.php?page=UserPageChonhulio] übersichtlich dargestellt.  
# lvcreate -L 2GB -n swap main
Für die folgenden Verschlüsselung wurde der AES-Algorithmus mit SHA-256 als Hash und mit einer Schlüssellänge von 256 Bit gewählt.
# lvcreate -l 100%FREE -n home main
 
Möchte man statt GB mit MB-Größen arbeiten, lässt sich auch Folgendes anwenden:
 
# lvcreate -L 3072M -n swap main
 
====Arch Linux installieren und konfigurieren====
Nun folgt man der gewöhnlichen Installationsanleitung. Wenn man während der Installation die Mountpoints festlegt, muss man jedoch natürlich die eben erstellten Partitionen wählen. In unserem Beispiel muss {{ic|/boot}} auf {{ic|/dev/sda1}} angelegt werden, {{ic|/home}} auf {{ic|/dev/mapper/main-home}}, {{ic|/ }}auf {{ic|/dev/mapper/main-root}} und {{ic|swap}} ist in diesem Fall {{ic|/dev/mapper/main-swap}}. {{ic|/dev/sda2}} und {{ic|/dev/mapper/lvm}} bleiben indes unangetastet.
 
Im Vergleich zur normalen Installation müssen ab der Erstellung des Linux-Kernels Änderungen beachtet werden. Man editiert in {{ic|/etc/mkinitcpio.conf}} die ''HOOKS''-Zeile, dabei ist darauf zu achten, dass ''encrypt'' '''vor''' ''lvm2'' und beide in dieser Reihenfolge vor ''filesystems'' eingetragen werden! Wünscht man bei der Abfrage der Passworts ein  z.B. deutsches Tastaturlayout, muss man noch ''keymap'' vor ''encrypt'' einfügen. Benutzt man eine USB-Tastatur (oder hat man vor, dies irgendwann zu tun), so muss zusätzlich noch ''keyboard'' vor ''encrypt'' eingetragen werden.
HOOKS=(base udev autodetect modconf block ''keyboard keymap encrypt lvm2 filesystems'' fsck shutdown)


Anlegen des Crypto-Devices:
Oder bei Verwendung der systemd-hooks:
HOOKS=(base systemd modconf block keyboard sd-vconsole autodetect sd-encrypt sd-lvm2 filesystems fsck shutdown)


  # cryptsetup luksFormat /dev/sda3 --cipher aes-cbc-essiv:sha256 --verify-passphrase --key-size 256
Nachdem ''grub'' installiert wurde, muss man vor der Erstellung der Konfigurationsdatei mit {{ic|grub-mkconfig -o /boot/grub/grub.cfg}} noch die Kernelparameter anpassen. Dazu ändert man in {{ic|/etc/default/grub}} den Eintrag '''GRUB_CMDLINE_LINUX''' wie folgt:
  -> Passwort zweimal eingeben.  
  '''ACHTUNG:''' Das Passwort sollte ausreichend lang sein, also mindestens 16 stellig.


'''Hinweis: '''Da das Passwort während des Bootvorgangs abgefragt wird steht noch keine deutsche Tastaturbelegung zur Verfügung. Es stehen also keine Umlaute (ä;ö;ü;ß) zur Verfügung und Sonderzeichen sowie y und z befinden sich auf anderen Tasten. Um Probleme zu vermeiden sollte das Passwort mit der amerikanischen Tastaturbelegung erstellt werden.
{{hc|nano /etc/default/grub|
GRUB_CMDLINE_LINUX{{=}}"cryptdevice{{=}}/dev/sda2:main root{{=}}/dev/mapper/main-root"}}


Öffnen des eben erstellten Crypto-Devices:
Oder bei Verwendung der systemd-hooks:
GRUB_CMDLINE_LINUX="rd.luks.name=/dev/sda2=main root=/dev/mapper/main-root"


  # mkdir /mnt/root
Sollte ''keymap'' in die mkinitcpio.conf eingetragen worden sein und man wünscht beispielsweise ein deutsches Tastaturlayout, so müssen entsprechend noch "lang=de" und "locale=de_DE.UTF-8" in die Kernelzeile eingetragen werden. Danach kann man nach der normalen Anleitung weitermachen. Grub selbst sollte auf {{ic|/dev/sda}} installiert werden.
  # cryptsetup luksOpen /dev/sda3 root
  -> Passwort eingeben


Formatieren und mounten der Partition:  
Wird [[syslinux]] als Bootloader verwendet, editiert man die {{ic|APPEND}}-Zeile in {{ic|/boot/syslinux/syslinux.cfg}}:
APPEND cryptdevice=/dev/sda2:main root=/dev/mapper/main-root rw
unter Verwendung der UUID ist die Zeile nach folgendem Muster zu gestalten:
  APPEND cryptdevice=UUID="i23ac042-fac8-3cf4-acac3-8295c5a525be":main root=/dev/mapper/root-main rw
{{achtung|Es ist darauf zu achten, die UUID des crypto_LUKS devices zu verwenden.}}


  # mke2fs -j /dev/mapper/root (mit ext3)
====LVM manuell mounten====
  # mount /dev/mapper/root /mnt/root


Für die home-Partition wollen wir kein extra Passwort verwenden, sondern ein Keyfile, damit wir nicht bei jedem Start des Systems zwei Passwörter eingeben müssen. Das Keyfile für die Home-Partition legen wir in /crypto/home.key ab. Allerdings ist es sehr wichtig dieses Keyfile zu sichern. Sollte die Root-Partition einmal beschädigt und nicht wiederherstellbar sein, ist die Home-Partition mit allen Daten ebenfalls verloren. Eine andere Möglichkeit wäre es auch hier eine 16-stelliges Passwort zu benutzen, dieses in der /etc/crypttab anzugeben und es an einem sehr sicheren Ort aufzubewahren. So muss das Passwort nicht auf einem physikalischen Datenträger abgelegt werden. Man kann es sich entweder merken oder z.B. in einem Bankschließfach ablegen ;)
Möchte man ein mit LVM eingerichtetes und verschlüsseltes System manuell mounten, beispielsweise beim Start von einer Live-CD, so ist wie im Folgenden zu verfahren.


Das Keyfile erstellen wir uns zufällig, indem wir einen 2048 Byte großen Block aus /dev/urandom kopieren.
Verschlüsselte Partition einbinden:


  # mkdir /mnt/root/crypto
# cryptsetup luksOpen /dev/sda2 lvm
  # dd if=/dev/urandom of=/mnt/root/crypto/home.key bs=1k count=2


Anlegen des Crypto-Devices:
Unter {{ic|/dev/mapper/}} erscheint nun die Gerätedatei lvm. Im nächsten Schritt ist mitunter der folgende Befehl nötig, um die Volume-Group - in diesem Fall lautet sie ''main'' - zu aktivieren.


  # cryptsetup luksFormat /dev/sda4 /mnt/root/crypto/home.key --cipher aes-cbc-essiv:sha256 --key-size 256
# vgchange -ay


  # cryptsetup luksOpen /dev/sda4 home --key-file /mnt/root/crypto/home.key
Nun sollte es möglich sein, einzelne Partitionen aus dieser Volume-Group ins System einzubinden.


Formatieren und mounten der Partition:
# mount -t ext4 /dev/main/root /mnt


  # mke2fs -j /dev/mapper/home (mit ext3)
===Partitionen einzeln verschlüsseln(Variante 2)===
  # mkdir /mnt/root/home
Eine weitere Variante verfährt ohne LVM. Diese Anleitung ähnelt trotzdem stark der ersten, daher wird auf die einzelnen Punkte nur rudimentär eingegangen.
  # mount /dev/mapper/home /mnt/root/home


===ArchLinux installieren===
====Partitionslayout festlegen====
Wieder verfährt man nach Anleitung bis zur Partitionierung. Diesmal partitioniert man jedoch die Festplatte schon von vornherein so, wie man sie später haben will. Ein beispielhaftes Layout:


Zuerst müssen wir noch unsere Boot-Partition erstellen und mounten.
/dev/sda1 → /boot (100MB)
/dev/sda2 → swap abhängig von der Größe des verbauten RAM (siehe [[Swap]])
/dev/sda3 → / (10-15GB)
/dev/sda4 → /home (restliche Festplatte)


  # mke2fs /dev/sda1
Die Größe der einzelnen Partitionen kann natürlich variieren.
  # mkdir /mnt/root/boot
  # mount /dev/sda1 /mnt/root/boot


Um eine Verbindung zum Internet aufbauen zu können, muss eine IP-adresse beim Router angefragt werden.
====Crypto-Devices anlegen====
Laden der benötigten Kernelmodule:


  # dhcpcd eth0
modprobe dm-crypt 


Jetzt kopieren wir alle wichtigen Dateien für das System in unsere verschlüsselte root-Partition.
Anlegen des Crypto-Devices:
 
  # /arch/quickinst ftp /mnt/root ftp://ftp.archlinux.org/current/os/i686
bzw.
  # /arch/quickinst ftp /mnt/root ftp://ftp.archlinux.org/current/os/x86_64


Nun brauchen wir für das neue System auch noch einen Kernel.
# cryptsetup luksFormat /dev/sda3 --cipher aes-xts-plain64 -y -s 512


  # /mnt/root/usr/bin/pacman.static -r /mnt/root --config /tmp/pacman.conf -S kernel26
Öffnen des eben erstellten Crypto-Devices:


Und damit wir das System nachher auch bequem starten können einen Bootloader, in diesem Fall nehmen wir Grub.
# cryptsetup luksOpen /dev/sda3 root


Zuerst mounten wir alle wichtigen Systemverzeichnisse,
Formatieren und mounten der Partition:


  # mount -o bind /dev /mnt/root/dev
# mkfs.ext4 -j /dev/mapper/root
  # mount -o bind /proc /mnt/root/proc
# mount /dev/mapper/root /mnt
  # mount -o bind /sys /mnt/root/sys


und wechseln mit chroot das Root-Verzeichnis.
Für die Homepartition soll kein extra Passwort verwenden, sondern ein Keyfile, damit nicht bei jedem Start des Systems zwei Passwörter eingeben werden müssen. Das Keyfile für die Partition wird in /crypto/home.key abgelegt. Allerdings ist es sehr wichtig dieses Keyfile zu sichern. Sollte die Root-Partition einmal beschädigt und nicht wiederherstellbar sein, ist die Home-Partition mit allen Daten ebenfalls verloren.  


  # chroot /mnt/root /bin/bash
{{Hinweis|Eine andere Möglichkeit wäre es auch hier ein Passwort zu benutzen und dieses dann in der /etc/crypttab anzugeben. So muss das Passwort nicht auf einem physikalischen Datenträger abgelegt werden.}}


Schnell Grub installieren.
Das Keyfile wird zufällig erstellt, indem man einen 2048 Byte großen Block aus /dev/urandom kopiert.


  # install-grub /dev/sda /dev/sda1
# mkdir /mnt/crypto
# dd if=/dev/urandom of=/mnt/crypto/home.key bs=1k count=2


Und /boot/grub/menu.lst anpassen:
Anlegen des nächsten Crypto-Devices:


  # (0) Arch Linux
# cryptsetup luksFormat /dev/sda4 /mnt/crypto/home.key --cipher aes-xts-plain64 -s 512
  title Arch Linux
  # cryptsetup luksOpen /dev/sda4 home --key-file /mnt/crypto/home.key
  root  (hd0,0)
  kernel /vmlinuz26 root=/dev/sda3
  initrd /kernel26.img


Damit dürfte das System im Prinzip schon einsatzbereit sein. Das initrd-image erkennt automatisch die verschlüsselte Partition und fragt nach dem Passwort. Sollte das nicht der Fall sein, muss noch mit [[mkinitcpio]] ein neues initrd-image erstellt werden, welches den hook für "encrypt" enthält. Dieser hook sollte in jedem Fall vor "filesystem" stehen. Dazu die Konfigurationsdatei /etc/mkinitcpio.conf bearbeiten und mit dem Befehl mkinitcpio das neue Image erzeugen.
Formatieren und mounten der Partition:


Den hook encrypt einfügen.
# mkfs.ext4 -j /dev/mapper/home
# mkdir /mnt/home
# mount /dev/mapper/home /mnt/home


  # nano /etc/mkinitcpio.conf
====Arch Linux installieren und konfigurieren====
Man verfährt nun nach der normalen Installationsanleitung.


und dann das Image neu schreiben.
Die Konfigurationsdateien für Grub und mkinitcpio müssen analog zur ersten Anleitung angepasst werden.


  # mkinitcpio -g /boot/kernel26.img
Damit das System die Home-Partition korrekt einbindet und die Swap-Partition bei jedem Start mit einem neuen zufälligen Schlüssel verschlüsselt, muss noch folgendes gemacht werden:


===Konfiguration anpassen===
Zuerst wird {{ic|/etc/crypttab}} geöffnet und die Home-Partition samt Schlüssel, der auf der Root-Partition in /crypto/home.key liegt, eingetragen.
Zunächst tragen wir erstmal die Boot und die Root Partition in die /etc/fstab ein.
# <file system>        <dir>      <type>  <options>    <dump> <pass>
  /dev/sda1                    /boot      ext2        defaults      0      0
  /dev/mapper/root        /            ext3        defaults      0      0


Damit unser System auch die Home-Partition korrekt einbindet und die Swap-Partition bei jedem Start mit einem neuen zufälligen Schlüssel verschlüsselt, müssen wir noch folgendes machen.
# NAME        SOURCE DEVICE      PASSWORD          OPTIONS
home          /dev/sda4          /crypto/home.key
....


====Home-Partition====
Um die Partitionen über die UUID einzubinden, wird die aus folgendem Befehl resultierende UUID benutzt
Zuerst öffnen wir /etc/crypttab und tragen unsere Home-Partition samt Schlüssel, der ja auf der Root-Partition in /crypto/home.key liegt, ein.
$ cryptsetup luksDump /dev/sda4 | grep UUID:


  # NAME        SOURCE DEVICE      PASSWORD          OPTIONS
Damit wird bei jedem Systemstart die Home-Partition automatisch geöffnet. Jetzt wird {{ic|/dev/mapper/home}} ganz normal in {{ic|/etc/fstab}} eingetragen, damit {{ic|/home}} korrekt gemountet wird.
  home          /dev/sda4          /crypto/home.key
  ....


Damit wird bei jedem Systemstart die Home-Partition automatisch geöffnet. Jetzt können wir /dev/mapper/home ganz normal in unsere fstab-Datei eintragen, damit /home auch korrekt gemountet wird.
# <file system>        <dir>      <type>  <options>    <dump> <pass>
/dev/mapper/home       /home     ext4    defaults      0      0


  # <file system>        <dir>      <type>  <options>    <dump> <pass>
Auch die Swap Partition wird in die {{ic|/etc/crypttab}} eingetragen.
  /dev/mapper/home      /home      ext3    defaults      0      0


====Swap Partition====
'''Achtung:''' unbedingt darauf achten, dass hier das richtige Device angegeben wird, da sonst Datenverlust droht!
Auch die Swap Partition tragen wir in die /etc/crypttab ein.
*'''Achtung:''' unbedingt darauf achten, dass hier das richtige Device angegeben wird, da sonst Datenverlust droht!


  # NAME          SOURCE DEVICE          PASSWORD                OPTIONS
  # NAME          SOURCE DEVICE          PASSWORD                OPTIONS
  swap               /dev/sda2                     SWAP                       -c aes-cbc-essiv:sha256 -s 256
  swap           /dev/sda2               SWAP                   -c aes-xts-plain64 -s 512
 
Jetzt muss nur noch {{ic|/dev/mapper/swap}} in die fstab Datei eintragen werden.


Jetzt müssen wir  nur noch /dev/mapper/swap in die fstab Datei eintragen.
  # <file system>        <dir>      <type>  <options>    <dump> <pass>
  # <file system>        <dir>      <type>  <options>    <dump> <pass>
  /dev/mapper/swap        none       swap         sw                0       0
  /dev/mapper/swap        swap       swap     defaults      0     0
 
===Aufräumen & Neustarten===


Zum Schluss müssen wir nur noch chroot mit Strg+d verlassen alle Partitionen wieder unmounten und die Crypto-Container schließen.


  # umount /mnt/root/boot /mnt/root/home
*ANMERKUNG: ''Falls nach dem Neustart die Swap-Partition nicht richtig eingebunden wird, kann folgender Befehl Abhilfe schaffen:''
  # umount -l /mnt/root
  # cryptsetup luksClose root
  # cryptsetup luksClose home
  # rm -r /mnt/root


Jetzt braucht es nur noch einen Restart und es sollte ein komplett verschlüsseltes ArchLinux starten ;)
dd if=/dev/zero of=/dev/sda2


  # shutdown -r now
Achtung: Dies überschreibt die Partition mit Nullen - hierbei ist unbedingt darauf zu achten, dass es sich bei sda2 auch tatsächlich um die besagte SWAP-Partition handelt, da man sonst eine andere Partition überschreibt!


===System per USB-Stick entschlüsseln===
==System per USB-Stick entschlüsseln==
Wer nicht jedesmal beim Booten das LUKS Passwort für die root Partition eingeben will kann auch ein Keyfile auf einem USB-Stick speichern.
Wer nicht jedesmal beim Booten das LUKS Passwort für die root Partition eingeben will kann auch ein Keyfile auf einem USB-Stick speichern.
Wenn der Stick beim Booten eingesteckt ist wird das System automatisch aufgeschlossen. Es gibt zwei Möglichkeiten den Key auf dem Stick zu speichern.
Wenn der Stick beim Booten eingesteckt ist wird das System automatisch aufgeschlossen. Es gibt zwei Möglichkeiten den Key auf dem Stick zu speichern.
Als einfache (sichtbare) klartext Datei, oder zwischen dem MBR und der ersten Partition des Sticks.
Als einfache (sichtbare) Klartextdatei, oder zwischen dem MBR und der ersten Partition des Sticks.


====Vorbereitungen====
===Vorbereitungen===
Bei beiden Methoden muss zunächst erstmal eine Udev Regel für den Stick erstellt werden. Wie das geht wird [[Einbindung_von_USB-Ger%C3%A4ten#Udev_Regel_erstellen | hier]] beschrieben. Ab jetzt wird angenommen, dass die Udev Regel den Stick ''usbstick'' nennt und die erste Partition des Sticks ''usbstick1''.  
Bei beiden Methoden muss zunächst erstmal eine Udev Regel für den Stick erstellt werden. Wie das geht wird [[Einbindung_von_USB-Geräten#Udev-Regel_erstellen|hier]] beschrieben. Ab jetzt wird angenommen, dass die Udev Regel den Stick ''usbstick'' nennt und die erste Partition des Sticks ''usbstick1''.  


Jetzt erstellt man ein Keyfile und speichert es auf dem USB-Stick. Soll das Keyfile als klartext Datei gespeichert werden, darf der Name keine Sonderzeichen, Punkte (versteckte Dateien) etc. enthalten, da der ''encrypt'' HOOK die Datei sonst beim Booten nicht findet.
Jetzt erstellt man ein Keyfile und speichert es auf dem USB-Stick. Soll das Keyfile als Klartextdatei gespeichert werden, darf der Name keine Sonderzeichen, Punkte (versteckte Dateien) etc. enthalten, da der ''encrypt'' HOOK die Datei sonst beim Booten nicht findet.


USB-Stick mounten
USB-Stick mounten
  mkdir /mnt/usb-stick
  mkdir /mnt/usb-stick
  mount /dev/usbstick1 /mnt/usb-stick
  mount /dev/usbstick1 /mnt/usb-stick


Keyfile erstellen und auf dem Stick speichern.
Keyfile erstellen und auf dem Stick speichern.
  dd if=/dev/urandom of=/mnt/usb-stick/archkey bs=512 count=4
  dd if=/dev/urandom of=/mnt/usb-stick/archkey bs=512 count=4


Jetzt kann das Keyfile zu den Schlüsseln für die root Partition (hier ''/dev/sda3'') hinzugefügt werden. Das alte LUKS Passwort sollte man nicht löschen. Falls das Keyfile mal verloren geht, oder das Entschlüsseln per USB-Stick nicht auf Anhieb funktioniert, kommt man immer noch ins System.
Jetzt kann das Keyfile zu den Schlüsseln für die root Partition (hier {{ic|/dev/sda3}}) hinzugefügt werden. Das alte LUKS Passwort sollte man nicht löschen. Falls das Keyfile mal verloren geht, oder das Entschlüsseln per USB-Stick nicht auf Anhieb funktioniert, kommt man immer noch ins System.
cryptsetup LuksAddKey /dev/sda3 /home/user/archkey
''/dev/sda3'' gegebenen Falls anpassen...


cryptsetup luksAddKey /dev/sda3 /mnt/usb-stick/archkey
''/dev/sda3'' gegebenenfalls anpassen...
Als nächstes wird die {{ic|/etc/mkinitcpio.conf}} angepasst. Die Udev-Regel wird in die FILES=() Zeile eingetragen und zu den HOOKS ''block'' hinzugefügt (vor encrypt).
FILES=(/etc/udev/rules.d/50-myusb.rules)
HOOKS=(... block encrypt filesystems ...)
Soll das Keyfile als Klartextdatei gespeichert werden, müssen noch zwei Module zur MODULES=() Zeile hinzugefügt werden. Eins für das Dateisystem des Sticks (hier vfat) und eins für die Codepage
MODULES=(ata_generic ata_piix '''nls_cp437''' '''vfat''')


Als nächstes wird die ''/etc/mkinitcpio.conf'' angepasst. Die Udev-Regel wird in die FILES="" Zeile eingetragen und zu den HOOKS ''usb'' hinzugefügt (vor encrypt).
FILES="/etc/udev/ruels.d/50-myusb.rules"
HOOKS="... usb encrypt filesystems ..."
Soll das Keyfile als klartext Datei gespeichert werden, müssen noch zwei Module zur MODULES="" Zeile hinzugefügt werden. Eins für das Dateisystem des Sticks (hier vfat) und eins für die Codepage
MODULES="ata_generic ata_piix '''nls_cp437''' '''vfat'''"
Die Module für das Dateisystem und die Codepage müssen durch die passenden ersetzt werden, falls der USB-Stick ein anderes Dateisystem hat (z.B. ext2). Benutzer des Arch-stock Kernels sollten die hier genannte Codepage verwenden.
Die Module für das Dateisystem und die Codepage müssen durch die passenden ersetzt werden, falls der USB-Stick ein anderes Dateisystem hat (z.B. ext2). Benutzer des Arch-stock Kernels sollten die hier genannte Codepage verwenden.


Jetzt kann das neue initrd-image erstellt werden. (evtl. das alte vorher sichern)
Jetzt kann das neue initrd-image erstellt werden. (evtl. das alte vorher sichern)
mkinitcpio -p kernel26


====Schlüssel als klartext Datei speichern====
mkinitcpio -p linux
Da das Keyfile ja bereits auf dem Stick existiert, muss nur noch die kernel Zeile in der menu.lst (GRUB) angepasst werden.
 
  kernel /vmlinuz26 root=/dev/sda3 ro vga=771 cryptkey=/dev/usbstick1:vfat:/archkey
===Schlüssel als Klartextdatei speichern===
''/dev/usbstick1'' ist dabei die FAT Partition mit dem Keyfile.
Da das Keyfile bereits auf dem Stick existiert, muss nur noch die Kernelzeile in der ''/boot/grub/menu.lst'' angepasst werden.
 
  kernel /vmlinuz-linux cryptdevice=/dev/sda3:root root=/dev/mapper/root ro vga=771 cryptkey=/dev/usbstick1:vfat:/archkey
 
''/dev/usbstick1'' ist dabei die FAT-Partition mit dem Keyfile.
 
Wenn alles geklappt hat, sollte das System beim nächsten Booten automatisch "aufgeschlossen" werden, vorausgesetzt der USB-Stick ist eingesteckt.


Wenn alles geklappt hat, sollte Das System beim nächsten Booten automatisch aufgeschlossen werden.
===Schlüssel zwischen MBR und erster Partition speichern===
Vorausgesetzt der USB-Stick ist eingesteckt. ;-)
'''ACHTUNG:''' Man sollte das hier nur machen, wenn man weiß, was man tut. Es kann zu Datenverlust kommen und die Partitionen oder der MBR des Sticks beschädigt werden.


====Schlüssel zwischen MBR und erster Partition speichern====
Sollte auf dem Stick ein Bootloader installiert sein, müssen einige Werte angepasst werden. GRUB braucht z. B. die ersten 16 Sektoren. Man müsste also ''seek=4'' durch ''seek=16'' ersetzen. Andernfalls würden Teile von GRUB überschrieben werden. Im Zweifelsfall kann man sich die ersten 64 Sektoren anschauen und nach einem genügend großen freien Bereich suchen.  
*'''ACHTUNG:''' man sollte das hier nur machen wenn man weiss was man tut. Es kann zu Datenverlust kommen und die Partitionen oder der MBR des Sticks beschädigt werden.


Sollte auf dem Stick ein Bootloader installiert sein müssen einige Werte angepasst werden. GRUB braucht z. B. die ersten 16 Sektoren. Man müsste also ''seek=4'' durch ''seek=16'' ersetzen. Andernfalls würden Teile von GRUB überschrieben werden. Im Zweifelsfall kann man sich die ersten 64 Sektoren anschauen und nach einem genügend großen freien Bereich suchen.
  dd if=/dev/usbstick of=64sectors bs=512 count=64  # kopiert die ersten 64 Sektoren
  dd if=/dev/usbstick of=64sectors bs=512 count=64  # kopiert die ersten 64 Sektoren
  hexcurse 64sectors                                                      # freien Platz suchen
  hexcurse 64sectors                                                      # freien Platz suchen


Den Schlüssel auf den Stick schreiben.
Den Schlüssel auf den Stick schreiben:
 
  dd if=/mnt/usb-stick/archkey of=/dev/usbstick bs=512 seek=4
  dd if=/mnt/usb-stick/archkey of=/dev/usbstick bs=512 seek=4


Wenn das geklappt hat kann das (klartext) Keyfile vom Stick gelöscht werden.
Wenn das geklappt hat kann das (Klartext-) Keyfile vom Stick gelöscht werden:
 
  shred --remove --zero /mnt/usb-stick/archkey
  shred --remove --zero /mnt/usb-stick/archkey


Jetzt muss noch die kernel Zeile in der ''menu.lst'' (GRUB) Datei angepasst werden.  
Jetzt muss noch die Kernelzeile in der ''menu.lst'' (GRUB) Datei angepasst werden:  
  kernel /vmlinuz26 root=/dev/sda3 ro vga=771 cryptkey=cryptkey=/dev/usbstick:2048:2048
 
  kernel /vmlinuz-linux cryptdevice=/dev/sda3:root root=/dev/mapper/root ro vga=771 cryptkey=/dev/usbstick:2048:2048


Das Format für die ''cryptkey'' Option sieht so aus:
Das Format für die ''cryptkey'' Option sieht so aus:
  cryptkey=BLOCKDEVICE:OFFSET:SIZE
  cryptkey=BLOCKDEVICE:OFFSET:SIZE


Die Werte für OFFSET und SIZE passen für dieses Beispiel, da das Keyfile die Länge 2048 hat (bs=512 count=4), und ab OFFSET 2048 (bs=512 seek=4) auf dem Stick gespeichert ist. Gegebenen Falls müssen die Werte angepasst werden.
Die Werte für OFFSET und SIZE passen für dieses Beispiel, da das Keyfile die Länge 2048 hat (bs=512 count=4) und ab OFFSET 2048 (bs=512 seek=4) auf dem Stick gespeichert ist. Gegebenenfalls müssen die Werte angepasst werden.


Das wars, wenn alles geklappt hat, sollte Das System beim nächsten Booten automatisch aufgeschlossen werden.
Das System wird nun beim nächsten Booten automatisch "aufgeschlossen" werden,
Vorausgesetzt der USB-Stick ist eingesteckt. ;-)
vorausgesetzt der USB-Stick ist eingesteckt.


==Padlock Fehlermeldung==
==Padlock Fehlermeldung==
  FATAL: Error inserting padlock_aes (/lib/modules/2.6.24-ARCH/kernel/drivers/crypto/padlock-aes.ko): No such device
  FATAL: Error inserting padlock_aes (/lib/modules/2.6.24-ARCH/kernel/drivers/crypto/padlock-aes.ko): No such device
Wenn diese Fehlermeldung beim Booten erscheint, ist das nicht weiter schlimm.
Wenn diese Fehlermeldung beim Booten erscheint, ist das nicht weiter schlimm.
Die padlock Module bedienen wohl Entschlüsselungs-Hardware (z.B. Fingerabdruck-Scanner o.ä.),
Die padlock-Module können nur mit speziellen Mini-ITX-Mainboards von VIA mit C7- oder Eden-CPU benutzt werden. Diese Mainboards enthalten eine Verschlüsselungseinheit namens Padlock, die unter anderem einen Hardware-Zufallsgenerator bereitstellt sowie hardwarebeschleunigte AES-Ver-/Entschlüsselung ermöglicht.
was wohl die wenigsten zur Verfügung haben.
 
Die Module werden an zwei Stellen versucht zu Laden:
 
* in der initrd
* durch udev


Versucht zu laden werden die Module an zwei Stellen:
a) in der initrd
b) durch udev
Um die Meldung weg zu bekommen kan mann folgendes machen:
Um die Meldung weg zu bekommen kan mann folgendes machen:


'''a)'''<br>
'''a)'''<br>
Der encrypt-Hook bewirkt beim Erstellen des initrd-Images das alle Module die in Verzeich-
Der encrypt-Hook bewirkt beim Erstellen des initrd-Images das alle Module die in Verzeichnissen namens crypto liegen eingebunden und versucht zu laden werden. Das kann man steuern durch den Parameter CRYPTO_MODULES in der /etc/mkinitcpio.conf ähnlich des MODULES Parameters dort. D.h., man muss alle Crypto-Module, die zum Aufschließen der verschlüsselten Root-Partition nötig sind, dort explizit aufführen da der encrypt-Hook diese nicht mehr automatisch einfügt. Die benötigten Module kann man durch lsmod im laufenden System finden. Wer seine crypto-Module anhand des Namens nicht eindeutig identifizieren kann findet sie auf diesen Weg:
nissen namens crypto liegen eingebunden und versucht zu laden werden.
 
Das kann man steuern durch den Parameter CRYPTO_MODULES in der /etc/mkinitcpio.conf
ähnlich des MODULES Parameters dort.
D.h., man muß alle Crypto-Module, die zum Aufschließen der verschlüsselten Root-Partition
nötig sind, dort explizit aufführen da der encrypt-Hook diese nicht mehr automatisch
einfügt.
Die benötigten Module kann man durch lsmod im laufenden System finden. Wer seine
crypto-Module anhand des Namens nicht eindeutig identifizieren kann findet sie auf
diesem Weg:
  cd /lib/modules/$(uname -r)
  cd /lib/modules/$(uname -r)
  source /lib/initcpio/functions  
  source /lib/initcpio/functions  
  m="$(all_modules "/crypto/") "
  m="$(all_modules "/crypto/") "
  echo $m
  echo $m
Diese Module würde der encrypt-Hook automatisch einbinden (darunter auch die padlock).
Diese Module würde der encrypt-Hook automatisch einbinden (darunter auch die padlock).
Zum Abgleich mit den eigenen Modulen jetzt einfach lsmod mit dieser Liste vergleichen.
Zum Abgleich mit den eigenen Modulen jetzt einfach lsmod mit dieser Liste vergleichen.


Der nötige Eintrag in der /etc/mkinitcpio.conf kann z.B. so aussehen:
Der nötige Eintrag in der /etc/mkinitcpio.conf kann z.B. so aussehen:
  CRYPTO_MODULES="blowfish sha256_generic aes_i586 aes_generic"
 
  CRYPTO_MODULES=(blowfish sha256_generic aes_i586 aes_generic)


Jetzt noch das initrd-Image erstellen(als root):  
Jetzt noch das initrd-Image erstellen(als root):  
  mkinitcpio -g /boot/kernel26.img
 
  mkinitcpio -g /boot/initramfs-linux.img


'''b)'''<br>
'''b)'''<br>
Damit das Modul durch udev nicht versucht wird zu laden. Es reicht nicht (bzw. hat
Damit das Modul durch udev nicht versucht wird zu laden. Es reicht nicht (bzw. hat keine Auswirkung) die Module in der rc.conf mit ! vom Laden ausschließen zu wollen. Erst das explizite Blacklisten bei udev führte bei mir zum Erfolg. Also Datei /etc/modprobe.d/modprobe.conf editieren
keine Auswirkung) die Module in der rc.conf mit ! vom Laden ausschließen zu wollen.
 
Erst das explizite Blacklisten bei udev führte bei mir zum Erfolg.  
AlsoDatei /etc/modprobe.conf editieren
  blacklist padlock-aes
  blacklist padlock-aes
  blacklist padlock-sha
  blacklist padlock-sha
'''Nachtrag:'''<br>Durch das Update auf 2.6.27 hat sich bei den notwendigen CRYPTO_MODULES wieder einiges geändert. Ich konnte meinen Laptop erstmal nicht normal starten, da in meinen vorgegebenen Modulen welche fehlten. Um das (und das padlock-Problem zu umgehen) habe ich nun die CRYPTO_MODULES Zeile wieder rausgenommen und habe einfach die Module selbst in lib/modules/2.6.27-ARCH/kernel/drivers/crypto/padlock-* gelöscht. Dann das initrd neu erstellt. Somit taucht diese Meldung ebenfalls nicht mehr auf (ich verwende nie eine Hardware für das ich dieses padlock brauchen würde).


==lrw-benbi==
==lrw-benbi==
Wer wie im [http://wiki.archlinux.org/index.php/System_Encryption_with_LUKS_for_dm-crypt#Mapping_partitions US-Arch-Wiki] mit lrw-benbi verschlüsseln will, muss ebenso die /etc/mkinitcpio.conf anpassen:
Wer wie im [http://wiki.archlinux.org/index.php/System_Encryption_with_LUKS_for_dm-crypt#Mapping_partitions US-Arch-Wiki] mit lrw-benbi verschlüsseln will, muss ebenso die /etc/mkinitcpio.conf anpassen:
CRYPTO_MODULES="blowfish '''lrw''' sha256_generic aes_i586 aes_generic"


==Links==
CRYPTO_MODULES=(blowfish '''lrw''' sha256_generic aes_i586 aes_generic)
[[Verschlüsseltes Verzeichnis]]
 
==Bei einem Dateisystem-Prüffehler==
Sollte der seltene Fall eintreten, dass die Dateisystem-Überprüfung einer entschlüsselten Partition fehlschlägt (etwa nach einem Crash des Betriebssystems mit anschließendem Kaltstart) und man dieses mit [https://wiki.archlinux.org/index.php/Fsck fsck] händisch machen muss, ist unbedingt darauf zu achten, die betroffene Partition (wie üblich) vorher mit ''umount'' auszuhängen!
 
Bei folgendem Boot-Szenario hängt die Überprüfung bei ''/dev/mapper/root'', das mit ext3 formatiert ist:
 
...
:: Running Hook [keymap]
:: Loading keymap...done.
:: Running Hook [encrypt]
...
EXT3-fs: barriers not enabled
EXT3-fs (dm-0): mounted filesystem with writeback data mode
kjournald starting.  Commit interval 5 seconds
INIT: version 2.88 booting
  > Arch Linux
...
    ---------------------------                                        [DONE]
:: Starting UDev Daemon                                                [DONE]
:: Triggering UDev uevents                                            [DONE]
:: Loading Modules                                                    [DONE]
:: Waiting for EDev uevents to be processed                            [DONE]
:: Bringing up loopback interface                                      [DONE]
:: Unlocking encrypted volumes: home..ok                              [DONE]
:: Mounting Root Read-only                                            [BUSY]
:: Checking Filesystems
/dev/mapper/root contains a file system with errors, check forced.
...
Inode 90689 has imagic flag set.
/dev/mapper/root: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.
      (i.e., without -a or -p options)
                                                                        [FAIL]
**************** FILESYSTEM CHECK FAILED *****************
*                                                        *
* Please repair manually and reboot. Note that the root  *
* file system is currently mounted read-only. To remount *
* it read-write write: mount -n -o remount,rw /          *
* When you exit the maintenance shell the system will    *
* reboot automatically.                                  *
*                                                        *
**********************************************************
Give root password for maintenance
(or type Control-D to continue): _
Wie zu sehen, hängt die Überprüfung bei einer bestimmten Adresse (inode) -- es muss aber bei weitem nicht die einzige sein! Außerdem ist die entschlüsselte ''/dev/mapper/root''-Partition bereits als / (Root) "read-only" eingehängt.
 
Nachdem man sich nun in der Wartungsumgebung (maintenance shell) als ''root'' eingeloggt hat, hängt man die Root-Partition (oder eben eine andere betroffene Partition) also wieder aus:
 
# umount /
und repariert sie anschließend mit:
# fsck.ext3 /dev/mapper/root
(oder je nach Format mit einer anderen fsck-Variante.) Fsck gibt dann laufend Statusmeldungen aus, und je nachdem, ob es viele Fehler gibt (was man vorher nicht wissen, aber wovon ausgehen kann), muss man häufig bestätigen. Um dies zu vermeiden, gibt man alternativ ein:
 
# fsck.ext3 -y /dev/mapper/root
 
Die Reparatur kann einige Zeit in Anspruch nehmen, ''man darf sie aber auf keinen Fall abbrechen, sonst wird die Partition zerstört!'' -- Schließlich startet man das System neu, und das Problem ist behoben.
 
== Siehe auch ==
* [[Verschlüsseltes Verzeichnis]]
* [[TrueCrypt]]
* [[Systemverschlüsselung mit dm-crypt]]
 
== Weblinks ==
* [https://wiki.koeln.ccc.de/index.php/Suspend_to_Cryptodisk "Suspend to Cryptodisk"-How-To auf wiki.koeln.ccc.de] {{sprache|de}}
* [http://www.marcstraube.de/linux/2012/08/installation-von-archlinux-mit-verschlusseltem-lvm-und-systemd/ Blog-Artikel zur Komplettverschlüsselung von Arch Linux] {{sprache|de}}


[[Kategorie: Installation]]
[[Kategorie: Sicherheit]]
[[Kategorie: Sicherheit]]
[[Kategorie: Tipps und Tricks]]

Aktuelle Version vom 16. November 2020, 18:31 Uhr

Achtung: Nach der Verschlüsselung der Festplatte sind etwaige vorherige Daten nicht mehr zu rekonstruieren! In jedem Fall sollte also ein Backup alter Daten erstellt werden


Eine komplett verschlüsselte Festplatte kann in vielen Fällen sinnvoll sein. Zum Beispiel kann es sehr schnell passieren, dass der private Laptop mit den privaten Daten irgendwo liegen gelassen oder geklaut wird. In solchen Fällen ist es immer besser, wenn niemand auf die Daten zugreifen kann. In diesem Beitrag werden zwei Varianten vorgestellt wie sich Festplatten bereits während der Installation von Arch Linux verschlüsseln lassen. Beide Varianten sind gleich sicher, erstere Variante verlangt allerdings weniger Konfigurationsaufwand.

Festplatte Verschlüsseln

Das Ver- und Entschlüsseln wird über das Kryptographie-Modul des Devicemappers des Kernels abgewickelt. Dieser stellt uns ein virtuelles Device zu Verfügung, über das auf die verschlüsselten Partitionen zugegriffen werden kann. Der Verschlüsselungsalgorithmus, die Größe des Schlüssels und viele weitere Dinge die die Verschlüsselung beeinflussen, können selber festgelegt werden. Nähere Informationen zu den verfügbaren Parametern gibt es hier auf der Seite von dm-crypt. Informationen über die Geschwindigkeit der einzelnen Algorithmen gibt es hier übersichtlich dargestellt.

Verschlüsselte LVM Partition(Variante 1)

Dies ist die meist verbreitete Variante zumal viele andere Distributionen solch eine Verschlüsselung automatisch bei der Installation anbieten. Man kann den normalen Arch Install Scripts bzw. der Anleitung für Einsteiger folgen und muss nur an einigen Punkten abweichen.

Partitionslayout

Man folge den Anleitungen bis zur Partitionierung, danach folge man dieser Anleitung bis auf weiteres.

Das Grundlayout solch einer Festplatte sieht vor, dass bis auf eine kleine Bootpartition die gesamte Platte verschlüsselt wird. Innerhalb des verschlüsselten Bereichs wird eine LVM angelegt. In dieser können wiederum eine unbegrenzte Anzahl von Logical Volumes angelegt werden. D.h. man partitioniert die Festplatte wie in der Anleitung mit dem Unterschied, dass man nur zwei Partitionen benötigt, einmal die besagte Bootpartition und einmal eine, die verschlüsselt wird und in der später logische Partitionen für z.B. die Root- oder Homepartition angelegt werden. Ein beispielhaftes Layout auf einem reinen Linuxsystem könnte also so aussehen:

/dev/sda1 - ca. 100MB(Bootpartition)
/dev/sda2 - Rest der Festplatte

Verschlüsselung anlegen

Um alte Daten loszuwerden, sollte man die zu verschlüsselnde Partition überschreiben:

# shred -v -n 1 /dev/sda2

shred überschreibt die Festplatte mit (Pseudo-)Zufallswerten. Bei SSD kann man alternativ auch TRIM anwenden:

# blkdiscard /dev/sda2

Das ist insbesondere dann sinnvoll, wenn TRIM trotz Verschlüsselung eingesetzt werden soll.

Hinweis: Einmal überschreiben genügt, siehe auch: Heise

Dann müssen die benötigten Kernelmodule geladen werden:

# modprobe dm-crypt

Danach verschlüsselt man sda2 mit folgendem Befehl:

# cryptsetup -c aes-xts-plain64 -y -s 512 luksFormat /dev/sda2

Den Befehl mit großem "YES" bestätigen und das gewünschte Passwort eingeben, wobei man beachte, dass das Passwort sicher ist.

Zur Auswahl alternativer Algorithmen konsultiere man die Manpage von Cryptsetup:

# man cryptsetup

Eine Übersicht vermittelt auch der eingebaute Benchmark:

# cryptsetup benchmark

Für die weiteren Schritte muss man die eben verschlüsselte Partition gleich einbinden:

# cryptsetup luksOpen /dev/sda2 lvm

Im Falle einer SSD mit gewünschter TRIM-Funktion ist hier noch der Parameter --allow-discards hinzuzufügen.

In dem Ordner /dev/mapper erscheint jetzt die neue Gerätedatei lvm.

LVM einrichten

Mit

# pvcreate /dev/mapper/lvm
# vgcreate main /dev/mapper/lvm

richtet man jetzt die LVM und eine Volume Group (hier im Beispiel mit dem Namen main) ein. Jetzt muss man noch die jeweiligen Logical Volumes einrichten. Logical Volumes sind so etwas wie virtuelle Partitionen, die von Linux wie richtige Partitionen gemountet und verwendet werden können. Zuallererst sollte man sich über das gewünschte Layout im klaren sein.

/ → etwa 10GB (evtl. mehr, einige Pakete wie urbanterror (>1GB) oder auch texlive-full (=1GB) füllen schnell 10GB)
/swap → abhängig von der Größe des verbauten RAM (siehe Swap)
/home → restlicher Festplattenplatz

Das Layout ist nur eine Empfehlung und kann beliebig verändert werden.

Um obiges Layout im LVM anzulegen muss man folgende Befehle verwenden:

# lvcreate -L 10GB -n root main
# lvcreate -L 2GB -n swap main
# lvcreate -l 100%FREE -n home main

Möchte man statt GB mit MB-Größen arbeiten, lässt sich auch Folgendes anwenden:

# lvcreate -L 3072M -n swap main

Arch Linux installieren und konfigurieren

Nun folgt man der gewöhnlichen Installationsanleitung. Wenn man während der Installation die Mountpoints festlegt, muss man jedoch natürlich die eben erstellten Partitionen wählen. In unserem Beispiel muss /boot auf /dev/sda1 angelegt werden, /home auf /dev/mapper/main-home, / auf /dev/mapper/main-root und swap ist in diesem Fall /dev/mapper/main-swap. /dev/sda2 und /dev/mapper/lvm bleiben indes unangetastet.

Im Vergleich zur normalen Installation müssen ab der Erstellung des Linux-Kernels Änderungen beachtet werden. Man editiert in /etc/mkinitcpio.conf die HOOKS-Zeile, dabei ist darauf zu achten, dass encrypt vor lvm2 und beide in dieser Reihenfolge vor filesystems eingetragen werden! Wünscht man bei der Abfrage der Passworts ein z.B. deutsches Tastaturlayout, muss man noch keymap vor encrypt einfügen. Benutzt man eine USB-Tastatur (oder hat man vor, dies irgendwann zu tun), so muss zusätzlich noch keyboard vor encrypt eingetragen werden.

HOOKS=(base udev autodetect modconf block keyboard keymap encrypt lvm2 filesystems fsck shutdown)

Oder bei Verwendung der systemd-hooks:

HOOKS=(base systemd modconf block keyboard sd-vconsole autodetect sd-encrypt sd-lvm2 filesystems fsck shutdown)

Nachdem grub installiert wurde, muss man vor der Erstellung der Konfigurationsdatei mit grub-mkconfig -o /boot/grub/grub.cfg noch die Kernelparameter anpassen. Dazu ändert man in /etc/default/grub den Eintrag GRUB_CMDLINE_LINUX wie folgt:

nano /etc/default/grub
GRUB_CMDLINE_LINUX="cryptdevice=/dev/sda2:main root=/dev/mapper/main-root"

Oder bei Verwendung der systemd-hooks:

GRUB_CMDLINE_LINUX="rd.luks.name=/dev/sda2=main root=/dev/mapper/main-root"

Sollte keymap in die mkinitcpio.conf eingetragen worden sein und man wünscht beispielsweise ein deutsches Tastaturlayout, so müssen entsprechend noch "lang=de" und "locale=de_DE.UTF-8" in die Kernelzeile eingetragen werden. Danach kann man nach der normalen Anleitung weitermachen. Grub selbst sollte auf /dev/sda installiert werden.

Wird syslinux als Bootloader verwendet, editiert man die APPEND-Zeile in /boot/syslinux/syslinux.cfg:

APPEND cryptdevice=/dev/sda2:main root=/dev/mapper/main-root rw

unter Verwendung der UUID ist die Zeile nach folgendem Muster zu gestalten:

 APPEND cryptdevice=UUID="i23ac042-fac8-3cf4-acac3-8295c5a525be":main root=/dev/mapper/root-main rw

Achtung: Es ist darauf zu achten, die UUID des crypto_LUKS devices zu verwenden.


LVM manuell mounten

Möchte man ein mit LVM eingerichtetes und verschlüsseltes System manuell mounten, beispielsweise beim Start von einer Live-CD, so ist wie im Folgenden zu verfahren.

Verschlüsselte Partition einbinden:

# cryptsetup luksOpen /dev/sda2 lvm

Unter /dev/mapper/ erscheint nun die Gerätedatei lvm. Im nächsten Schritt ist mitunter der folgende Befehl nötig, um die Volume-Group - in diesem Fall lautet sie main - zu aktivieren.

# vgchange -ay

Nun sollte es möglich sein, einzelne Partitionen aus dieser Volume-Group ins System einzubinden.

# mount -t ext4 /dev/main/root /mnt

Partitionen einzeln verschlüsseln(Variante 2)

Eine weitere Variante verfährt ohne LVM. Diese Anleitung ähnelt trotzdem stark der ersten, daher wird auf die einzelnen Punkte nur rudimentär eingegangen.

Partitionslayout festlegen

Wieder verfährt man nach Anleitung bis zur Partitionierung. Diesmal partitioniert man jedoch die Festplatte schon von vornherein so, wie man sie später haben will. Ein beispielhaftes Layout:

/dev/sda1 → /boot (100MB)
/dev/sda2 → swap abhängig von der Größe des verbauten RAM (siehe Swap)
/dev/sda3 → / (10-15GB)
/dev/sda4 → /home (restliche Festplatte)

Die Größe der einzelnen Partitionen kann natürlich variieren.

Crypto-Devices anlegen

Laden der benötigten Kernelmodule:

modprobe dm-crypt   

Anlegen des Crypto-Devices:

# cryptsetup luksFormat /dev/sda3 --cipher aes-xts-plain64 -y -s 512

Öffnen des eben erstellten Crypto-Devices:

# cryptsetup luksOpen /dev/sda3 root

Formatieren und mounten der Partition:

# mkfs.ext4 -j /dev/mapper/root
# mount /dev/mapper/root /mnt

Für die Homepartition soll kein extra Passwort verwenden, sondern ein Keyfile, damit nicht bei jedem Start des Systems zwei Passwörter eingeben werden müssen. Das Keyfile für die Partition wird in /crypto/home.key abgelegt. Allerdings ist es sehr wichtig dieses Keyfile zu sichern. Sollte die Root-Partition einmal beschädigt und nicht wiederherstellbar sein, ist die Home-Partition mit allen Daten ebenfalls verloren.

Hinweis: Eine andere Möglichkeit wäre es auch hier ein Passwort zu benutzen und dieses dann in der /etc/crypttab anzugeben. So muss das Passwort nicht auf einem physikalischen Datenträger abgelegt werden.

Das Keyfile wird zufällig erstellt, indem man einen 2048 Byte großen Block aus /dev/urandom kopiert.

# mkdir /mnt/crypto
# dd if=/dev/urandom of=/mnt/crypto/home.key bs=1k count=2

Anlegen des nächsten Crypto-Devices:

# cryptsetup luksFormat /dev/sda4 /mnt/crypto/home.key --cipher aes-xts-plain64 -s 512
# cryptsetup luksOpen /dev/sda4 home --key-file /mnt/crypto/home.key

Formatieren und mounten der Partition:

# mkfs.ext4 -j /dev/mapper/home
# mkdir /mnt/home
# mount /dev/mapper/home /mnt/home

Arch Linux installieren und konfigurieren

Man verfährt nun nach der normalen Installationsanleitung.

Die Konfigurationsdateien für Grub und mkinitcpio müssen analog zur ersten Anleitung angepasst werden.

Damit das System die Home-Partition korrekt einbindet und die Swap-Partition bei jedem Start mit einem neuen zufälligen Schlüssel verschlüsselt, muss noch folgendes gemacht werden:

Zuerst wird /etc/crypttab geöffnet und die Home-Partition samt Schlüssel, der auf der Root-Partition in /crypto/home.key liegt, eingetragen.

# NAME        SOURCE DEVICE      PASSWORD          OPTIONS
home          /dev/sda4          /crypto/home.key
....

Um die Partitionen über die UUID einzubinden, wird die aus folgendem Befehl resultierende UUID benutzt

$ cryptsetup luksDump /dev/sda4 | grep UUID:

Damit wird bei jedem Systemstart die Home-Partition automatisch geöffnet. Jetzt wird /dev/mapper/home ganz normal in /etc/fstab eingetragen, damit /home korrekt gemountet wird.

# <file system>         <dir>      <type>   <options>     <dump> <pass>
/dev/mapper/home        /home      ext4     defaults      0       0

Auch die Swap Partition wird in die /etc/crypttab eingetragen.

Achtung: unbedingt darauf achten, dass hier das richtige Device angegeben wird, da sonst Datenverlust droht!

# NAME          SOURCE DEVICE           PASSWORD                OPTIONS
swap            /dev/sda2               SWAP                    -c aes-xts-plain64 -s 512

Jetzt muss nur noch /dev/mapper/swap in die fstab Datei eintragen werden.

# <file system>         <dir>      <type>   <options>     <dump> <pass>
/dev/mapper/swap        swap       swap     defaults      0      0


  • ANMERKUNG: Falls nach dem Neustart die Swap-Partition nicht richtig eingebunden wird, kann folgender Befehl Abhilfe schaffen:
dd if=/dev/zero of=/dev/sda2

Achtung: Dies überschreibt die Partition mit Nullen - hierbei ist unbedingt darauf zu achten, dass es sich bei sda2 auch tatsächlich um die besagte SWAP-Partition handelt, da man sonst eine andere Partition überschreibt!

System per USB-Stick entschlüsseln

Wer nicht jedesmal beim Booten das LUKS Passwort für die root Partition eingeben will kann auch ein Keyfile auf einem USB-Stick speichern. Wenn der Stick beim Booten eingesteckt ist wird das System automatisch aufgeschlossen. Es gibt zwei Möglichkeiten den Key auf dem Stick zu speichern. Als einfache (sichtbare) Klartextdatei, oder zwischen dem MBR und der ersten Partition des Sticks.

Vorbereitungen

Bei beiden Methoden muss zunächst erstmal eine Udev Regel für den Stick erstellt werden. Wie das geht wird hier beschrieben. Ab jetzt wird angenommen, dass die Udev Regel den Stick usbstick nennt und die erste Partition des Sticks usbstick1.

Jetzt erstellt man ein Keyfile und speichert es auf dem USB-Stick. Soll das Keyfile als Klartextdatei gespeichert werden, darf der Name keine Sonderzeichen, Punkte (versteckte Dateien) etc. enthalten, da der encrypt HOOK die Datei sonst beim Booten nicht findet.

USB-Stick mounten

mkdir /mnt/usb-stick
mount /dev/usbstick1 /mnt/usb-stick

Keyfile erstellen und auf dem Stick speichern.

dd if=/dev/urandom of=/mnt/usb-stick/archkey bs=512 count=4

Jetzt kann das Keyfile zu den Schlüsseln für die root Partition (hier /dev/sda3) hinzugefügt werden. Das alte LUKS Passwort sollte man nicht löschen. Falls das Keyfile mal verloren geht, oder das Entschlüsseln per USB-Stick nicht auf Anhieb funktioniert, kommt man immer noch ins System.

cryptsetup luksAddKey /dev/sda3 /mnt/usb-stick/archkey

/dev/sda3 gegebenenfalls anpassen...

Als nächstes wird die /etc/mkinitcpio.conf angepasst. Die Udev-Regel wird in die FILES=() Zeile eingetragen und zu den HOOKS block hinzugefügt (vor encrypt).

FILES=(/etc/udev/rules.d/50-myusb.rules)
HOOKS=(... block encrypt filesystems ...)

Soll das Keyfile als Klartextdatei gespeichert werden, müssen noch zwei Module zur MODULES=() Zeile hinzugefügt werden. Eins für das Dateisystem des Sticks (hier vfat) und eins für die Codepage

MODULES=(ata_generic ata_piix nls_cp437 vfat)

Die Module für das Dateisystem und die Codepage müssen durch die passenden ersetzt werden, falls der USB-Stick ein anderes Dateisystem hat (z.B. ext2). Benutzer des Arch-stock Kernels sollten die hier genannte Codepage verwenden.

Jetzt kann das neue initrd-image erstellt werden. (evtl. das alte vorher sichern)

mkinitcpio -p linux

Schlüssel als Klartextdatei speichern

Da das Keyfile bereits auf dem Stick existiert, muss nur noch die Kernelzeile in der /boot/grub/menu.lst angepasst werden.

kernel /vmlinuz-linux cryptdevice=/dev/sda3:root root=/dev/mapper/root ro vga=771 cryptkey=/dev/usbstick1:vfat:/archkey

/dev/usbstick1 ist dabei die FAT-Partition mit dem Keyfile.

Wenn alles geklappt hat, sollte das System beim nächsten Booten automatisch "aufgeschlossen" werden, vorausgesetzt der USB-Stick ist eingesteckt.

Schlüssel zwischen MBR und erster Partition speichern

ACHTUNG: Man sollte das hier nur machen, wenn man weiß, was man tut. Es kann zu Datenverlust kommen und die Partitionen oder der MBR des Sticks beschädigt werden.

Sollte auf dem Stick ein Bootloader installiert sein, müssen einige Werte angepasst werden. GRUB braucht z. B. die ersten 16 Sektoren. Man müsste also seek=4 durch seek=16 ersetzen. Andernfalls würden Teile von GRUB überschrieben werden. Im Zweifelsfall kann man sich die ersten 64 Sektoren anschauen und nach einem genügend großen freien Bereich suchen.

dd if=/dev/usbstick of=64sectors bs=512 count=64   # kopiert die ersten 64 Sektoren
hexcurse 64sectors                                                      # freien Platz suchen

Den Schlüssel auf den Stick schreiben:

dd if=/mnt/usb-stick/archkey of=/dev/usbstick bs=512 seek=4

Wenn das geklappt hat kann das (Klartext-) Keyfile vom Stick gelöscht werden:

shred --remove --zero /mnt/usb-stick/archkey

Jetzt muss noch die Kernelzeile in der menu.lst (GRUB) Datei angepasst werden:

kernel /vmlinuz-linux cryptdevice=/dev/sda3:root root=/dev/mapper/root ro vga=771 cryptkey=/dev/usbstick:2048:2048

Das Format für die cryptkey Option sieht so aus:

cryptkey=BLOCKDEVICE:OFFSET:SIZE

Die Werte für OFFSET und SIZE passen für dieses Beispiel, da das Keyfile die Länge 2048 hat (bs=512 count=4) und ab OFFSET 2048 (bs=512 seek=4) auf dem Stick gespeichert ist. Gegebenenfalls müssen die Werte angepasst werden.

Das System wird nun beim nächsten Booten automatisch "aufgeschlossen" werden, vorausgesetzt der USB-Stick ist eingesteckt.

Padlock Fehlermeldung

FATAL: Error inserting padlock_aes (/lib/modules/2.6.24-ARCH/kernel/drivers/crypto/padlock-aes.ko): No such device

Wenn diese Fehlermeldung beim Booten erscheint, ist das nicht weiter schlimm. Die padlock-Module können nur mit speziellen Mini-ITX-Mainboards von VIA mit C7- oder Eden-CPU benutzt werden. Diese Mainboards enthalten eine Verschlüsselungseinheit namens Padlock, die unter anderem einen Hardware-Zufallsgenerator bereitstellt sowie hardwarebeschleunigte AES-Ver-/Entschlüsselung ermöglicht.

Die Module werden an zwei Stellen versucht zu Laden:

  • in der initrd
  • durch udev

Um die Meldung weg zu bekommen kan mann folgendes machen:

a)
Der encrypt-Hook bewirkt beim Erstellen des initrd-Images das alle Module die in Verzeichnissen namens crypto liegen eingebunden und versucht zu laden werden. Das kann man steuern durch den Parameter CRYPTO_MODULES in der /etc/mkinitcpio.conf ähnlich des MODULES Parameters dort. D.h., man muss alle Crypto-Module, die zum Aufschließen der verschlüsselten Root-Partition nötig sind, dort explizit aufführen da der encrypt-Hook diese nicht mehr automatisch einfügt. Die benötigten Module kann man durch lsmod im laufenden System finden. Wer seine crypto-Module anhand des Namens nicht eindeutig identifizieren kann findet sie auf diesen Weg:

cd /lib/modules/$(uname -r)
source /lib/initcpio/functions 
m="$(all_modules "/crypto/") "
echo $m

Diese Module würde der encrypt-Hook automatisch einbinden (darunter auch die padlock). Zum Abgleich mit den eigenen Modulen jetzt einfach lsmod mit dieser Liste vergleichen.

Der nötige Eintrag in der /etc/mkinitcpio.conf kann z.B. so aussehen:

CRYPTO_MODULES=(blowfish sha256_generic aes_i586 aes_generic)

Jetzt noch das initrd-Image erstellen(als root):

mkinitcpio -g /boot/initramfs-linux.img

b)
Damit das Modul durch udev nicht versucht wird zu laden. Es reicht nicht (bzw. hat keine Auswirkung) die Module in der rc.conf mit ! vom Laden ausschließen zu wollen. Erst das explizite Blacklisten bei udev führte bei mir zum Erfolg. Also Datei /etc/modprobe.d/modprobe.conf editieren

blacklist padlock-aes
blacklist padlock-sha

Nachtrag:
Durch das Update auf 2.6.27 hat sich bei den notwendigen CRYPTO_MODULES wieder einiges geändert. Ich konnte meinen Laptop erstmal nicht normal starten, da in meinen vorgegebenen Modulen welche fehlten. Um das (und das padlock-Problem zu umgehen) habe ich nun die CRYPTO_MODULES Zeile wieder rausgenommen und habe einfach die Module selbst in lib/modules/2.6.27-ARCH/kernel/drivers/crypto/padlock-* gelöscht. Dann das initrd neu erstellt. Somit taucht diese Meldung ebenfalls nicht mehr auf (ich verwende nie eine Hardware für das ich dieses padlock brauchen würde).

lrw-benbi

Wer wie im US-Arch-Wiki mit lrw-benbi verschlüsseln will, muss ebenso die /etc/mkinitcpio.conf anpassen:

CRYPTO_MODULES=(blowfish lrw sha256_generic aes_i586 aes_generic)

Bei einem Dateisystem-Prüffehler

Sollte der seltene Fall eintreten, dass die Dateisystem-Überprüfung einer entschlüsselten Partition fehlschlägt (etwa nach einem Crash des Betriebssystems mit anschließendem Kaltstart) und man dieses mit fsck händisch machen muss, ist unbedingt darauf zu achten, die betroffene Partition (wie üblich) vorher mit umount auszuhängen!

Bei folgendem Boot-Szenario hängt die Überprüfung bei /dev/mapper/root, das mit ext3 formatiert ist:

...
:: Running Hook [keymap]
:: Loading keymap...done.
:: Running Hook [encrypt]
...
EXT3-fs: barriers not enabled
EXT3-fs (dm-0): mounted filesystem with writeback data mode
kjournald starting.  Commit interval 5 seconds
INIT: version 2.88 booting

 > Arch Linux
...
   ---------------------------                                         [DONE]
:: Starting UDev Daemon                                                [DONE]
:: Triggering UDev uevents                                             [DONE]
:: Loading Modules                                                     [DONE]
:: Waiting for EDev uevents to be processed                            [DONE]
:: Bringing up loopback interface                                      [DONE]
:: Unlocking encrypted volumes: home..ok                               [DONE]
:: Mounting Root Read-only                                             [BUSY]
:: Checking Filesystems
/dev/mapper/root contains a file system with errors, check forced.
...
Inode 90689 has imagic flag set.		

/dev/mapper/root: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.
      (i.e., without -a or -p options)
                                                                       [FAIL]
**************** FILESYSTEM CHECK FAILED *****************
*                                                        *
* Please repair manually and reboot. Note that the root  *
* file system is currently mounted read-only. To remount *
* it read-write write: mount -n -o remount,rw /          *
* When you exit the maintenance shell the system will    *
* reboot automatically.                                  *
*                                                        *
**********************************************************

Give root password for maintenance
(or type Control-D to continue): _

Wie zu sehen, hängt die Überprüfung bei einer bestimmten Adresse (inode) -- es muss aber bei weitem nicht die einzige sein! Außerdem ist die entschlüsselte /dev/mapper/root-Partition bereits als / (Root) "read-only" eingehängt.

Nachdem man sich nun in der Wartungsumgebung (maintenance shell) als root eingeloggt hat, hängt man die Root-Partition (oder eben eine andere betroffene Partition) also wieder aus:

# umount /

und repariert sie anschließend mit:

# fsck.ext3 /dev/mapper/root

(oder je nach Format mit einer anderen fsck-Variante.) Fsck gibt dann laufend Statusmeldungen aus, und je nachdem, ob es viele Fehler gibt (was man vorher nicht wissen, aber wovon ausgehen kann), muss man häufig bestätigen. Um dies zu vermeiden, gibt man alternativ ein:

# fsck.ext3 -y /dev/mapper/root

Die Reparatur kann einige Zeit in Anspruch nehmen, man darf sie aber auf keinen Fall abbrechen, sonst wird die Partition zerstört! -- Schließlich startet man das System neu, und das Problem ist behoben.

Siehe auch

Weblinks