You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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特性以创建者权限执行原函数,同时仅授予监控用户包装函数的执行权限:

  1. 以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;
$$;
  1. 授予监控用户prometheus执行该包装函数的权限:
GRANT EXECUTE ON FUNCTION pg_catalog.pg_ls_waldir_wrapper() TO prometheus;

之后监控系统调用pg_catalog.pg_ls_waldir_wrapper()即可获取WAL目录的相关信息,既满足需求又避免过度授权。

内容的提问来源于stack exchange,提问作者BobWall23

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 19:20:12