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).
technische Hintergründe
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:
dm_mod
:der device-mapper Treiber)dm-crypt
: device-mapper erweitert um verschlüsselte Datenträgeraes
bzw. die optimierten Variantenaes_i586
für 32-Bit oderaes-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.
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 |
Zugriff von einer Live-CD
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
Warum Datenträgerverschlüsselung?
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.
Links
- CryptoBox: Weboberfläche oder Live-CD für die einfache Nutzung von Datenträgerverschlüsselung
dm-crypt
LUKS
- System verschlüsseln - sehr gute Anleitung für Ubuntu
loop-AES (veraltet)
andere Ansätze
Verschlüsselung bei Luks
- CBC
- gut erforscht, zuverlässig
- anfällig gegen „content-leaks“ siehe: Linux hard disk encryption settings
- LRW:
verschlüsselte Datenträger öffnen
Der Zugriff erfolgt über einen sog. „mapper“ der sich um die transparenter Ent-/Verschlüsselung kümmert.
- den Container/Datenträger öffnen:
- 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. - mit Keyfile:
cryptsetup luksOpen /dev/sda1 stick --key-file /root/keyfile.key
- 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,
- muss man diese mit
cryptsetup luksUUID /dev/sda2
herausbekommen und - 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
Anlegen eines verschlüsselten Datenträgers
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“.
sudo cryptsetup luksFormat /dev/sda1
- den Container/Datenträger öffnen:
sudo cryptsetup luksOpen /dev/sda1 stick
- das Dateisystem fat32 anlegen (damit alle Betriebssysteme schreibunterstützung haben):
mkfs.vfat -n "sicher" /dev/mapper/stick
- das Dateisystem mounten:
sudo mount -t vfat /dev/mapper/stick /media/stick/
- Ä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.
Keyfiles hinzufügen / entfernen
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
Datenträger auswerfen
- 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.
- 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
- mappername
- 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
Informationen anzeigen
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
.
verschlüsselte Datenträger vergrößern ohne LVM
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)
verschlüsselte Datenträger verkleinern
pvresize --setphysicalvolumesize 40G /dev/sda1