/boot Verschlüsselung fuer Ubuntu (Debian)

  Verschluesselung einschließlich /boot umsetzen, auch nachtraeglich



Gegeben 

Eine Debian basierte Linux Installation (im Beispiel Ubuntu 2x).
Ziel: alle Partitionen verschluesseln.
Fuer Nachtraeglich oder als Neuinstallation.

Vorbereitung

LUKS installieren
	sudo apt-get install cryptsetup

Zielstellung:

Problem

Gute Anleitungen gibt es (nur) fuer 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 Datentraeger booten
  2. drei neue Partitionen schaffen fuer LUKS (swap hier ignoriert), nicht formatieren
    1. fuer /boot mit LUKS 1 verschluesseln (Details im Folgenden!)
    2. die weiteren (/ root und /home) mit LUKS 2 verschluesseln
  3. die drei LUKS Laufwerke mappen
  4. ext4-formatieren der mappings fuer /boot, / root und /home (gpt typ 8309 für LUKS) 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 verschluesselten Laufwerk dem blockdevice hinzufuegen
    4. Datei /etc/initramfs-tools/initramfs.conf muss da sein, nicht anpassen
    5. Datei /etc/cryptsetup-initramfs/conf-hook anpassen an Schluessel
    6. etc/default/grub anpassen, Entschlüsseln anweisen
    7. /etc/crypttab fuer die "spaeteren" decrypt per Schluessel anpassen
    8. initramfs den Debian Weg bauen
    9. grub update
    10. grub installation
  8. Chroot verlassen und neue Umgebung booten.
    Password fuer GRUB decrypt hat nur 1 Versuch (?!)

Gute Literatur







Die Schritte im einzelnen:


0. Ubuntu ist Debian basiert

Ubuntu ist Debian basiert, das ist im Ablauf etwas anders als ArchLinux.
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. fuer /boot mit LUKS 1 verschluesseln  (siehe Schweinekraftland 2. Aufsetzen von LUKS auf der Zielpartition fuer 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 verschluesseln

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 mappen 

siehe Schweinekraftland 3. Mapping erzeugen

und Schweinekraftland 4. Dem Mapping einen Namen geben

3. ext4-formatieren der mappings fuer /boot, / root und /home  evtl. swap

(siehe Schweinekraftland 5. Ein Dateisystem erzeugen )
ext4-formatieren der mappings (alle drei)
gpt typ 8309 für LUKS)


4. Installationsroutine starten,  gemappte Partitionen (nicht reformatieren,) nicht rebooten!

Installationsroutine mit den mappings starten, stoppen bei "Namen":

/etc/default/grub editieren bevor die eigentliche Installation ablaeuft, d.h. beim Setzen des Benutzernamens:
 

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

grub muss Anweisung haben zu entschlüsseln, dazu:
GRUB_ENABLE_CRYPTODISK=y
GRUB_PRELOAD_MODULES="part_gpt part_msdos"
GRUB_CMDLINE_LINUX_DEFAULT=""
GRUB_CMDLINE_LINUX=""
dazu nicht(!!):
# GRUB_PRELOAD_MODULES="luks cryptodisk"
und auch keine Kernel-Parameter aus den Arch-Linux-Beschreibungen übernehmen.


6. Anpassungen im chroot

6.a. Anpassen von fstab

fstab evtl. OK von der Installation, aber: 
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-701765ee-6c95-4516-895f-c6d6a6d73f9f /               ext4    errors=remount-ro 0       1
/dev/mapper/sonderboot-luks1-9e95e059-16f4-488e-9977-ec75c5ffc60c /boot           ext4    defaults        0       2
/dev/mapper/sonderhom-luks-0f018311-1b26-4d9d-bf56-beee1bcefa07 /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 normal schon installiert

Es können diverse keys verwendet werden.
Dateien sollen auf .keyfile enden.

Muster: 
/etc/sonderkey.keyfile
Create a randomised key-file of 4096 bits (512 bytes)
dd if=/dev/urandom of=/etc/sonderkey.keyfile bs=512 count=1
Lege ihn  in /boot und in /etc   (es kann auch anders konfiguriert werden)

Die Rechte von sonderkey.keyfile komplett beschränken, um Zugriff zu Keys zu verhindern.
Nur r fuer root:  
chmod u-wx,go-rwx /etc/sonderkey.keyfile      (alles als root!)

Soll sein:
Setze UMASK=0077 in /etc/initramfs-tools/initramfs.conf  (funktional nicht erforderlich).

6.c. keyfile als LUKS key in jedem verschluesselten Laufwerk dem blockdevice hinzufuegen

Zu Passwoertern und Schluesseln: (siehe auch Schweinekraftland Password ändern, zurückziehen )
/boot wird von GRUB geoeffnet UND nachher von cryptsetup.
Optional: Um root und /home in einem Vorgang zu oeffnen, den key auch dafuer verwenden.
Dazu den Schluessel in LUKS hinterlegen (siehe auch Schweinekraftland):
sudo cryptsetup luksAddKey -v   /dev/nvme0n1p000   /etc/meinkey.keyfile  (alles als root!  Ebenso fuer alle Partitionen)

Password war initial gesetzt, jetzt key in einen slot auf jedem Blockdevice hinzufügen:
cryptsetup luksAddKey   /dev/nvme0n1p51 /etc/sonderkey.keyfile
cryptsetup luksAddKey   /dev/nvme0n1p52  /etc/sonderkey.keyfile
cryptsetup luksAddKey   /dev/nvme0n1p53  /etc/sonderkey.keyfile

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

/etc/initramfs-tools/initramfs.conf  nicht editieren, muss bereits da sein

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 muss vorhanden sein
Configuration file für cryptroot initramfs hook ist:  
edit /etc/cryptsetup-initramfs/conf-hook
Voraussetzung zum Kompilieren: Keyfile ist in /etc/crypttab hinterlegt (Ort wird angegeben, kann anders)
Muster für Inhalt conf-hook:
KEYFILE_PATTERN="/etc/*.keyfile"
#ASKPASS=y           (bewusst auskommentiert)
Normal nur KEYFILE_PATTERN benennen(!)
Wegen Reihenfolge des Aufschließens(!) ist der Ort _nicht_ wahlfrei (ausser für /home?).


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.
Angabe der slot-Nummer zur Performance-Verbesserung möglich (,key-slot=1)
Muster:
## crypted /boot to be opened by GRUB:
sonderboot-luks1-9e95e059-16f4-488e-9977-ec75c5ffc60c    UUID="9e95e059-16f4-488e-9977-ec75c5ffc60c"    /etc/sonderkey.keyfile    luks,discard

## crypted root / to be opened by cryptomount(?):
sonderrot-luks-701765ee-6c95-4516-895f-c6d6a6d73f9f    UUID="701765ee-6c95-4516-895f-c6d6a6d73f9f"    /etc/sonderkey.keyfile luks,discard

## crypted home to be opened from keyfile like root:
sonderhom-luks-0f018311-1b26-4d9d-bf56-beee1bcefa07    UUID="0f018311-1b26-4d9d-bf56-beee1bcefa07"    /boot/sonderkey.keyfile luks,discard

6.h. initramfs den Debian Weg bauen

Unbedingt CHROOT machen. Ist nicht gegeben durch Installtionsroutine.

Kompilieren initramfs:
update-initramfs -k all -c

6.i. grub update

update-grub2

6.h. grub installation

grub-install -v /dev/nvme0n1

7. Funktioniert

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


ipv6
            test