Das Rumgewürge mit Rootless Docker auf einem RaspberryPi 4
Verwendet als OS wird DietPi auf Debian Bookworm (12) Basis.
Ziele
- Headless Server mit Rootless Docker.
- Unprivileged User docker
- mit gocryptfs-verschlüsseltem Home-Verzeichnis
- damit die Daten bei physischem Raub des Geräts zumindest unzugänglich bleiben.
Probleme
- Das automatische Einhängen des gocryptfs-verschlüsselten Verzeichnissen auf die Home-Partition funktioniert nicht
- Einerseits unter Headless eh nicht, weil das mit ssh-logins nicht einfach so funktioniert
- Und ich will nirgends das Passwort ablegen.
- Also logge ich mich mit sudo -su docker als docker ein.
- Mit
gocryptfs -nonempty -allow_other /home/docker.cipher /home/docker
hänge ich das Verzeichnis ein- -nonempty ist superwichtig, weil natürlich die ganzen Dot-Files sonst das Einhängen verhindern.
- -allow_other war zwischenzeitlich jedenfalls notwendig, weil Docker sonst nicht startete. Aber vielleicht ist das nach Lösung all der folgenden Probleme auch schon nicht mehr notwendig ...
- ABER! Mit sudo -su einloggen geht nicht, weil dann nicht auf systemctl zugegriffen werden kann und Docker nicht funktioniert.
- stattdessen mit
machinectl shell docker@
einloggen, dann geht's.- Was aber auch zunächst nicht klappte, weil ich docker ohne Shell angelegt hatte
- Also in /etc/shadow docker /bin/bash gegeben und schon geht's.
- Rootless Docker scheint zu funktionieren bricht aber bei docker pull ab.
- Denn mit gocryptfs (wie mit NFS) funktioniert das notwendige overlayfs nicht richtig.
- Das Standard-Verzeichnis für das lokale Docker muss von ~/.local/share/docker verlegt werden.
- Also außerhalb von /home/docker ein Verzeichnis docker-share angelegt
- und /home/docker/.config/docker/deamon.json angelegt und dort
{"data-root":"/docker-share"}
eingetragen.- WICHTIG: Jetzt noch mit
systemctl --user restart docker
den Docker Dienst neustarten. Dann sollte alles wie geplant gehen.
- Fast alles. Der Nginx Proxy Manager Container möchte gern die Ports 80-443 verwenden können - das geht aber ohne Rootrechte zunächst nicht.
- Darum einmal mit Systemrechten
sysctl net.ipv4.ip_unprivileged_port_start=80
eingeben - und den überflüssigen Portbereich mit
iptables -I INPUT -p tcp --dport 444:1024 -j DROP; iptables -I INPUT -p udp --dport 444:1024 -j DROP
blockieren.
Das war sicher noch nicht alles, aber zumindest den Rotz muss ich jetzt erstmal nicht mehr nachsehen ...