Datenträger-Verschlüsselung mit cryptsetup

Mit Cryptsetup kann man ganze Partitionen mit einem Passwort-Schutz versehen. Dies wird üblicherweise genutzt, um private Daten vor einem Fremdzugriff zu schützen; man kann allerdings, wie im zweiten Teil dieses Abschnitts beschrieben, auch die Partition des Betriebsystems verschlüsseln.

Verschlüsselung von Daten-Partitionen

Die Verschlüsselung einer gewöhnlichen Partition auf einer Festplatte oder einem USB-Stick mit kann man in einer Shell nach dem folgendem Schema erreichen:

  1. Zunächst muss man herausfinden, welche Device-Stelle einem Datenträger beziehungsweise einer Partition zugeordnet ist:

    # Partitionen und Einhängepunkte auflisten:
    lsblk
    

    Angenommen, in einem Rechner ist eine Festplatte enthalten, auf der sich drei Partitionen befinden: Eine Partition für das Basis-System /, eine für das Home-Verzeichnis /home und eine als Swap (erweiterter Arbeitsspeicher). Der obige Befehl würde die Partitionen dann als /dev/sda1, /dev/sda2 und /dev/sda3 anzeigen.

    Weitere Festplatten, USB-Sticks usw. erhalten fortlaufend die Device-Bezeichnung /dev/sdb, /dev/sdc, /dev/sdd, usw. Sofern Partitionen auf den Datenspeichern vorhanden sind, gibt eine angehängte Nummer die jeweilige Partitionsnummer auf dem Datenträger an.

  2. Als nächstes sollte eine neue Partition mit einem Partitions-Programm erstellt werden.

    sudo gparted /dev/sdX
    

    Hierbei muss anstelle X die konkrete Device-Bezeichnung angegeben werden.

    Achtung: Partitionierungen sind immer mit der Gefahr eines Datenverlusts verbunden. Es ist dringend empfehlenswert, vorab eine Sicherheits-Kopie der auf dem Datenträger gespeicherten Daten zu erstellen!

    Ist auf dem Datenträger keine Partitionstabelle vorhanden (dies erkennt man unter anderem daran, dass unter der Rubrik Partition keine neue Partition erstellt werden kann), so muss mittels Gerät -> Partitionstabelle erstellen erst eine neue Partitionstabelle angelegt werden; dabei sollte als Typ gpt gewählt werden.

    Nun kann über Partition -> Neu eine neue Partition angelegt werden; als Dateisystem sollte ext4 gewählt werden.

  3. Anschließend kann eine LUKS-Partition mit cryptsetup angelegt werden:

    sudo cryptsetup -c aes-xts-plain -y -s 512 luksFormat /dev/sdX1
    sudo cryptsetup luksOpen /dev/sdX1 crypt_name
    sudo mkfs.ext4 /dev/mapper/crypt_name
    

    Hierbei muss wiederum anstelle von X1 die konkrete Device-Bezeichnung angegeben werden. Innerhalb des LUKS-Containers befindet sich anschließend eine gewöhnliche ext4-Partition.

  4. Die neue Partition kann nun in einen beliebigen Verzeichnispfad eingebunden werden:

    sudo mkdir /media/crypt
    sudo mount /dev/mapper/crypt_name /media/crypt
    

Die Partition kann von diesem Moment an über den entsprechenden Verzeichnispfad (im Beispiel /media/crypt) wie ein großer Daten-Ordner genutzt werden.

Einbinden bestehender LUKS-Partitionen

Moderne Linux-Systeme wie Linux Mint erkennen automatisch verschlüsselte Datenträger (z.B. USB-Sticks oder externe Festplatten) und öffnen ein entsprechendes Dialog-Fenster zur Passworteingabe.

Von Hand lässt sich eine bestehende LUKS-Partition nach folgendem Schema in ein laufendes System einbinden („mounten“):

sudo cryptsetup luksOpen /dev/sdX1 crypt_name
sudo mount /dev/mapper/crypt_name /media/crypt

Hierbei muss wiederum anstelle von X1 die konkrete Device-Bezeichnung angegeben werden. Sowohl der beim Öffnen der Partition vergebene Crypt-Name als auch der beim Mounten festgelegte Einhänge-Punkt sind frei wählbar.

