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:
before-decrypt.target- gerade genug für Netzwerk und Login
decrypt.target- während dieser Phase wird das Volume entschlüsselt und gemountet
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:
networking.servicessh.servicesystemd-logind.servicesystemd-user-sessions.service
/etc/systemd/system/start-full-system.target.wants/ befüllen
Hierhin kommen alle Dienste, die von dem LUKS-Volume abhängig sind. Z.B.:
lighttpd.servicetransmission.service- …
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
