Zum Hauptinhalt springen

Multi-Tenancy (Defense-in-Depth)

Jede Tabelle in Roestify MUSS alle 6 Sicherheitsschichten implementieren.

Die 6 Schichten

1. RLS aktiviert

ALTER TABLE my_table ENABLE ROW LEVEL SECURITY;

2. Policies nutzen get_tenant_id()

CREATE POLICY "tenant_select" ON my_table
FOR SELECT USING (tenant_id = get_tenant_id());

3. tenant_id NOT NULL + FK

tenant_id UUID NOT NULL
DEFAULT get_tenant_id()
REFERENCES tenants(id) ON DELETE CASCADE

4. Default get_tenant_id()

Die App muss tenant_id niemals manuell setzen. Der Default-Wert wird automatisch aus der Session abgeleitet.

5. Immutable tenant_id

CREATE POLICY "tenant_update" ON my_table
FOR UPDATE USING (tenant_id = get_tenant_id())
WITH CHECK (tenant_id = OLD.tenant_id);

6. CASCADE Delete

Wenn ein Tenant gelöscht wird, werden alle verknüpften Daten automatisch entfernt (DSGVO Art. 17).

Checkliste für neue Tabellen

  • RLS enabled?
  • SELECT/INSERT/UPDATE/DELETE Policies mit get_tenant_id()?
  • tenant_id UUID NOT NULL DEFAULT get_tenant_id() REFERENCES tenants(id) ON DELETE CASCADE?
  • UPDATE-Policy prüft tenant_id = OLD.tenant_id (immutable)?
  • Index auf tenant_id?