GCP Cloud SQL Postgres 13 禁止用户连接新建数据库问题排查
问题原因与解决方案
原因
- GCP Cloud SQL 托管的 PostgreSQL 实例默认内置平台级权限逻辑:新建数据库完成后,系统会自动向
public角色授予该数据库的CONNECT权限,该操作会覆盖从模板数据库template1继承来的权限配置,因此仅修改template1的权限无法生效。 - 若目标用户
someuser被授予了 Cloud SQL 内置的cloudsqlsuperuser高权限角色,该角色默认拥有所有数据库的全量权限,普通权限回收语句对该类角色不生效。
解决方法
- 第一步:先确认目标用户无多余高权限,执行以下语句核查:
如果返回结果包含SELECT rolname FROM pg_roles WHERE pg_has_role('someuser', rolname, 'member') AND rolsuper IS TRUE;cloudsqlsuperuser等超级用户角色,先为用户移除该角色:REVOKE cloudsqlsuperuser FROM someuser; - 第二步(永久生效方案):关闭 Cloud SQL 自动授予
public角色CONNECT权限的默认逻辑:- 进入 GCP 控制台的 Cloud SQL 实例详情页,点击「编辑」
- 找到「标志」配置项,添加标志
cloudsql.disable_public_connect_grant,设置值为on - 保存配置,实例会自动重启生效
- 第三步:重新配置模板数据库权限:
后续通过REVOKE ALL ON DATABASE template1 FROM public;template1模板新建的数据库会自动继承该权限配置,public角色默认不会拥有新库的CONNECT权限,你可以按需给指定用户单独授权:GRANT CONNECT ON DATABASE mydb TO allow_user; - 临时方案(不想修改实例标志):每次新建数据库后,手动执行权限回收语句即可:
REVOKE ALL ON DATABASE mydb FROM public;
内容的提问来源于stack exchange,提问作者Jacek
相关产品推荐
相关产品推荐

