-- R-P2b — RLS-Gate-Beweis (AD-1): mandantenuebergreifender Zugriff DB-seitig verhindert. -- -- ⚠️ DELIBERATES ROLLOUT-ARTEFAKT, NICHT im Auto-Migrations-Pfad (AD-21): -- RLS auf einer Tabelle scharfzuschalten macht JEDE Query ohne gesetzten app.tenant_id -- ergebnislos. Eine Tabelle darf daher erst RLS-aktiviert werden, wenn ALLE ihre Zugriffe -- ueber withTenantRLS() laufen (Tenant-Kontext gesetzt). Dieses Skript etabliert die -- bewiesene Mechanik + die restricted App-Rolle und schaltet RLS exemplarisch auf -- "TenantUser" (Gate-Beweis). Module ziehen das Muster beim Bau pro Tabelle nach. -- -- Idempotent. Inverse-SQL (DoD 28) am Dateiende. -- 1) Restricted Application-Rolle: NICHT Superuser, NICHT BYPASSRLS, NICHT Tabellen-Owner -- -> RLS-Policies greifen fuer diese Rolle (Superuser/Owner wuerden sonst bypassen). DO $$ BEGIN IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'hivegrid_app') THEN CREATE ROLE hivegrid_app LOGIN PASSWORD 'hivegrid_app_pw' NOSUPERUSER NOCREATEDB NOCREATEROLE NOBYPASSRLS; ELSE ALTER ROLE hivegrid_app NOSUPERUSER NOBYPASSRLS; END IF; END$$; GRANT USAGE ON SCHEMA public TO hivegrid_app; -- 2) Tenant-Isolation per Row-Level-Security auf "TenantUser" (tenantId NOT NULL). -- FORCE: auch der Tabellen-Owner ist der Policy unterworfen (Defense-in-Depth). -- current_setting('app.tenant_id', true): liefert NULL, wenn der Kontext nicht gesetzt ist -- -> "tenantId = NULL" ist niemals wahr -> ohne Kontext sieht die App-Rolle KEINE Zeile. ALTER TABLE "TenantUser" ENABLE ROW LEVEL SECURITY; ALTER TABLE "TenantUser" FORCE ROW LEVEL SECURITY; DROP POLICY IF EXISTS tenant_isolation ON "TenantUser"; CREATE POLICY tenant_isolation ON "TenantUser" USING ("tenantId" = current_setting('app.tenant_id', true)) WITH CHECK ("tenantId" = current_setting('app.tenant_id', true)); GRANT SELECT, INSERT, UPDATE, DELETE ON "TenantUser" TO hivegrid_app; -- Inverse (Rollback): -- REVOKE SELECT, INSERT, UPDATE, DELETE ON "TenantUser" FROM hivegrid_app; -- DROP POLICY IF EXISTS tenant_isolation ON "TenantUser"; -- ALTER TABLE "TenantUser" NO FORCE ROW LEVEL SECURITY; -- ALTER TABLE "TenantUser" DISABLE ROW LEVEL SECURITY; -- REVOKE USAGE ON SCHEMA public FROM hivegrid_app; -- DROP ROLE IF EXISTS hivegrid_app;