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:
- Verschlüsselung der besonders sensiblen Daten
herbeiführen
- komplette Verschlüsselung des ganzen Systems (auch
nachträglich)
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
- nur eine Password-Eingabe für alles
- leicht mit e2fsck wartbare Partitionen
Das Vorgehen:
- Ubuntu von externem Datenträger booten
- drei neue Partitionen schaffen für LUKS (gpt
typ 8309 für LUKS; swap hier ignoriert), nicht formatieren
- für /boot mit LUKS 1 verschlüsseln (Details im
Folgenden!)
- die weiteren (/ root und /home) mit LUKS 2 verschlüsseln
- die drei LUKS Laufwerke mappen
- ext4-formatieren der mappings für /boot, / root und /home
evtl. swap
- Installationsroutine starten, gemappte Partitionen nicht
reformatieren, grub anpassen, abspulen, nicht rebooten!
- Chroot aus dem laufenden Fremdmedium in die neue
Installation (siehe chroot)
- Anpassungen im chroot:
- fstab kontrollieren, editieren
- keyfile generieren und hinterlegen in /etc
- keyfile als LUKS key in jedem verschlüsselten Laufwerk
dem blockdevice hinzufügen
- Datei /etc/initramfs-tools/initramfs.conf muss da sein,
nicht anpassen
- Datei /etc/cryptsetup-initramfs/conf-hook anpassen an
Schlüssel
- /etc/default/grub anpassen, Entschlüsseln anweisen
- /etc/crypttab für die "späteren" decrypt per Schlüssel
anpassen
- initramfs den Debian Weg bauen
- grub update
- grub installation
- 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
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 -----------