Filesystem verschlüsseln

From Linuxwiki
Revision as of 21:41, 15 October 2023 by Sunflower (talk | contribs) (→‎Alternative cryptmount)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Ziel

Wir wollen ein komplettes Filesystem verschlüsseln, so dass es in ungemountetem Zustand nicht lesbar ist.

Anwendung

Wir erstellen beispielhaft einen verschlüsselten USB-Stick, der nach Eingabe eines Passworts ganz normal als ext4-Filesystem gemountet werden kann.

verwendete Software

cryptsetup mit LUKS (kommt aus dem Paket cryptsetup-bin)

Wie geht's

Als erstes ermitteln, um welches Device es sich handelt. Hier im Beispiel wird /dev/sdd1 verwendet (wie ein Device partitioniert wird, kann man hier nachlesen).

  • Zunächst wird das Filesystem verschlüsselt. Achtung: Dabei gehen alle Daten verloren !
# cryptsetup luksFormat -v /dev/sdd1 

WARNING!
========
This will overwrite data on /dev/sdd1 irrevocably.

Are you sure? (Type uppercase yes): YES
Enter passphrase: 
Verify passphrase: 
Command successful.

Achtung, wird das Passwort vergessen, sind alle Daten unwiderbringlich verloren !

  • Dann wird das verschlüsselte Device angelegt (der Name ist frei wählbar)
# cryptsetup luksOpen /dev/sdd1 usbdata
Enter passphrase for /dev/sdd1:
  • Das neue Device mit ext4 formatieren:
# mkfs.ext4 /dev/mapper/usbdata
  • Das Device mounten
# mount /dev/mapper/usbdata /usb/
  • Nun kann das Device wie gehabt beschrieben werden.
  • Unmounten des Device:
# umount /usb
  • Verschlüsseln des Device
# cryptsetup luksClose usbdata
  • Will man das Device erneut mounten, muss es wieder entschlüsselt werden:
# cryptsetup luksOpen /dev/sdd1 usbdata

Mounten ohne Passworteingabe:

Prinzipiell ist es möglich, das Device auch ohne Eingabe eines Passworts zu mounten. Hierfür legt man zunächst ein Keyfile an:

# dd if=/dev/urandom of=/usr/local/share/keyfile bs=1024 count=4
# chmod 0400 /usr/local/share/keyfile
# cryptsetup luksAddKey -v /dev/sdd1 /usr/local/share/keyfile

Damit das Keyfile auch gefunden wird, muss es folgenden Eintrag in der /etc/crypttab geben:

usbdata /dev/sdd1 /usr/local/share/keyfile luks,noauto

Ohne noauto muss der USB-Stick beim Booten eingesteckt sein, sonst geht es hier nicht weiter.

Optional noch in der /etc/fstab eintragen

/dev/mapper/usbdata       /usb         auto    rw,user,noauto,errors=continue 0 0

Vereinfachung

Jetzt stellt sich natürlich die Frage, ob man sich es sparen kann, nach jedem Booten das lange Command cryptsetup luksOpen ... einzugeben. Das Paket cryptsetup bringt hier ein praktisches Tool mit namens cryptdisks_start. Hier muss man lediglich den Name des Devicemappings kennen.

# cryptdisks_start usbdata

bzw. nach dem Unmounten analog dazu

#  cryptdisks_stop usbdata

Verlust des Keyfiles

Sollte in der Praxis nie vorkommen (mind your Backup !), falls doch, kann man notfalls folgendes tun.

- Eintrag in der crypttab auskommentieren
- mit cryptsetup öffnen ( cryptsetup luksOpen /dev/<devicename> <mapped_name> )

Hierfür muss natürlich das Passwort bekannt sein. Geht dieses auch noch verloren, sind die Daten futsch !

Partition vergrößern

Kann z.B. interessant werden, wenn es sich nicht um einen USB-Stick, sondern die Partition einer Festplatte handelt. In diesem Fall ist die richtige Reihenfolge:

- Partition vergrößern
- luks Filesystem vergrößern
- ext4 vergrößern

  • Partition unmounten
# umount /crypt
  • Partition vergrößern (Achtung, vorher Backup der Daten machen!):
# fdisk /dev/sda
 d
 (partitionsnummer angeben)
 n
 (partitionsnummer angeben)
 (gewünschte Größe angeben)
  • luks Filesystem vergrößern
# cryptsetup resize usbdata
  • ext4 vergrößern:
# e2fsck -y -f /dev/mapper/crypt
# resize2fs -p /dev/mapper/crypt
  • Partition wieder mounten
# mount /crypt

Alternative cryptmount

