Zum Inhalt springen

Sicherheit & Rollen

Jede Tabelle mit Familieninhalten ist über RLS abgesichert: Ein Nutzer sieht und ändert nur Zeilen seiner eigenen Familien. Aus Performance-Gründen ist die Nutzerprüfung in den Policies gewrappt ((select auth.uid())), damit sie pro Abfrage einmal statt pro Zeile ausgewertet wird.

Echtzeit läuft über private Kanäle mit RLS auf realtime.messages — so kann kein Inhalt über Familiengrenzen hinweg mitgelesen werden. Siehe Echtzeit & Chat.

Zwei klar getrennte Ebenen:

  • Globaler Administrator — Flag users.is_admin, für die App-Verwaltung.
  • Pro-Familie-Rolle — family_members.role_id (z. B. Familienmanager, Kind), regelt Rechte innerhalb einer Familie.

Beide Ebenen sind gegen Privilege-Escalation geschützt: Eine serverseitige Prüfung verhindert u. a., dass ein Familienmitglied sich selbst eine Owner-/Admin-Rolle zuschiebt.

SECURITY DEFINER-Funktionen sind gegen Aufruf durch anon/public gesperrt (REVOKE) und nur für authenticated freigegeben — mit gezielten Ausnahmen (z. B. die Anzeige einer Einladung vor dem Login). Schreibende Spalten sind zusätzlich auf der DB-Ebene gesperrt.

Die Datenbank wird 6×/Tag automatisch per GitHub Action gesichert und nach Cloudflare R2 (EU) geschrieben. Ein zweiter Workflow verifiziert die Sicherung. Alte Sicherungen werden per R2-Lifecycle-Regel nach 30 Tagen automatisch gelöscht (Einstellung am Bucket) — so bleibt der Speicher dauerhaft im kostenlosen Kontingent, ohne dass sich Dumps unbegrenzt ansammeln.