teecup/002_roles_and_grants.sql

56 lines
2.4 KiB
MySQL
Raw Normal View History

2026-07-16 07:26:04 +02:00
-- =====================================================================
-- TeeCup — dedikert applikasjonsrolle + grants (migrasjon 002)
-- =====================================================================
-- Kjøres av en admin/superbruker (f.eks. teeoff_admin).
--
-- HVORFOR: RLS beskytter IKKE mot en superbruker. Postgres lar superuser og
-- roller med BYPASSRLS hoppe fullstendig over alle policyer. Runtime-appen MÅ
-- derfor koble til med en rolle som verken er superuser eller har BYPASSRLS.
-- Denne rollen eier heller ikke tabellene (tabellene har dessuten FORCE RLS),
-- så den er alltid underlagt policyene.
--
-- Passord: sett det utenfra, ikke i denne fila. Kjør f.eks.:
-- psql -d teecup_db -v teecup_app_password="$(cat /path/to/secret)" \
-- -f 002_roles_and_grants.sql
-- (Aldri sjekk inn et ekte passord i git.)
-- =====================================================================
\set ON_ERROR_STOP on
-- --- Rolle (cluster-nivå: opprett bare hvis den ikke finnes) ----------
-- Eksplisitt NOSUPERUSER / NOBYPASSRLS — dette er hele poenget.
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'teecup_app') THEN
CREATE ROLE teecup_app
LOGIN
PASSWORD :'teecup_app_password'
NOSUPERUSER
NOCREATEDB
NOCREATEROLE
NOBYPASSRLS
INHERIT;
END IF;
END $$;
-- --- Grants (kjøres mens du er koblet til teecup_db) ------------------
GRANT CONNECT ON DATABASE teecup_db TO teecup_app;
GRANT USAGE ON SCHEMA public TO teecup_app;
-- Runtime-appen trenger vanlig DML på domenetabellene, men skal IKKE kunne
-- endre skjema eller policyer (det følger av at den ikke eier tabellene og
-- ikke er superuser).
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO teecup_app;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO teecup_app;
-- Samme rettigheter automatisk på fremtidige tabeller/sekvenser laget av
-- migrasjonseieren.
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO teecup_app;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT USAGE, SELECT ON SEQUENCES TO teecup_app;
-- MERK: teecup_app får bevisst IKKE rettigheter til å endre RLS. Bootstrap av
-- nye organisasjoner (INSERT i organization) skjer via en privilegert sti i
-- auth-laget, ikke med runtime-rollen.