如何为Google CloudSQL Postgres的pg_ls_waldir函数授予执行权限?
Google CloudSQL Postgres 14:pg_ls_waldir()权限不足问题解决
问题背景
在Google CloudSQL Postgres 14环境中,监控系统执行pg_catalog.pg_ls_waldir()时触发权限不足错误。该函数的所有者为内置超级用户cloudsqladmin,无法直接以该用户身份连接,且通过其他用户尝试授权均失败。
已尝试操作及结果
- 以
postgres用户直接授权:
postgres=> grant execute on function pg_catalog.pg_ls_waldir() to "prometheus"; WARNING: no privileges were granted for "pg_ls_waldir"
- 创建属于
cloudsqladmin角色的用户后授权:
首先创建用户:
postgres=> CREATE USER mysuperuser WITH REPLICATION IN ROLE cloudsqladmin LOGIN PASSWORD 'mypassword';
以该用户登录执行授权,仍得到相同警告:
postgres=> grant execute on function pg_catalog.pg_ls_waldir() to "prometheus"; WARNING: no privileges were granted for "pg_ls_waldir"
- 再次创建用户时触发错误:
postgres=> CREATE USER mysuperuser1 WITH REPLICATION IN ROLE cloudsqladmin LOGIN PASSWORD 'mypassword'; ERROR: must be superuser to alter superusers
解决方案
方案1:授予监控用户cloudsqlsuperuser角色(简单但权限较高)
如果安全策略允许,直接将CloudSQL的超级用户角色授予监控用户:
GRANT cloudsqlsuperuser TO prometheus;
此方法可直接解决权限问题,但会赋予监控用户较高的数据库权限,需评估安全风险。
方案2:创建包装函数(遵循最小权限原则)
通过创建一个由postgres用户所有的包装函数,利用SECURITY DEFINER特性以创建者权限执行原函数,同时仅授予监控用户包装函数的执行权限:
- 以
postgres用户连接数据库,创建包装函数:
CREATE OR REPLACE FUNCTION pg_catalog.pg_ls_waldir_wrapper() RETURNS TABLE (name text, size bigint, modification timestamp with time zone) LANGUAGE plpgsql SECURITY DEFINER AS $$ BEGIN RETURN QUERY SELECT * FROM pg_catalog.pg_ls_waldir(); END; $$;
- 授予监控用户
prometheus执行该包装函数的权限:
GRANT EXECUTE ON FUNCTION pg_catalog.pg_ls_waldir_wrapper() TO prometheus;
之后监控系统调用pg_catalog.pg_ls_waldir_wrapper()即可获取WAL目录的相关信息,既满足需求又避免过度授权。
内容的提问来源于stack exchange,提问作者BobWall23
相关产品推荐
相关产品推荐

