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
/etc/fstab
/dev/mapper/myluksdrive /mnt/myluksdrive xfs defaults 0 0
/etc/crypttab
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:

/etc/crypttab
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