Paket cryptmount installieren. Dann die Datei /etc/cryptmount/cmtab editieren. Hier ein Beispiel, wie diese aussehen kann:

 LUKS {
        keyformat=luks
        dev=/dev/sdb1
        dir=/var/data
        fstype=ext4
        keyfile=/usr/local/share/keyfile
 }

Mit dem Command

cryptmount LUKS

entschlüsselt und mountet man die Disk auf den mit "dir" angegebenen Mountpoint.

Lässt man den keyfile-Parameter weg, muss man ein Passwort eingeben.

Advanced

Eine gecryptete / Partition auf eine neue lvm-basierte gecryptete /-Partition ummounten. Achtung: nur für Geübte !
Live-CD bzw. -Stick griffbereit halten und vorher backupen !

Die ist kein lvm-Howto. Weiter Erklärungen s. z.B. https://www.howtoforge.com/linux_lvm
Hier wird der Einfachheit halber mit /dev/sda bzw. der neuen Partition /dev/sda8 gearbeitet -> keinen copy-paste-Anleitung, da durch Bezeichnungen der eigenen Disk zu ersetzen!

neue Partition erstellen

# fdisk  /dev/sda
  n (für new eingeben)
  p(rimary) oder l(ogical) wählen
  Größe festlegen
 p(rint) (Ausgabe erzeugen und Partitionsnummer merken
 w(rite)

neues physical Volume erstellen

(falls nicht ohnehin vorhanden)

# pvcreate /dev/sda8

neue Volume Group erstellen

(wenn nicht vorhanden)

# vgcreate vg-00 /dev/sda8

neues Logical Volume erzeugen

# lvcreate -n newroot -l 100%FREE vg-00

Cryptdevice erzeugen

  1. cryptsetup luksOpen /dev/vg-00/newroot new_root
  2. cryptsetup luksAddKey /dev/vg-00/newroot /root/keyfile

Crypttab und fstab korrigieren

crypttab

new_root   /dev/vg--00-newroot  none  luks

per

# ls -l /dev/mapper

überprüfen, wie das neue Device heißt und in die fstab eintragen z.B.

/dev/mapper/new_root    /        ext4    defaults        0       2

Mehrere verschlüsselte Partitionen

Möglicherweise hat man auf einer Disk mehrere verschlüsselte Partitionen. Falls man nicht mit Keyfiles (s.o.) arbeitet, muss man bei jedem Mount ein Passwort eingeben. Das ist lästig und kann mit dem Eintrag "keyscript" in der Crypttab vermieden werden. Beispieleintrag:

nvme0n1p5_crypt UUID=d03be11b-282b-45dd-a14e-6c8f2fef3dd3 none luks,keyscript=decrypt_keyctl,discard
nvme0n1p6_crypt UUID=c2dfc5a7-dc4e-4425-b24f-409fd585d0ba none luks,keyscript=decrypt_keyctl,swap,discard
(...)

Das Passwort muss dann natürlich immer dasselbe sein.

grub.cfg korrigieren

Namen des alten root-Devices durch das neue ersetzen (z.B. /dev/mapper/root durch /dev/mapper/new_root)

Ramdisk image erneuern

 update-initramfs -u

Achtung: Sollte der folgende Fehler auftreten:

 E: /usr/share/initramfs-tools/hooks/cryptkeyctl failed with return 1.
 update-initramfs: failed for /boot/initrd.img-4.19.0-9-amd64 with 1.

muss das Paket "keyutils" installiert sein!

# apt install keyutils

Restore im Fehlerfall

Sollte einer dieser Schritte fehlschlagen und der PC nicht mehr booten, kann man ihn mit einer Live-CD hochfahren und von dort aus Korrekturen vornehmen.

  • Volume Group aktivieren:
# vgchange -ay
  • Cryptdevice zum Mounten vorbereiten
# cryptsetup luksOpen /dev/vg-00/newroot new_root
  • Device mounten:
# mount /dev/mapper/vg--00-new_root /mnt

Weitere evtl. benötigte Unterverzeichnisse mounten:

# mount /dev/sda1 /mnt/boot
# mount -o bind /proc /mnt/proc
# mount -o bind /sys /mnt /sys
  • crypttab, fstab und grub.cfg auf eventuelle Fehler untersuchen
  • Kernel ermitteln:
via dpkg oder ls -l /boot
  • Ramdisk image erzeugen:
 update-initramfs -k <kernel version> -u

Quellen

https://www.cyberciti.biz/hardware/howto-linux-hard-disk-encryption-with-luks-cryptsetup-command/

https://www.howtoforge.com/automatically-unlock-luks-encrypted-drives-with-a-keyfile

http://serverfault.com/questions/714605/can-cryptsetup-read-mappings-from-etc-crypttab