Skip to content

Zugriffskontrolle

Zugriffskontrolle bedeutet, dass nur bestimmte Personen und Dienste auf bestimmte Ressourcen zugreifen können. Das gesamte System folgt fünf Regeln, die in einem Satz zusammengefasst sind:

Jede App ist ein eigener Benutzer, dem ihre eigenen Datenverzeichnisse gehören; Familieninhalte werden nur lesend über die Gruppe family geteilt, private Immich-Bibliotheken über personalisierte Samba-Freigaben; Ansible erstellt jedes Verzeichnis; timon administriert mit sudo.

Die fünf Regeln

  1. Jede App läuft als eigener System-Benutzer, deklariert in der Konfiguration. Ein Benutzer pro App, ohne Login-Shell, mit fester UID. Jede Compose-Datei deklariert ihn explizit mit den Werten aus der .env. Es wird sich nie auf den Standard-Benutzer eines Images verlassen.
  2. Jeder App gehören ihre Daten; niemand sonst darf hineinschreiben. Die Daten-Verzeichnisse gehören der App. Die Konfigurations-Ebene gehört dagegen timon.
  3. Geteilt wird nur über genau zwei Mechanismen: Gruppen-Lesezugriff über family für Familieninhalte, und personalisierte Samba-Freigaben für die privaten Immich-Bibliotheken.
  4. Ansible ist der einzige Ersteller jedes Bind-Mount-Verzeichnisses. Kein Host-Verzeichnis darf von Docker automatisch oder von Hand erstellt werden.
  5. Admin-Zugriff ist sudo, nicht Gruppenmitgliedschaft. timon gehört keinen App-Gruppen an und besitzt keine App-Daten. Root liest für Backups ohnehin alles.

Benutzer

BenutzerUIDFührt ausGruppen
timon1000Mensch, Admin (sudo)family
linus, martin, birgit1001+nur Samba, kein Loginfamily
immich2000immich-server, immich-mlfamily (liest externe Bibliotheken)
jellyfin2001jellyfinfamily (liest Familien-Medien)
gitea2002gitea
mealie2003mealie
qbittorrent2004qbittorrent
uptime-kuma2005uptime-kuma
gitea-mirror2006gitea-mirror

Die Gruppe family hat die feste GID 1002. Zustandslose API-Clients bekommen keinen Benutzer und keine Host-Mounts, sie halten einen API-Key, keine Dateien.

Dateistruktur

PfadEigentümerModusGrund
/srv, /srv/media, /srv/originalsroot:root0755reine Struktur, hier liegt nichts direkt
/srv/docker/<app>timon:timon0750Konfigurations-Ebene
/srv/docker/<app>/<data>app:app0750Daten-Ebene
/srv/originals/immich/**immich:immich0750Immich-Medien; Lesezugriff nur über die Samba-Freigaben
/srv/originals/family/**timon:family2750Familien-Medien; immich und jellyfin lesen über die Gruppe
/srv/originals/musictimon:family2750jellyfin liest über die Gruppe
/srv/media/timon:family2750ersetzbare Medien, jellyfin liest
/srv/media/downloadsqbittorrent:qbittorrent0750qbittorrent schreibt
/usr/bin/resticroot:restic0750nur root und die Gruppe restic führen Backups aus

Wo diese Verzeichnisse physisch liegen, ist unter Speicherstruktur dokumentiert.

Ausnahmen

Bewusst kurz gehalten — alles andere folgt den Regeln ohne Sonderfälle:

AppAusnahmeGrund
caddyläuft als Image-Standard (root)bindet :80/:443 im Container; Daten liegen in Named Volumes, kein Host-Baum betroffen
immich postgresPostgres-UID des Images besitzt /srv/docker/immich/postgresDatenbank-Images verwalten ihren Benutzer selbst
giteaImage-Init benötigt rootder interne git-Benutzer wird über USER_UID=2002 auf den gitea-Benutzer gemappt
gluetunläuft als rootbenötigt NET_ADMIN für das VPN

Berechtigungen

ActionValueMeaning
Lesen (r)4kann Dateien anzeigen/auflisten
Schreiben (w)2kann ändern/hinzufügen/entfernen
Ausführen (x)1kann Verzeichnis betreten oder Dateien ausführen

Die erste Ziffer bezieht sich auf den Eigentümer, die zweite auf die Gruppe und die dritte auf den Rest. Eine führende 2 (z. B. 2750) ist das setgid-Bit: neue Dateien erben die Gruppe des Verzeichnisses.

Beispiel

750 bedeutet: der Eigentümer hat vollen Zugriff, die Gruppe darf lesen und das Verzeichnis betreten, alle anderen haben gar keinen Zugriff.

Einrichtung

Alle Benutzer, Gruppen, Verzeichnisse, ACLs und Samba-Freigaben werden von setup-permissions.yaml konfiguriert. Die PUID/PGID-Werte in den .env.example-Dateien der Apps müssen mit den UIDs aus dem Playbook übereinstimmen.

INFO

Die Berechtigungen werden in der Server Einrichtung ausgeführt.