Vollverschlüsselung mit /boot für Ubuntu (Debian)

Ubuntu full disk encryption with encrypted /boot

  Verschlüsselung einschließlich /boot umsetzen, auch nachträglich



Gegeben 

Eine Debian basierte Linux Installation; beste Ergebnisse mit Ubuntu 20.04;
NICHT möglich: Ubuntu 24.x und XFCE4 (bei direkter Installation).
Ziel: alle Partitionen verschlüsseln.
Für Nachträglich oder als Neuinstallation.
Basis: Grub2 (systemd boot mit systemd.generator leider hier noch nicht)

Vorbereitung

LUKS installieren
	sudo apt-get install cryptsetup

Zielstellung:

Problem

Gute Anleitungen gibt es (nur) für Arch Linux
Debian-basierte machen die initramfs anders als Arch
Das Entschlüsseln muss mehrstufig ablaufen

Lösung

GRUB entsperrt /boot
initramfs kann den Rest mit gleichen Schlüsseln erledigen

Vorteile

Das Vorgehen:
  1. Ubuntu von externem Datenträger booten
  2. drei neue Partitionen schaffen für LUKS (gpt typ 8309 für LUKS; swap hier ignoriert), nicht formatieren
    1. für /boot mit LUKS 1 verschlüsseln (Details im Folgenden!)
    2. die weiteren (/ root und /home) mit LUKS 2 verschlüsseln
  3. die drei LUKS Laufwerke mappen
  4. ext4-formatieren der mappings für /boot, / root und /home evtl. swap
  5. Installationsroutine starten, gemappte Partitionen nicht reformatieren, grub anpassen, abspulen, nicht rebooten!
  6. Chroot aus dem laufenden Fremdmedium in die neue Installation (siehe chroot)
  7. Anpassungen im chroot:
    1. fstab kontrollieren, editieren
    2. keyfile generieren und hinterlegen in /etc
    3. keyfile als LUKS key in jedem verschlüsselten Laufwerk dem blockdevice hinzufügen
    4. Datei /etc/initramfs-tools/initramfs.conf muss da sein, nicht anpassen
    5. Datei /etc/cryptsetup-initramfs/conf-hook anpassen an Schlüssel
    6. /etc/default/grub anpassen, Entschlüsseln anweisen
    7. /etc/crypttab für die "späteren" decrypt per Schlüssel anpassen
    8. initramfs den Debian Weg bauen
    9. grub update
    10. grub installation
  8. Chroot verlassen und neue Umgebung booten.
    Password für GRUB decrypt hat nur 1 Versuch (?!)

Gute Literatur







Die Schritte im einzelnen:

Warnung: Vorsicht mit typographischen " " "

0. Ubuntu ist Debian basiert

Ubuntu ist Debian basiert, das ist im Ablauf etwas anders als Arch Linux.
Extern kann für die ersten Schritte (Partitionen erzeugen, LUKS-Format auf dem Blockdevice) irgend ein Linux sein.
Einfach ist, die Neuinstallation auf entschlüsselte LUKS-"Laufwerke" (entschlüsselte und fertig formatierte mappings) zu machen.
Alles in einem Rutsch: Dazu am Besten ein Live-iso starten, LUKS machen, Installation, Anpassen, reboot.

1. Drei neue Partitionen schaffen

1.a. für /boot mit LUKS 1 verschlüsseln  (siehe Schweinekraftland 2. Aufsetzen von LUKS auf der Zielpartition für Details)

besonders:
cryptsetup luksFormat --type luks1 [...] /dev/nvme0n1p51   nur für /boot
dann testen:
cryptsetup luksDump  /dev/nvme0n1p51zeigt tatsächlich Version 1 (muss auf /boot wegen GRUB!)

1.b. die weiteren (/ root und /home) mit LUKS 2 verschlüsseln

Root / und /home: luksFormat Optionen: siehe Schweinekraftland 2. Aufsetzen von LUKS auf der Zielpartition
Muster:
cryptsetup  luksFormat -s 256   -c  twofish   /dev/sda52
Password normal (initial) setzen.