Das Aushängen einer – von keinem Programm benutzten – LUKS-Partition erfolgt durch ein Anklicken des Datenträger-Icons auf dem Desktop mit der rechten Maustaste oder in einem Shell-Fenster nach folgendem Schema:

sudo umount /media/crypt
sudo cryptsetup luksClose /dev/mapper/crypt_name

Ein Herunterfahren des Systems bewirkt ebenfalls ein Aushängen und Verschließen aller eingehängten Partitionen.

Wird eine Partition ausschließlich von einem Nutzer verwendet, so empfiehlt sich als Mount-Pfad anstelle /media/crypt besser ein Ordner im Unterverzeichnis des Benutzers, beispielsweise /media/tux/crypt. Der Benutzer hat dann auch ohne Root-Rechte vollen Lese- und Schreibzugriff auf alle Daten der Partition.

Verschlüsselung der System-Partition

Mittels Cryptsetup und Luks können nicht nur „normale“ Partitionen verschlüsselt werden; es ist während einer Linux-Installation auch möglich das gesamte System bis auf einen notwendigen Boot-Bereich zu verschlüsseln.[1] Grundlegende Linux- beziehungsweise Shell-Kenntnisse sollten hierzu allerdings vorhanden sein.

Nötige Partitionen erstellen und verschlüsseln

Vor der Installation werden zwei primäre Partitionen angelegt. Sie lassen sich beispielsweise bei einer Linux Mint-Installation mittels des graphischen, leicht bedienbaren und bereits auf der Live-CD enthaltenen Programms gparted erstellen:

Partition Name Größe
eine Boot-Partition /dev/sda1 300 bis 500 MB
eine restliche Partition /dev/sda2 min. 15 GB

Die obigen Partitionsnamen können auch vertauscht sein, entscheidend ist zu wissen, welche jeweils gemeint ist. Als Formatierung verwende ich am liebsten das schnelle, sichere und wartungsarme Dateisystem ReiserFS. In Anlehnung an die erprobte Original-Anleitung (en.) werden nun in einem Terminal als Superuser (su eingeben!) nacheinander folgende Schritte durchlaufen:

  1. Formatierung der Boot-Partition:

    mkfs.reiserfs -l boot /dev/sda1
    
  2. Anlegen eines verschlüsselten System-Devices:

    cryptsetup luksFormat --cipher aes-cbc-essiv:sha256 /dev/sda2
    cryptsetup luksOpen /dev/sda2 sda2_crypt
    
  3. Aufteilung des Crypt-Devices in zwei Bereiche (logical volume): Einen swap-Bereich, welcher dem System zur Auslagerung von Dateien dient (erweiterter Arbeitsspeicher, 1 bis 4 GB), sowie die eigentliche Systempartition root mit dem restlichen Festplattenspeicher:

    pvcreate /dev/mapper/sda2_crypt
    vgcreate cryptVG /dev/mapper/sda2_crypt
    lvcreate -n swap -L 4G cryptVG
    lvcreate -n root -l 100%FREE cryptVG
    
  4. Formatierung der neuen Bereiche:

    mkswap -L swap /dev/cryptVG/swap
    mkfs.reiserfs -l root /dev/cryptVG/root
    

Installations-Routine und nachträgliche Anpassungen

Nun kann der Installations-Assistent gestartet werden. Hierzu klickt man das entsprechende Icon auf dem Desktop an und füllt die nötigen Felder (gewünschter Benutzername, Passwörter, Zeitzone, Tastaturlayout, etc.) aus. Im Partitions-Auswahlmenü ist darauf zu achten, dass die Bereiche richtig eingebunden werden:

Partition Einhängepunkt
/dev/mapper/cryptVG-root /
/dev/sda1 /boot

