linux:festplattenverschlüsselung

Festplattenverschlüsselung mit Luks

Festplattenverschlüsselung, allgemeiner auch Datenträgerverschlüsselung (Full Disk Encryption, FDE) genannt bezeichnet die Verschlüsselung eines kompletten Datenträgers. Das kann eine oder mehrere Partitionen sein, auch externe Datenträger wie USB-Sticks sind möglich. Die Verschlüsselung greift noch unterhalb des Dateisystems und ist damit für Anwendungen transparent (d.h. unsichtbar). Verschlüsselte Datenträger sind in Linux von Haus aus unterstützt, die Datenträger sind also an jedem Rechner mit einer aktuellen Distribution nutzbar.

Die einzelnen Schritte beziehen sich in diesem Kapitel alle auf LUKS (falls nicht anders angegeben).

Technisch wird grundsätzlich eine Zwischenschicht installiert, die beim Systemstart das Passwort für die Partitionen abfragt und dann dem Betriebssystem transparent über einen sog. „mapper“ Zugriff auf die Daten gibt.

Nötige Kernelmodule:

  1. dm_mod:der device-mapper Treiber)
  2. dm-crypt: device-mapper erweitert um verschlüsselte Datenträger
  3. aes bzw. die optimierten Varianten aes_i586 für 32-Bit oder aes-x86_64 für 64-Bit: Implementierung der AES-Verschlüsselung

Wenn man einen aktuellen Prozessor (Pentium und auf aufwärts + kompatible) einsetzt sollte man aus Geschwindigkeitsgründen immer statt aes das Modul „aes_i586“ oder „aes-x86_64“ (für 64-Bit Prozessoren) nehmen: D.h. in der Datei /etc/modules/ in einer eigenen Zeile eintragen.

Das Management-Tool LUKS (Linux Unified Key Setup) hilft bei der Verwaltung und bietet die Möglichkeit mehrere Passwörter (bis zu 8 pro Container) zu vergeben und diese auch zu löschen (cryptsetup luksDelKey <device> <key slot number>). Beim Anlegen wird die gesamte Festplatte mit einem zufälligen Schlüssel kodiert, für den Zugriff auf diesen Schlüssel wird das angebene Passwort/die Schlüsseldatei verwendet. Deshalb kann der Schlüssel geändert werden ohne die komplette Festplatte neu zu schreiben.

Bei Gnome sollte mit der Software cryptsetup-luks 1.0.1 oder höher, D-Bus 0.60 oder höher, HAL 0.5.7 oder höher eine gute Integration verschlüsselter Partitionen und Sticks gegeben sein: beim einstecken wird automatisch nach dem Passwort gefragt und man könnte es auch im „Schlüsselbund“ speichern lassen.

Passwortaufforderung Gnome 2.18.1 (Ubuntu 7.04)

Eine Verschlüsselung auf Datei- oder Verzeichnisebene lässt sich mit GNU PG (PGP) erreichen, Zusatzprogramme wie pgpdir) helfen dabei.

:!: Mit FreeOTFE lassen sich verschlüsselte dm-crypt/LUKS-Datenträger auch unter Windows lesen. Es ist keine Installation nötig.

:!: Eine gute und für Windows und Linux erhältliche Alternative ist Truecrypt: Es legt verschlüsselte Container an, die sowohl auf Windows als auch auf Linux lesbar sind. Während das bei Vista enthaltene Bitlocker natürlich nur zu sich kompatibel ist.

Datenträgerverschlüsselung
dateiweise komplettes Dateisystem
Kernelspace eCryptfs (experimentell) dm-crypt, dm-crypt/LUKS, LoopAES, Truecrypt
Userspace CryptoFS, EncFS

Von einer Ubuntu-live-CD kann man mit folgendem Shellscripts schnell alle benötigten Teile nachinstallieren:

#!/bin/bash
sudo aptitude -y install cryptsetup lvm2
sudo modprobe dm-crypt
sudo modprobe dm_mod
sudo modprobe aes_i586
# you may want to mount your disk at this point...
 # sudo cryptsetup luksOpen /dev/sda1 HD1
 # mkdir ~/HD1
 # mount -t ext3 /dev/mapper/HD1 ~/HD1

