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?