Nach dieser Basis-Installation, die Abhängig von der Hardware-Geschwindigkeit zwischen 15 und 30 Minuten dauert, müssen noch folgende Anpassungen vorgenommen werden:

  1. Einbinden des neuen Systems:

    mkdir /media/sidux
    mount /dev/cryptVG/root /media/sidux
    mount /dev/sda1 /media/sidux/boot
    
  2. Drei Dateien müssen nun mit einem Texteditor erstellt beziehungsweise angepasst werden:

    • Die Datei /media/sidux/etc/crypttab muss folgendes Schema aufweisen:

      # target    source_device                           key_file  options
      sda2_crypt  /dev/disk/by-uuid/[UUID of /dev/sda2]   none      luks
      

      Die UUID einer Partition bekommt man in einem separaten Terminal-Fenster im Verzeichnis /dev/disk/by-uuid mittels ls -l (long list) angezeigt. Sie sieht ungefähr so aus: 550e8400-e29b-11d4-a716-446655440000. Es genügt, die passende UUID mit der Maus zu markieren, um sie im anderen Fenster per mittlerem Mausklick an gewünschter Stelle einfügen zu können.

    • In der /media/sidux/etc/initramfs-tools/conf.d/cryptroot (die Datei existiert noch nicht!) muss folgendes eingetragen werden:

      target=sda2_crypt,source=UUID=[UUID of your /dev/sda2],lvm=cryptVG-root
      
    • Die Datei /etc/initramfs-tools/modules muss noch um folgende Einträge (einen je Zeile) ergänzt werden:

      aes-i586
      aes-x86_64
      xts
      gf128
      sha256
      
  3. Nun kann man die Installation durch folgende Kommandos abschließen:

    chroot /media/sidux
    mount -t proc proc /proc
    mount -t sysfs sysfs /sys
    update-initramfs -u
    umount proc
    umount sys
    exit
    reboot
    

Nach einem Reboot wird nun beim Start ein Passwort verlangt, bevor das System wie gewohnt hochfährt.

Login von Live-Disk

Sollte beim Starten des PCs die verschlüsselte Partition nicht erkannt werden (und damit ein Booten unmöglich sein), so kann das System dadurch zum Laufen gebracht werden, indem man mittels einer Live-Disk (oder einem Live-Stick) bootet und als Superuser folgende Zeilen in einer Shell eingibt:

cryptsetup luksOpen /dev/sda2 root
mkdir /media/root
pvscan
lvscan
vgscan
vgchange -ay

Damit werden die vorhandenen Partitionen erkannt und aktiviert. Anschließend können sie gemountet werden:

mount /dev/cryptVG/root /media/root
mount /dev/sda1 /media/root/boot
mount --bind /dev /media/root/dev
mount --bind /proc /media/root/proc
mount --bind /sys /media/root/sys

Nun kann man den Root-Pfad des laufendes Systems auf die gemountete Festplatten-Partition umstellen:

chroot /media/root                  # ins Filesystem der Festplatte wechseln..

Liegt der Fehler an einer fehlerhaften Einstellung des Bootloaders grub, so kann das Problem mit folgender Routine automatisch behoben werden:

grub-install --recheck /dev/sda     # neues Einrichten des GRUB
update-grub                         # Partitionen werden erkannt
grub-mkconfig > /boot/grub/menu.lst # Bootmenü wird neu geschrieben

Nach einem Reboot sollte der PC wie gewohnt hochfahren. Das Verfahren, mittels der obigen chroot-Routine von einem Live-System aus auf das installierte System zu wechseln, kann übrigens auch auf nicht verschlüsselte Systeme angewendet werden.


Anmerkung:

[1]

Eine Verschlüsselung des Betriebsystems ist nur dann sinnvoll, wenn ein Angriff mit physischem Zugang zum Rechner zu befürchten ist. Ist ein mit dieser Methode verschlüsselter Rechner ausgeschaltet, so ist er wohl bestmöglich geschützt. Erlangt ein Angreifer allerdings im laufenden Betrieb Administrator-Rechte, beispielsweise durch mögliche Sicherheitslücken bei Server-Anwendungen, so hilft auch die (im laufenden Zustand bereits geöffnete) System-Verschlüsselung nicht weiter. Die Methode zeigt allerdings einmal mehr, was für „Tricks“ auf Linux-Systemen grundsätzlich möglich sind..

Persönlich nutze ich eher die bereits beschriebene Methode der Partitions-Verschlüsselung und sichere private Daten zudem auf Offline-Speichermedien. Das Programm keepassx ist zur geschützten Verwaltung von guten, also ausreichend langen Passwörtern ebenfalls sehr zu empfehlen.