Datenträgerverschlüsselung kann in vieler Hinsicht Sinn machen:

  • Niemand soll meine Daten lesen können.
  • Es soll nicht möglich sein nachzuweisen, dass ich bestimmte Daten auf meiner Festplatte gespeichert habe.
  • Niemand soll gezielt verschlüsselte Daten manipulieren können.
  • Niemand soll nachweisen können, dass ich in letzter Zeit bestimmte Daten geschrieben habe.

Ob es um den Schutz sensibler Kundendaten geht oder ein Schutz sensibler Daten bei Diebstahl (z.B. bei Laptops ein großes Problem), es gibt viele Gründe seine Festplatte zu verschlüsseln.

Ein möglicher Nachteil ist die hohe Systembelastung (vorrangig der CPU) durch die Verschlüsselung/Entschlüsselung der Daten. Es hilft natürlich nicht gegen Angriffe im laufenden Betrieb und gegen das Ausnutzen von Sicherheitslücken im System oder gezielt in der kryptografischen Implementierung. Wenn man keine Sicherheitsupdates („Patches“) einspielt, nutzt auch die beste Verschlüsselung nichts.

Auch die Auslagerungspartition sollte verschlüsselt sein, da hier sensible Informationen ausgelagert sein könnten.

:!: TIP: Die „alternate“-Version von Ubuntu bietet eine automatische Einrichtung eines komplett verschlüsselten LVMs an.

LUKS

  • CBC
  • LRW:
    • sollte prinzipiell schneller als CBC sein, auf dem Ubuntu-Kernel 2.6.20-16-generic ist dies aber nicht der Fall (nachgemessen mit Bonnie++, LRW 384 Bit = effektiv 256 Bit zu 256 Bit CBC)
    • sicherer (als CBC)
    • seit längerem unterstützt (ab Kernelversion 2.6.20)

Der Zugriff erfolgt über einen sog. „mapper“ der sich um die transparenter Ent-/Verschlüsselung kümmert.

  1. den Container/Datenträger öffnen:
    1. mit Passwort:
      sudo cryptsetup luksOpen /dev/sda1 stick

      Wenn ein Keyfile benutzt werden soll ist die Angabe mit dem Parameter –key-file (entspricht dem Parameter -d) notwendig, ansonsten sollte aber auch nach dem keyfile gefragt werden. Ein Schreibschutz des Datenträgers ist mit dem Parameter –readonly möglich.

    2. mit Keyfile:
      cryptsetup luksOpen /dev/sda1 stick --key-file /root/keyfile.key
  2. das Dateisystem mounten:
    sudo mount -t vfat /dev/mapper/stick /media/stick/

dauerhaft beim Booten mounten

Wenn in der Datei /etc/crypttab die verschlüsselte Partition bereits aufgeführt ist, z.B.

# <target name> <source device>         <key file>      <options>
home    /dev/hda2       none            luks,retry=3

dann reicht:

mount /dev/mapper/NAME /Pfad/des/mountpoints

Wenn man beim booten das Passwort falsch eingegeben hat, kann man die Abfrage durch den Befehl

systemctl restart cryptsetup.target

neu starten 1).

:!: Bei der Verwendung von Key-Files trägt man in der /etc/crypttab

# <target name> <source device>         <key file>      <options>
home    /dev/hda2       /root/keyfile.key            luks,retry=3

den Dateinamen und Pfad in der 3. Spalte ein (im Beispiel /root/keyfile.key).

:!: Wenn man (wie es jetzt eigentlich aktuell ist) anstatt der alten Angabe von /dev/sda2 die sich nicht änderbare UUID für udev eintragen will,

  1. muss man diese mit cryptsetup luksUUID /dev/sda2 herausbekommen und
  2. diese Zeile in die crypttab eintragen:
NAME      /dev/disk/by-uuid/fbbb34d4-06b9-40d6-84ee-ad714579fcc6  none   luks,retry=5

Die UUID (fbbb34d4-06b9-40d6-84ee-ad714579fcc6) muss natürlich durch die passende ersetzt werden.

Passwort remote bei vollverschlüsseltem System eingeben

Hier wird kurz die Einrichtung eines verschlüsselten USB-Stick besprochen, der unter den verschiedenen Betriebssystem gleichmaßen angesprochen werden kann.

luksformat wrapper

Wenn man nicht alle Schritte manuell durchführen will, hilft auch das Perl-Skript /usr/sbin/luksformat.

Der Aufruf erfolgt nach folgendem Muster:

luksformat [-t DATEISYSTEM] DEVICE

