Files
HiveGrid-Wireframes/hivegrid-cloud/prisma/rls/tenant-isolation.sql
T

46 lines
2.2 KiB
SQL

-- 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;