File tree Expand file tree Collapse file tree 6 files changed +70
-33
lines changed
services/postgres/scripts Expand file tree Collapse file tree 6 files changed +70
-33
lines changed Original file line number Diff line number Diff line change 11*
22! .gitignore
3- ! * .template. *
3+ ! * .template
4+ ! init.sql
Original file line number Diff line number Diff line change 1+ /*
2+ Create read-only role for ${POSTGRES_DB} database.
3+
4+ This role can be used to give read-only access to the ${POSTGRES_DB} database
5+ to users.
6+
7+ Permission grants inspired from: https://stackoverflow.com/questions/760210/how-do-you-create-a-read-only-user-in-postgresql/762649#762649
8+ IMPORTANT: must be executed while connected to the ${POSTGRES_DB} database
9+ as it refers to public schema in that database.
10+ */
11+
12+ CREATE ROLE ${POSTGRES_DB}_readonly NOLOGIN;
13+
14+ GRANT CONNECT ON DATABASE ${POSTGRES_DB} TO ${POSTGRES_DB}_readonly;
15+
16+ -- https://stackoverflow.com/questions/17338621/what-does-grant-usage-on-schema-do-exactly
17+ GRANT USAGE ON SCHEMA public TO ${POSTGRES_DB}_readonly;
18+
19+ -- Grant permissions for (existing) tables, sequences, functions
20+ GRANT SELECT ON ALL TABLES IN SCHEMA public TO ${POSTGRES_DB}_readonly;
21+ GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO ${POSTGRES_DB}_readonly;
22+ GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO ${POSTGRES_DB}_readonly;
23+
24+ -- Grant permissions for (future) tables, sequences, functions
25+ ALTER DEFAULT PRIVILEGES IN SCHEMA public
26+ GRANT SELECT ON TABLES TO ${POSTGRES_DB}_readonly;
27+ ALTER DEFAULT PRIVILEGES IN SCHEMA public
28+ GRANT SELECT ON SEQUENCES TO ${POSTGRES_DB}_readonly;
29+ ALTER DEFAULT PRIVILEGES IN SCHEMA public
30+ GRANT EXECUTE ON FUNCTIONS TO ${POSTGRES_DB}_readonly;
31+
32+ SELECT * FROM pg_roles WHERE rolname NOT LIKE 'pg_%';
Original file line number Diff line number Diff line change 1- -- SQL script to create a read-only user and grant privileges
2-
3-
4- --Create the read-only user with a password
51CREATE USER ${POSTGRES_READONLY_USER} WITH PASSWORD '${POSTGRES_READONLY_PASSWORD}';
62
7- --Grant CONNECT privilege to the database (e.g., 'foo' is the database name)
8- GRANT CONNECT ON DATABASE ${POSTGRES_DB} TO ${POSTGRES_READONLY_USER};
9-
10- --Grant USAGE privilege on the **public** schema
11- GRANT USAGE ON SCHEMA public TO ${POSTGRES_READONLY_USER};
12-
13- --Grant SELECT privilege on all existing tables and sequencies in the **public** schema
14- GRANT SELECT ON ALL TABLES IN SCHEMA public TO ${POSTGRES_READONLY_USER};
15- GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO ${POSTGRES_READONLY_USER};
16-
17- --Ensure that future tables created in the public schema and sequencies will have SELECT privilege for the read-only user
18- ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO ${POSTGRES_READONLY_USER};
19- ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON SEQUENCES TO ${POSTGRES_READONLY_USER};
3+ -- Grant read-only role (privilages) to the user
4+ GRANT ${POSTGRES_DB}_readonly TO ${POSTGRES_READONLY_USER};
205
21- -- Listing all users
22- SELECT * FROM pg_roles;
6+ SELECT * FROM pg_roles WHERE rolname NOT LIKE 'pg_%';
Original file line number Diff line number Diff line change 1+ /*
2+ Do not allow users to create new objects in the public schema
3+
4+ Must be executed against every created database (e.g. for simcore, for metabase, ...)
5+ (as long as we use Postgrses 14 or earlier)
6+
7+ Sources:
8+ * https://wiki.postgresql.org/wiki/A_Guide_to_CVE-2018-1058:_Protect_Your_Search_Path
9+ * https://www.reddit.com/r/PostgreSQL/comments/1hvxw0s/understanding_the_public_schema_in_postgresql/
10+ */
11+
12+ -- It is not global. Execute this per database
13+ REVOKE CREATE ON SCHEMA public FROM PUBLIC;
Original file line number Diff line number Diff line change 1+ -- Make sure this role is not used by any user or else this script will fail
2+
3+ REVOKE CONNECT ON DATABASE ${POSTGRES_DB} FROM ${POSTGRES_DB}_readonly;
4+
5+ REVOKE ALL PRIVILEGES ON SCHEMA public FROM ${POSTGRES_DB}_readonly;
6+
7+ REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM ${POSTGRES_DB}_readonly;
8+ REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM ${POSTGRES_DB}_readonly;
9+ REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM ${POSTGRES_DB}_readonly;
10+
11+ ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE ALL ON TABLES FROM ${POSTGRES_DB}_readonly;
12+ ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE ALL ON SEQUENCES FROM ${POSTGRES_DB}_readonly;
13+ ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM ${POSTGRES_DB}_readonly;
14+
15+ DROP ROLE ${POSTGRES_DB}_readonly;
16+
17+ SELECT * FROM pg_roles WHERE rolname NOT LIKE 'pg_%';
Original file line number Diff line number Diff line change 1- -- Revoke all privileges the user has on the public schema
2- REVOKE ALL PRIVILEGES ON SCHEMA public FROM ${POSTGRES_READONLY_USER};
1+ -- Revoke readonly role from user
2+ REVOKE ${POSTGRES_DB}_readonly FROM ${POSTGRES_READONLY_USER};
33
4- -- Revoke all privileges the user has on tables and sequences in the public schema
5- REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM ${POSTGRES_READONLY_USER};
6- REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM ${POSTGRES_READONLY_USER};
7-
8- -- Revoke any future privileges set via ALTER DEFAULT PRIVILEGES
9- ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE ALL ON TABLES FROM ${POSTGRES_READONLY_USER};
10- ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE ALL ON SEQUENCES FROM ${POSTGRES_READONLY_USER};
11-
12- -- Drop the user
134DROP USER ${POSTGRES_READONLY_USER};
145
15- -- Listing all users
16- SELECT * FROM pg_roles;
6+ SELECT * FROM pg_roles WHERE rolname NOT LIKE 'pg_%';
You can’t perform that action at this time.
0 commit comments