wobei die Angabe des Dateisystems optional ist. Allerdings wird in diesem Fall das Dateisystem fat32 (bzw. vfat) genommen, welches einige Nachteile hat (keine Zugriffsberechtigungen, nur Datei bis max. 4GB), dafür aber von jedem Betriebssystem beherrscht wird.

Für die 1.SATA-Festplatte und Formatierung mit ext4 sollte die Installation so aussehen:

sudo luksformat -t ext4 /dev/sda1
Erstelle verschlüsselte Partition auf /dev/sda1...

WARNING!
========
Hiermit überschreiben Sie Daten auf »/dev/sda1« unwiderruflich.

Are you sure? (Type uppercase yes): YES
Passphrase eingeben: 
Passphrase wiederholen: 
Bitte zum verifizieren das Passwort erneut eingeben
Geben Sie die Passphrase für »/dev/sda1« ein: 
mke2fs 1.42.13 (17-May-2015)
Ein Dateisystems mit 488377856 (4k) Blöcken und 122101760 Inodes wird erzeugt.
UUID des Dateisystems: ed9576ad-a5db-476d-9874-e58da239f6b5
Superblock-Sicherungskopien gespeichert in den Blöcken: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
	102400000, 214990848

beim Anfordern von Speicher für die Gruppentabellen: erledigt                        
Inode-Tabellen werden geschrieben: erledigt                        
Das Journal (32768 Blöcke) wird angelegt: erledgt
Die Superblöcke und die Informationen über die Dateisystemnutzung werden
geschrieben: erledigt   

manuelle Einrichtung

Wenn man die Schritte manuell eingeben will, dann geht ab hier los; die ausführliche Version gibts auf dieser Seite: Verschluesselter USB-Speicherstick mit LUKS HOWTO. Bei mir ist der Stick das Gerät /dev/sda1 (unverschlüsselt) und sda2 (verschlüsselt), der Name des verschlüsselten Dateisystems für den mapper ist „stick“.

  1. sudo cryptsetup luksFormat /dev/sda1

    2)

  2. den Container/Datenträger öffnen:
    sudo cryptsetup luksOpen /dev/sda1 stick
  3. das Dateisystem fat32 anlegen (damit alle Betriebssysteme schreibunterstützung haben):
     mkfs.vfat -n "sicher" /dev/mapper/stick 
  4. das Dateisystem mounten:
    sudo mount -t vfat /dev/mapper/stick /media/stick/
  5. Änderungen vornehmen (Dateien kopieren, ändern, …)

Passwörter hinzufügen / entfernen

  • Passwörter hinzufügen: man sollte den aktuellen Schlüssel noch mindestens einmal hinzufügen (als kleine Sicherheit gegen Lesefehler genau an der Stelle wo die Schlüssel als Hash gespeichert werden):
sudo cryptsetup luksAddKey /dev/sda1

Die Ausgabe ist dann ähnlich zu dieser hier:

Enter any existing LUKS password: aktuelles Passwort

Zuerst muss man eins der Passwörter angeben

key slot 0 unlocked.

Das Passwort wurde akzeptiert.

Enter new password for key slot: neues Passwort

Neues Passwort eingeben.

  • Passwörter entfernen: Falls einmal ein Passwort bekannt wird oder routinemäßig geändert werden soll ist eine Neuverschlüsselung des Datenträgers notwendig. Man kann den entsprechenden Schlüssel („Key Slot“) selektiv löschen:
 sudo cryptsetup luksDelKey /dev/sda1 1

Im Beispiel wird der KeySlot 1 auf der Partition /dev/sda1 gelöscht.

Zusätzlich (z.B. wenn man nicht mehrfach Schlüssel eingeben möchte) ist die Verwendung von Keyfiles (Dateien die den Zugangschlüssel enthalten bzw. als solcher dienen) möglich. Auch bei automatisierten Backups bietet sich diese Vorgehensweise an. Die Keyfiles sollte man allerdings sehr gut absichern, es bietet sich die Ablage auf dem ersten verschlüsselten Laufwerk an. Die Dateien sollte ausschließlich root lesen können (chmod 700 keyfile1.key und chown root keyfile1.key)!

  • Keyfile erzeugen:
sudo dd if=/dev/urandom of=/root/keyfile1.key bs=256 count=1

Hiermit wird ein 256 Bit großes Keyfile aus Zufallswerten erzeugt. Der Speicherort ist hier /root/keyfile1.key, er sollte auf jeden Fall an einem verschlüsselten Ort gespeichert werden.

  • Keyfile hinzufügen:
    sudo cryptsetup luksAddKey /dev/sda1 /root/keyfile1.key

