This is an automated email from the ASF dual-hosted git repository.

damccorm pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/beam.git


The following commit(s) were added to refs/heads/master by this push:
     new d0d1ac8bb54 Enforce read-only PostgreSQL permissions for 
kubeproxyuser_ro (#40534)
d0d1ac8bb54 is described below

commit d0d1ac8bb5478093b6af7865fae3ffaba2532fc1
Author: Danny McCormick <[email protected]>
AuthorDate: Tue Oct 13 17:52:12 2026 +0000

    Enforce read-only PostgreSQL permissions for kubeproxyuser_ro (#40534)
    
    * Enforce read-only PostgreSQL permissions for kubeproxyuser_ro
    
    * Avoid swallowing exceptions when updating kubeproxyuser_ro role
---
 .test-infra/metrics/postgres/init.sql              | 18 ++++++++++++++
 .../github/github_runs_prefetcher/code/main.py     |  3 +++
 .test-infra/metrics/sync/github/sync.py            | 28 ++++++++++++++++++++++
 3 files changed, 49 insertions(+)

diff --git a/.test-infra/metrics/postgres/init.sql 
b/.test-infra/metrics/postgres/init.sql
index e0c9d32ca5b..084eb5ed32e 100644
--- a/.test-infra/metrics/postgres/init.sql
+++ b/.test-infra/metrics/postgres/init.sql
@@ -16,3 +16,21 @@
 
 CREATE extension tablefunc;
 
+REVOKE CREATE ON SCHEMA public FROM PUBLIC;
+
+DO $$
+BEGIN
+  IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = 
'kubeproxyuser_ro') THEN
+    CREATE ROLE kubeproxyuser_ro NOSUPERUSER NOCREATEDB NOCREATEROLE NOINHERIT 
NOREPLICATION;
+  END IF;
+END
+$$;
+
+ALTER ROLE kubeproxyuser_ro NOSUPERUSER NOCREATEDB NOCREATEROLE NOINHERIT 
NOREPLICATION;
+ALTER ROLE kubeproxyuser_ro SET default_transaction_read_only = on;
+REVOKE ALL ON SCHEMA public FROM kubeproxyuser_ro;
+GRANT USAGE ON SCHEMA public TO kubeproxyuser_ro;
+REVOKE ALL ON ALL TABLES IN SCHEMA public FROM PUBLIC, kubeproxyuser_ro;
+GRANT SELECT ON ALL TABLES IN SCHEMA public TO kubeproxyuser_ro;
+ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE ALL ON TABLES FROM PUBLIC, 
kubeproxyuser_ro;
+ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO 
kubeproxyuser_ro;
diff --git 
a/.test-infra/metrics/sync/github/github_runs_prefetcher/code/main.py 
b/.test-infra/metrics/sync/github/github_runs_prefetcher/code/main.py
index 2b91c862a7f..6d4c065b9d4 100644
--- a/.test-infra/metrics/sync/github/github_runs_prefetcher/code/main.py
+++ b/.test-infra/metrics/sync/github/github_runs_prefetcher/code/main.py
@@ -468,10 +468,13 @@ def save_workflows(workflows):
         CONSTRAINT fk_workflow FOREIGN KEY(workflow_id) REFERENCES 
{workflows_table_name}(workflow_id))\n"""
     cursor.execute(create_workflows_table_query)
     cursor.execute(create_workflow_runs_table_query)
+    revoke_workflows_query = """
+    REVOKE ALL ON github_workflows, github_workflow_runs FROM PUBLIC, 
kubeproxyuser_ro;"""
     grant_workflows_query = f"""
     GRANT SELECT ON github_workflows TO kubeproxyuser_ro;"""
     grant_workflow_runs_query = f"""
     GRANT SELECT ON github_workflow_runs TO kubeproxyuser_ro;"""
+    cursor.execute(revoke_workflows_query)
     cursor.execute(grant_workflows_query)
     cursor.execute(grant_workflow_runs_query)
     insert_workflows_query = f"""
diff --git a/.test-infra/metrics/sync/github/sync.py 
b/.test-infra/metrics/sync/github/sync.py
index 543b19476c1..4fe5fc5acb2 100644
--- a/.test-infra/metrics/sync/github/sync.py
+++ b/.test-infra/metrics/sync/github/sync.py
@@ -139,6 +139,34 @@ def initDbTablesIfNeeded():
     if not bool(cursor.rowcount):
       raise Exception(f"Failed to create table {GH_SYNC_METADATA_TABLE_NAME}")
 
+  cursor.execute("""
+    DO $$
+    BEGIN
+      REVOKE CREATE ON SCHEMA public FROM PUBLIC;
+      IF EXISTS (
+          SELECT FROM pg_catalog.pg_roles WHERE rolname = 'kubeproxyuser_ro')
+      THEN
+        REVOKE ALL ON SCHEMA public FROM kubeproxyuser_ro;
+        GRANT USAGE ON SCHEMA public TO kubeproxyuser_ro;
+        REVOKE ALL ON ALL TABLES IN SCHEMA public FROM PUBLIC, 
kubeproxyuser_ro;
+        GRANT SELECT ON ALL TABLES IN SCHEMA public TO kubeproxyuser_ro;
+        ALTER DEFAULT PRIVILEGES IN SCHEMA public
+          REVOKE ALL ON TABLES FROM PUBLIC, kubeproxyuser_ro;
+        ALTER DEFAULT PRIVILEGES IN SCHEMA public
+          GRANT SELECT ON TABLES TO kubeproxyuser_ro;
+        IF EXISTS (
+            SELECT FROM pg_catalog.pg_roles WHERE rolname = 
'cloudsqlsuperuser')
+        THEN
+          REVOKE cloudsqlsuperuser FROM kubeproxyuser_ro;
+        END IF;
+        ALTER ROLE kubeproxyuser_ro
+          NOCREATEDB NOCREATEROLE NOINHERIT NOREPLICATION;
+        ALTER ROLE kubeproxyuser_ro SET default_transaction_read_only = on;
+      END IF;
+    END
+    $$;
+  """)
+
   cursor.close()
   connection.commit()
 

Reply via email to