2. die drei LUKS Laufwerke auf LUKS-IDs mappen 

siehe Schweinekraftland 3. Mapping erzeugen
(gpt typ 8309 für LUKS)

und Schweinekraftland 4. Dem Mapping einen Namen geben

3. ext4-formatieren der LUKS-mappings für /boot, / root und /home  evtl. swap

(siehe Schweinekraftland 5. Ein Dateisystem erzeugen )

ext4-formatieren der LUKS-mappings (alle drei)

EFI Partition bereitstellen
Min 200MB, Pop-OS min. 1024 MiB
gdisk type ef00 entspricht "boot"-flag in parted,  "EF00" is just a mnemonic for "C12A7328-F81F-11D2-BA4B-00A0C93EC93B".
FAT32       sudo mkfs.vfat -F 32 -v -c //dev/nvme0n1p1
wegen (U)EFI Gedoens keine EF02 erforderlich;
nicht wichtig: /etc/fstab


Mappings nicht mounten vor Start Installationsroutine.

4. Installationsroutine

Die Installationsroutine als UEFI, nicht MBR vom Stick starten, Ubuntu 20.04 ist geeignet; 
gemappte, nicht gemountete Partitionen benutzen,
nicht reformatieren, nicht rebooten!
(gilt zumindest für Ubuntu 20.x, nicht mehr für 24.x; log ist in /var/log/syslog zu verfolgen)

Installationsroutine mit den mappings starten,
stoppen
vor Eingabe "Namen":
            STOP ! ! 
Jetzt ist der Installations-chroot (/target/) schon aktiv & verfügbar: findmnt machen.

Wechseln in /target  (das ist das chroot)

Ziel: /etc/default/grub editieren bevor die eigentliche Installation abläuft:


4.a.  /etc/default/grub anpassen, Entschlüsseln anweisen

grub muss Anweisung haben zu entschlüsseln, dazu:

sudo vi  /target/etc/default/grub
dann setzen:
GRUB_ENABLE_CRYPTODISK=y
GRUB_PRELOAD_MODULES="part_gpt part_msdos" 
dazu nicht!:
# GRUB_PRELOAD_MODULES="luks cryptodisk" # niemals!
und auch keine Kernel-Parameter aus den Arch-Linux-Beschreibungen übernehmen.

Alles andere erst später im CHROOT machen.

------

Jetzt Installationsroutine fortsetzen.
Nur ganz einfache Laufwerks / mount Zuweisungen im Installationsvorgang wählen, besser später migrieren auf Partitionen.
Soweit abschließen, dass der Neustart angeboten wird; Stop!

------

5. chroot

chroot machen.
Im chroot bleiben bis zum Ende.

Das Grundmuster richtet sich nach diesem Schema:
Reihenfolge root - boot - home - ....

mount /dev/mapper/luks-root-a704d44f-7164-43aa-a6e3-c507589b876c /mnt
mount /dev/mapper/luks1-boot-e1f480df-5191-4eeb-baa1-1bc3603e1ffd /mnt/boot
mount /dev/mapper/luks-home-292c037c-e53b-4eb5-892a-f902eb2024ff /mnt/home

mount /dev/nvme0n1p1 /mnt/boot/efi/

mount -t tmpfs /run /mnt/run
mount -t tmpfs /dev /mnt/dev

mkdir /mnt/dev/pts

mount -t devpts /dev/pts /mnt/dev/pts
mount -t proc /proc /mnt/proc
mount -t sysfs /sys /mnt/sys
mount -o bind /dev /mnt/dev
mount -o bind /sys /mnt/sys

   optional:
xx  modprobe efivars

chroot /mnt /bin/bash

   bei xx)
