LUKS
LUKS (Linux Unified Key Setup) wird zur Festplattenverschlüsselung zum Schutz sensibler Daten gegen physischen Diebstahl eingesetzt, ermöglicht aber auch den Schutz gegen Datenwiederherstellung nach Verkauf oder Entsorgung von Datenträgern, ohne sie vorher unbedingt überschreiben oder zerstören zu müssen.
Da die Verschlüsselung zwischen der höheren Ebene des Dateisystems und über den RAID-, LVM u.a. Layern stattfindet, ist sichergestellt, dass der gesamte Storage-Layer mit den üblichen Daten arbeiten kann und nach wie vor alle Festplatten-Befehle wie gewohnt funktionieren. Ausserdem verhalten sich so alle Festplatten im RAID- oder LVM-Verbund gleich.
In RHEL 8+ sind folgende Verschlüsselungsalgorithmen als Standard hinterlegt:
yum -y install cryptsetup
cryptsetup --help
Default compiled-in key and passphrase parameters:
Maximum keyfile size: 8192kB, Maximum interactive passphrase length 512 (characters)
Default PBKDF for LUKS1: pbkdf2, iteration time: 2000 (ms)
Default PBKDF for LUKS2: argon2i
Iteration time: 2000, Memory required: 1048576kB, Parallel threads: 4
Default compiled-in device cipher parameters:
loop-AES: aes, Key 256 bits
plain: aes-cbc-essiv:sha256, Key: 256 bits, Password hashing: ripemd160
LUKS: aes-xts-plain64, Key: 256 bits, LUKS header hashing: sha256, RNG: /dev/urandom
LUKS: Default keysize with XTS mode (two internal keys) will be doubled.
Datenträger verschlüsseln
Um im Beispiel die Disk /dev/vdb
zu verschlüsseln, ruft man cryptsetup
auf. Die Einrichtung der Verschlüsselung löscht die vorhandenen Daten.
lsblk
LUKSDEV=/dev/vdb
# prompting for a password
cryptsetup luksFormat $LUKSDEV
# without prompting for a password; password from STDIN
echo -n "mypassword" | cryptsetup luksFormat $LUKSDEV -
# without prompting for a password; password from keyfile
cryptsetup luksFormat $LUKSDEV /root/keyfile
Jetzt YES
eingeben (man beachte die Grossschreibung) und ein Passwort für die Verschlüsselung vergeben. Der Parameter --batch-mode
unterdrückt die Sicherheitsabfrage.
Mit LUKS verschlüsselte Disks und Partitionen tauchen unter /dev/mapper/
auf, benötigen dafür aber einen Klartext-Namen, den man folgendermassen vergibt:
cryptsetup luksOpen $LUKSDEV myluksdrive
Das LUKS-Device verlangt nach dem Passwort. Per
ls /dev/mapper
wird das LUKS-Device als /dev/mapper/myluksdrive
aufgeführt.
Datenträger verwenden
Um mit dem LUKS-Device zu arbeiten, benötigt diese noch ein Dateisystem. Soll das LUKS-Device nach dem Booten automatisch zur Verfügung stehen, muss es neben der /etc/fstab
auch in die Datei /etc/crypttab
eingetragen werden:
cryptsetup luksOpen $LUKSDEV myluksdrive
mkfs --type xfs /dev/mapper/myluksdrive
mkdir /mnt/myluksdrive
mount /dev/mapper/myluksdrive /mnt/myluksdrive
/dev/mapper/myluksdrive /mnt/myluksdrive xfs defaults 0 0
myluksdrive $LUKSDEV
Wichtig: Sobald die Maschine neu gestartet wird, verlangt GRUB während des Bootvorgangs die Eingabe des Passworts, um das LUKS-Device beim Boot zu aktivieren. Ist gefordert, dass RHEL das Passwort automatisch aus einer Datei ausliest - im Server-Umfeld die Regel - muss die /etc/crypttab
umformuliert werden:
myluksdrive $LUKSDEV /path/to/passwd/file
Das Passwort kann im Klartext in einer Text-Datei abgelegt werden (chmod 0400 /path/to/passwd/file
). Diese muss noch importiert werden:
cryptsetup luksAddKey $LUKSDEV /path/to/passwd/file
LUKS-Passwort ändern:
# find the LUKS encrypted device - try for all:
sudo cryptsetup luksDump /dev/vda3
# note down slot number from this command:
sudo cryptsetup --verbose open --test-passphrase /dev/vda3
sudo cryptsetup luksChangeKey /dev/vda3 --key-slot=0
Um später weitere Passwörter hinzuzufügen, verwendet man:
cryptsetup luksAddKey $LUKSDEV
Wer nur Key-Files verwendet, kann so weitere Secrets hinzufügen:
echo -n "mypassword" | cryptsetup luksAddKey /dev/mapper/myluksdrive --key-file=/root/keyfile
Falls das LUKS-Device nicht per fstab, sondern manuell eingebunden werden soll:
cryptsetup luksOpen $LUKSDEV myluksdrive
mount /dev/mapper/myluksdrive /mnt/myluksdrive
Datenträger auswerfen:
umount /mnt/myluksdrive
cryptsetup luksClose myluksdrive
LUKS-Header sichern und wiederherstellen
LUKS-Header der verschlüsselten Disk sichern - dies unbedingt IMMER vor jeder Änderung an den LUKS-Headern durchführen:
cryptsetup luksHeaderBackup /path/to/encrypted/device --header-backup-file /path/to/backup/file
Wieviele Passwörter/Keys (von max. 16) sind verfügbar?
cryptsetup luksDump /path/to/encrypted/device
LUKS-Header aus einem Backup zurückspielen:
cryptsetup luksHeaderRestore /path/to/encrypted/device --header-backup-file /path/to/backup/file
Mount einer (geclonten) LUKS-Partition mit LVM2
Wie mountet man eine LUKS-Partition auf einer Disk, die mit LVM arbeitet, deren VG-Name aber unbekannt ist - der Name aber potentiell mit einem bereits lokalen, aktiven VG-Namen identisch ist? Dies kann passieren, wenn man eine alte Disk mountet, von der geklont wurde, oder die aufgrund einer Neuinstallation desselben Betriebssystems auf einer neuen Disk ersetzt wurde.
Im Beispiel wird der einzuhängenden VG einfach der Name „my_old_disk“ gegeben. LUKS speichert keine Partitionsnamen in seinen Tabellen, der Name ist daher lediglich für einen selbst und spielt überhaupt keine Rolle.
OLD_DISK=my_old_disk
OLD_LV=root
PARTITION=sda3
sudo cryptsetup luksOpen /dev/$PARTITION $OLD_DISK
sudo lvmdevices --adddev /dev/mapper/my_old_disk
sudo pvscan
# rename the LVM, just to to be sure
sudo vgimportclone --basevgname $OLD_DISK /dev/mapper/$OLD_DISK
sudo vgchange -ay
sudo mkdir -p /mnt/$OLD_DISK
sudo mount /dev/$OLD_DISK/$OLD_LV /mnt/$OLD_DISK
Built on 2024-09-30