/dev/sda1 ist natürlich nur ein Vorschlag und sollte ggf. angepasst werden, wenn alles stimmt ergibt sich folgende Ausgabe:

Enter any LUKS passphrase:
 key slot 0 unlocked.
 Command successful.

Wenn man ganz ohne Passwörter auskommen will, gibt man beim formatieren des Datenträgers nur das Keyfile an:

cryptsetup luksFormat /dev/sda1 /root/keyfile1.key
  • Keyfiles entfernen geht allgemein anhand des Keyslots (wie oben):
    sudo cryptsetup luksDelKey /dev/sda1 1

    In neueren Version ist „luksDelKey“ als veraltet gekennzeichnet und wurde durch luksKillSlot ersetzt:

    sudo cryptsetup luksKillSlot /dev/sda1 1
  1. Dateisystem aushängen:
    umount /media/stick

    Nun sollte man die Datenträger vollständig unzugreifbar machen, sonst könnte ein anderer Benutzer den Datenträger ohne Passworteingabe mounten.

  2. den verschlüsselten Datenträger aus dem den Mapper entfernen:
    cryptsetup luksClose stick

    oder das Shell-Skript (s.u.) benutzen.

:!: Alle Datenträger lassen sich (wenn die jeweiligen Dateisystem bereits ausgehangen sind) mit

dmsetup remove_all

unzugreifbar machen.

Shell-Skript zum Auswerfen eines verschlüsselten Dateisystems

http://www.saout.de/tikiwiki/tiki-index.php?page=dumount

Dieses Skript

  • wirft den Datenträger aus (unmount)
  • entfernt den „Mapper“ wenn das Dateisystem nicht in Benutzung ist

Die Variablen

  1. mappername
  2. mpoint

müssen an die richtigen Einstellungen angepasst werden.

#!/bin/sh
 
mappername="secure"
mpoint="/mnt/secure"
 
if grep $mpoint /etc/mtab > /dev/null; then
fuser -m $mpoint > /dev/null || (umount /mnt/secure/; cryptsetup remove $mappername)
else
echo $mpoint is not mounted!
if [ -e /dev/mapper/$mappername ]]; then
echo "Removing the mapper " $mappername
cryptsetup remove $mappername
fi
fi

Mit dem Befehl dmsetup kann man schauen, ob verschlüsselte Datenträger vorhanden sind.

  • Informationen über sämmtliche (verschlüsselte und eingehangene) Datenträger
    dmsetup info
  • Informationen über einzelne (verschlüsselte und eingehangene ) Datenträger:
sudo cryptsetup status home

(home ist der mapper-name) oder sehr ausführliche Header-Informationen mit verwendeten key-slots:

sudo cryptsetup luksDump /dev/hda4

.

Optional: Falls man einen RAID-Controller mit Migration-Funktion hat, kann dieser ohne Datenverlust neue Platten einbinden und damit die Kapazität erhöhen.

  • fdisk (bei Partitionen bis 2 TB):
    sudo fdisk /dev/sda
    p                                   #Partitionstabelle anzeigen
    d                                   #sda1 gelöscht (Daten werden nicht gelöscht sondern der Master boot record (MBR)
    n                                   #mit den Vorgegebenen Werten eine Partition über die ganze platte erstellt
    w                                   #Tabelle geschrieben
    q
  • bei GPT-Partitionen funktioniert cfdisk:
    cfdisk /dev/sd

Cryptsetup macht macht den resize automatisch:

sudo cryptsetup luksOpen /dev/sda1 sda

Dateisystemcheck muss vorher gemacht werden:

e2fsck -f /dev/mapper/sda1

Das ext3-Dateisystem wird an die neue Größe ausgedehnt:

sudo resize2fs -p /dev/mapper/sda1

optional nochmal checken:

e2fsck -f /dev/mapper/sda1

siehe auch: LUKS Partition vergrößern. (Ohne LVM)

pvresize --setphysicalvolumesize 40G /dev/sda1

1)
früher /etc/init.d/cryptdisks
2)
Die Standard-Verschlüsselungsparameter liefert
cryptsetup --help
bei Luks1 sind dies aktuell: aes-xts-plain64, Schlüssel: 256 Bits, LUKS-Header-Hashen: sha1, Zufallszahlengenerator: /dev/urandom