Skip to content

Commit c9817cb

Browse files
committed
feat: add supabase_superuser role
Inherited by `postgres` and `supabase_etl_admin`. `postgres` retains current privileges, while `supabase_etl_admin` gains the ability to create event triggers.
1 parent dfbdf86 commit c9817cb

File tree

6 files changed

+82
-5
lines changed

6 files changed

+82
-5
lines changed

ansible/files/postgresql_config/supautils.conf.j2

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ supautils.drop_trigger_grants = '{"postgres":["auth.audit_log_entries","auth.flo
99
supautils.privileged_extensions = 'address_standardizer, address_standardizer_data_us, autoinc, bloom, btree_gin, btree_gist, citext, cube, dblink, dict_int, dict_xsyn, earthdistance, fuzzystrmatch, hstore, http, hypopg, index_advisor, insert_username, intarray, isn, ltree, moddatetime, orioledb, pg_buffercache, pg_cron, pg_graphql, pg_hashids, pg_jsonschema, pg_net, pg_prewarm, pg_repack, pg_stat_monitor, pg_stat_statements, pg_tle, pg_trgm, pg_walinspect, pgaudit, pgcrypto, pgjwt, pgroonga, pgroonga_database, pgrouting, pgrowlocks, pgsodium, pgstattuple, pgtap, plcoffee, pljava, plls, plpgsql_check, plv8, postgis, postgis_raster, postgis_sfcgal, postgis_tiger_geocoder, postgis_topology, postgres_fdw, refint, rum, seg, sslinfo, supabase_vault, supautils, tablefunc, tcn, timescaledb, tsm_system_rows, tsm_system_time, unaccent, uuid-ossp, vector, wrappers'
1010
supautils.extension_custom_scripts_path = '/etc/postgresql-custom/extension-custom-scripts'
1111
supautils.privileged_extensions_superuser = 'supabase_admin'
12-
supautils.privileged_role = 'postgres'
12+
supautils.privileged_role = 'supabase_superuser'
1313
supautils.privileged_role_allowed_configs = 'auto_explain.*, log_lock_waits, log_min_duration_statement, log_min_messages, log_parameter_max_length, log_replication_commands, log_statement, log_temp_files, pg_net.batch_size, pg_net.ttl, pg_stat_statements.*, pgaudit.log, pgaudit.log_catalog, pgaudit.log_client, pgaudit.log_level, pgaudit.log_relation, pgaudit.log_rows, pgaudit.log_statement, pgaudit.log_statement_once, pgaudit.role, pgrst.*, plan_filter.*, safeupdate.enabled, session_replication_role, track_functions, track_io_timing, wal_compression'
1414
supautils.reserved_memberships = 'pg_read_server_files, pg_write_server_files, pg_execute_server_program, supabase_admin, supabase_auth_admin, supabase_storage_admin, supabase_read_only_user, supabase_realtime_admin, supabase_replication_admin, supabase_etl_admin, dashboard_user, pgbouncer, authenticator'
1515
supautils.reserved_roles = 'supabase_admin, supabase_auth_admin, supabase_storage_admin, supabase_read_only_user, supabase_realtime_admin, supabase_replication_admin, supabase_etl_admin, dashboard_user, pgbouncer, service_role*, authenticator*, authenticated*, anon*'
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-- migrate:up
2+
create role supabase_superuser;
3+
grant supabase_superuser to postgres, supabase_etl_admin;
4+
5+
-- migrate:down

nix/tests/expected/evtrigs.out

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,34 @@ where p.prorettype = 'event_trigger'::regtype;
2626
pgsodium_trg_mask_update | supabase_admin | pgsodium | pgsodium.trg_mask_update | supabase_admin
2727
(12 rows)
2828

