LUKS-Volumes per systemd einbinden

Beschreibung

Das Ziel dieses Szenarios ist es, einen Server mit unverschlüsseltem Rootfs starten zu lassen. Ein mit Luks verschlüsseltes Volume soll dann per Systemd gemountet werden, und anschließend sämtliche Systemd-Dienste, die nur mit den verschlüsselten Daten funktionieren, gestartet werden.

Der Startvorgang soll bis auf die Passworteingabe automatisiert werden.

Schema

Das System bootet in drei Schritten:

  1. before-decrypt.target
    • gerade genug für Netzwerk und Login
  2. decrypt.target
    • während dieser Phase wird das Volume entschlüsselt und gemountet
  3. start-full-system.target
    • anschließend werden alle abhängigen Dienste gestartet
UUID des LUKS-Containers ermitteln

lsblk -f | grep crypto_LUKS

/etc/crypttab bearbeiten
testluks      UUID=4cf5deb5-d953-c8af-7ef0-52f48771a964       none    luks,noauto
/etc/fstab bearbeiten
/dev/mapper/testluks /mnt/testluks ext4 defaults,rw,noauto 0 0
Dienste abschalten, die von verschlüsselten Daten abhängen

z.B.: # systemctl disable smbd nginx mysql …

Daemon-reload

# systemctl daemon-reload

Automatisches systemd.mount ermitteln:

# ls -1 /run/systemd/generator/*.mount

/run/systemd/generator/mnt-testluks.mount
systemd-cryptsetup@XXX.service testen

# systemctl start systemd-cryptsetup@testluks.service

systemd.mount testen

# systemctl start mnt-testluks.mount

/etc/systemd/system/decrypt.target

Hier muss in der Zeile Requires= das .mount-Unit angepasst sowie die Dienste, die von verschlüsselten Daten abhängen (z.B. smbd, nginx, mysql) ergänzt werden.

[Unit]
Description=Decrypted System
Requires=default.target
After=default.target
Conflicts=systemd-ask-password-console.path systemd-ask-password-console.service systemd-ask-password-plymouth.path systemd-ask-password-plymouth.service
Requires=systemd-cryptsetup@testluks.service mnt-testluks.mount
/etc/systemd/system/start-full-system.target
[Unit]
Description=Start full system after decryption
Requires=decrypt.target
After=decrypt.target
Requires=yoko.mount
/etc/systemd/system/before-decrypt.target.wants/ befüllen

Dieser Ordner enthält die Abhängigkeiten für den “Urzustand”. Am besten multi-user.target.wants/ klonen und sicherstellen, dass diese Dienste vorhanden sind:

/etc/systemd/system/start-full-system.target.wants/ befüllen

Hierhin kommen alle Dienste, die von dem LUKS-Volume abhängig sind. Z.B.:

Daemon-reload

# systemctl daemon-reload

Rebooten und testen

# reboot

# systemctl start decrypt.target

# systemctl start start-full-system.target

Neues target als Default setzen

# systemctl set-default before-decrypt

Bonus-Skript /usr/local/bin/decrypt
#!/bin/sh
 
sudo systemctl start decrypt.target
sleep 5
sudo systemctl start start-full-system.target