====== 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.service''
* ''ssh.service''
* ''systemd-logind.service''
* **''systemd-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.service''
* ''transmission.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