29+
-- postgres can create event triggers
30+
set role postgres;
31+
create function f()
32+
returns event_trigger
33+
language plpgsql
34+
as $$ begin end $$;
35+
create event trigger et
36+
on ddl_command_start
37+
execute function f();
38+
drop event trigger et;
39+
drop function f();
40+
reset role;
41+
-- supabase_etl_admin can create event triggers
42+
set role supabase_etl_admin;
43+
create schema s;
44+
create function s.f()
45+
returns event_trigger
46+
language plpgsql
47+
as $$ begin end $$;
48+
create event trigger et
49+
on ddl_command_start
50+
execute function s.f();
51+
-- postgres can't drop supabase_etl_admin's event triggers
52+
set role postgres;
53+
drop event trigger et;
54+
ERROR: must be owner of event trigger et
55+
set role supabase_etl_admin;
56+
drop event trigger et;
57+
drop function s.f();
58+
drop schema s;
59+
reset role;

nix/tests/expected/roles.out

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ order by rolname;
5151
supabase_read_only_user | f | t | f | t | f | f | -1 | t |
5252
supabase_replication_admin | f | t | f | t | f | t | -1 | f |
5353
supabase_storage_admin | t | t | f | f | f | f | -1 | f |
54-
(30 rows)
54+
supabase_superuser | f | f | f | t | f | f | -1 | f |
55+
(31 rows)
5556

5657
select
5758
rolname,
@@ -91,7 +92,8 @@ order by rolname;
9192
supabase_read_only_user | {default_transaction_read_only=on}
9293
supabase_replication_admin |
9394
supabase_storage_admin | {search_path=storage,log_statement=none}
94-
(30 rows)
95+
supabase_superuser |
96+
(31 rows)
9597

9698
-- Check all privileges of the roles on the schemas
9799
select schema_name, privilege_type, grantee, default_for

nix/tests/expected/z_17_roles.out

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,14 @@ order by
6666
postgres | pg_signal_backend | t
6767
postgres | pgtle_admin | f
6868
postgres | service_role | t
69+
postgres | supabase_superuser | f
6970
supabase_etl_admin | pg_monitor | f
7071
supabase_etl_admin | pg_read_all_data | f
72+
supabase_etl_admin | supabase_superuser | f
7173
supabase_read_only_user | pg_monitor | f
7274
supabase_read_only_user | pg_read_all_data | f
7375
supabase_storage_admin | authenticator | f
74-
(23 rows)
76+
(25 rows)
7577

7678
-- Check version-specific privileges of the roles on the schemas
7779
select schema_name, privilege_type, grantee, default_for
@@ -160,12 +162,14 @@ order by
160162
postgres | pg_signal_backend | t
161163
postgres | pgtle_admin | f
162164
postgres | service_role | t
165+
postgres | supabase_superuser | f
163166
supabase_etl_admin | pg_monitor | f
164167
supabase_etl_admin | pg_read_all_data | f
168+
supabase_etl_admin | supabase_superuser | f
165169
supabase_read_only_user | pg_monitor | f
166170
supabase_read_only_user | pg_read_all_data | f
167171
supabase_storage_admin | authenticator | f
168-
(22 rows)
172+
(24 rows)
169173

170174
-- Check all privileges of non-superuser roles on functions
171175
select

nix/tests/sql/evtrigs.sql

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,38 @@ join pg_proc p
1010
join pg_namespace n_func
1111
on p.pronamespace = n_func.oid
1212
where p.prorettype = 'event_trigger'::regtype;
13+
14+
-- postgres can create event triggers
15+
set role postgres;
16+
create function f()
17+
returns event_trigger
18+
language plpgsql
19+
as $$ begin end $$;
20+
create event trigger et
21+
on ddl_command_start
22+
execute function f();
23+
24+
drop event trigger et;
25+
drop function f();
26+
reset role;
27+
28+
-- supabase_etl_admin can create event triggers
29+
set role supabase_etl_admin;
30+
create schema s;
31+
create function s.f()
32+
returns event_trigger
33+
language plpgsql
34+
as $$ begin end $$;
35+
create event trigger et
36+
on ddl_command_start
37+
execute function s.f();
38+
39+
-- postgres can't drop supabase_etl_admin's event triggers
40+
set role postgres;
41+
drop event trigger et;
42+
43+
set role supabase_etl_admin;
44+
drop event trigger et;
45+
drop function s.f();
46+
drop schema s;
47+
reset role;

0 commit comments

Comments
 (0)