((optional: cp /etc/resolv.conf /mnt/etc/ #makes the network available after chrooting schwachSinn weil als link genutzt))
modprobe efivars      # make sure this is loaded
muss ohne Fehler zurueckkommen (bzw. $? ist 0)

erzeugt den prompt: root@ubuntu:/#   :-) 

wenn EFI fehlt (schadet nicht):
grub-install --target=x86_64-efi --efi-directory=/boot/efi --no-nvram -v /dev/nvme0n1

optional prüfen:
/target/sys/firmware/efi/efivars efivarfs           efivarfs         zeigt an, dass Kernelmodul efivars bereits früher geladen wurde.


Jetzt prüfen: /etc/default/grub (wurde vom setup geändert!)
usw.



6. Anpassungen im chroot

4.a.  /etc/default/grub anpassen, Entschlüsseln anweisen

hier detailliert nachprüfen!
GRUB_ENABLE_CRYPTODISK=y
GRUB_PRELOAD_MODULES="part_gpt part_msdos" 

optional:
GRUB_DEFAULT=0
GRUB_TIMEOUT=7
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT=""
GRUB_CMDLINE_LINUX=""
GRUB_SAVEDEFAULT=true
GRUB_TIMEOUT_STYLE=menue
GRUB_DISABLE_OS_PROBER=false
GRUB_DISABLE_RECOVERY=false
GRUB_DISABLE_SUBMENU=false

bitte NICHT  GRUB_ENABLE_CRYPTODISK=n

6.a. Prüfen von fstab

fstab ist normal schon OK von der Installation.  
Hier sind die mappings wie üblich einzutragen (mit Pfad);
swap ist präsent, wird hier nicht beachtet
EFI wurde von der Installationsroutine gesetzt
"defaults" ist optimierungsbedürftig
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
/dev/mapper/sonderrot-luks-70176### /               ext4    errors=remount-ro 0       1
/dev/mapper/sonderboot-luks1-9e95e059### /boot           ext4    defaults        0       2
/dev/mapper/sonderhom-luks-0f018311-1### /home           ext4    defaults,users,exec,rw        0       2
# /boot/efi was on /dev/nvme0n1p1 during installation
UUID=0243-9A63  /boot/efi       vfat    umask=0077      0       1

6.b. keyfile generieren und hinterlegen in /etc

Prereq:
cryptsetup-initramfs ist installiert (normal)

Create a randomised key-file of 4096 bits (512 bytes)
    generisch:
    dd if=/dev/urandom of=/etc/schliessauf.keyfile bs=512 count=4
Es können diverse keys verwendet werden. Dateien sollen auf ".keyfile" enden. 
/etc/schliessauf.keyfile
Rechte beschränken: Nur r für root
sudo chmod u-wx,go-rwx /etc/schliessauf.keyfile     
Ablegen in /boot und in /etc:
Der Ort ist _nicht_ wahlfrei (ausser für /home?). Sonst scheitert Kompilieren initramfs.
    boot und root in /etc,
    home in /boot;
    sonstige können nach /etc


6.c. keyfile als LUKS key in jedem verschlüsselten Laufwerk dem blockdevice hinzufügen

Kann weiter im chroot gemacht werden.
Zu Passwörtern und Schlüsseln: (siehe auch Schweinekraftland Password ändern, zurückziehen )
/boot wird von GRUB geöffnet UND nachher von cryptsetup.
Optional: Um root und /home in einem Vorgang zu öffnen, den key auch dafür verwenden.

Vor-Test:
        sudo cryptsetup  luksDump /dev/nvme0n1p51   (usw., sollte nur Key Slot 0: ENABLED zeigen)

Dazu den Schlüssel in LUKS hinterlegen (siehe auch Schweinekraftland):
generisch:
sudo cryptsetup luksAddKey -v   /dev/nvme0n1p000   /etc/meinkey.keyfile  (alles als root!  Ebenso fuer alle Partitionen)
Key in einen slot auf jedem Blockdevice hinzufügen:
cryptsetup luksAddKey   /dev/nvme0n1p51 /etc/meinkey.keyfile
cryptsetup luksAddKey   /dev/nvme0n1p52  /etc/meinkey.keyfile
cryptsetup luksAddKey   /dev/nvme0n1p53  /etc/meinkey.keyfile
(keyfile sollte identisch sein an allen Orten, sonst getrennt behandeln)

6.d. Datei /etc/initramfs-tools/initramfs.conf

/etc/initramfs-tools/initramfs.conf  muss bereits da sein

Soll sein: Setze unten hinzu

UMASK=0077
in
/etc/initramfs-tools/initramfs.conf 
(spezifiziert und vermeidet Fehlermeldungen u. Probleme in update-initramfs).


6.e. Datei /etc/cryptsetup-initramfs/conf-hook anpassen an Schluessel

Debian erzeugt das initramfs anders als Arch!  Deshalb
 - conf-hook editieren und dann
 - kompilieren (erst in 6.h.)

/etc/cryptsetup-initramfs/conf-hook erzeugen; wird evtl. spaeter ueberschrieben
Configuration file für cryptroot initramfs hook wie folgt erzeugen:  

        vi /etc/cryptsetup-initramfs/conf-hook

Inhalt conf-hook:
KEYFILE_PATTERN="/etc/*.keyfile"     
#ASKPASS=y        
Wildcard ist Absicht. So lassen; ASKPASS ist bewusst auskommentiert.
Voraussetzung zum Kompilieren: 
Keyfile ist in /etc/crypttab hinterlegt (Ort wird angegeben, kann anders)
Siehe 6.c. keyfile

6.g.    /etc/crypttab fuer die "spaeteren" decrypt per Schluessel anpassen


Anpassen von /etc/crypttab (ohne Pfade) auf den oder die Dateien als Schlüssel.
/boot und / (root) aus /etc, /home aus /boot oeffnen.
Angabe der slot-Nummer zur Performance-Verbesserung möglich (,key-slot=1)
Muster:
vi /etc/crypttab

## crypted /boot to be opened by GRUB:
boot-luks1-9e95e059###    UUID="9e95e059###"    /etc/schliessauf.keyfile    luks,discard

## crypted root / to be opened by cryptomount:
root-luks-70176###    UUID="70176###"            /etc/schliessauf.keyfile luks,discard

## crypted home to be opened from keyfile like root:
hom-luks-0f018311-1###    UUID="0f018311-1###"    /boot/schliessauf.keyfile luks,discard
Der Ort ist _nicht_ wahlfrei (ausser für /home?). Sonst scheitert Kompilieren initramfs.
    boot und root in /etc, home in /boot

6.h. initramfs den Debian Weg bauen

Unbedingt CHROOT 

Kompilieren initramfs:

        update-initramfs -k all -c

optional mit -v  (verdeckt auch Fehler!)

Verifizieren: 
als root
aus /boot heraus (!)
cd /boot
lsinitramfs initrd.img | grep -i cryptroot/keyfile
z.B.:
root@xubuntu:/boot# lsinitramfs initrd.img | grep -i cryptroot/keyfile
(das prompt ist tatsächlich :/boot# )
Ergebnis etwa so:
cryptroot/keyfiles
cryptroot/keyfiles/lucrypt-8e600aa0-616b-4578-8150-cafe09e0efab.key

6.i. grub update

        update-grub2

6.h. grub installation

        grub-install -v /dev/nvme0n1

Darf keinesfalls eine Zeile mit "error: attempt to install to encrypted disk without cryptodisk enabled. Set `GRUB_ENABLE_CRYPTODISK=y' in file `/etc/default/grub'." zeigen, dann ist "grub" widersprüchlich.

Erwartet:  "Installation beendet. Keine Fehler aufgetreten."

7. Funktioniert

8. Bekannte Fehler

Unsinnige, zusätzliche Password-Abfrage auf eine Partition.
Ursache: der systemd.generator in systemd-cryptsetup-generator übersetzt die /etc/crypttab verkehrt in native systemd units

Workaround: Enter, enter, enter prompten, ignorieren, läuft.
Workaround: Getrennte keyfiles für jede Partition


------- end -----------


ipv6
            test