You need to enable JavaScript to run this app. Redshift如何彻底吊销用户对pg_catalog.pg_database的访问权限
优惠活动
大模型
产品
解决方案
定价
更多

Redshift如何彻底吊销用户对pg_catalog.pg_database的访问权限

问题根因说明

为什么你之前的权限操作不生效

  • Redshift 的系统目录(pg_catalog 下的表/视图)有平台内置的特殊权限规则:所有通过身份验证的普通用户,默认拥有系统目录的基础 SELECT 权限,用于支撑客户端工具(Aginity、psql 等)正常加载元数据、建立连接。普通的 REVOKE ... FROM PUBLIC 加上 CASCADE 参数也仅会级联吊销依赖该权限的自定义权限,无法移除这个内置的基础权限,因此你的吊销操作没有实际效果。
  • Redshift 中普通用户能否在 pg_database 视图中看到某条数据库记录,完全取决于用户(或其所属角色、PUBLIC 角色)是否拥有该数据库的 USAGE 权限,和你是否吊销了 pg_database 视图的表级 SELECT 权限无关。
  • 新建数据库默认会自动给 PUBLIC 角色授予该库的 USAGE 权限,所有普通用户会继承这个权限,因此默认能看到所有新建的数据库。
正确实现需求的步骤

1. 恢复系统目录的基础访问权限

完全禁止普通用户访问 pg_catalog 会导致客户端工具无法正常工作,先撤销你之前不必要的吊销操作:

GRANT USAGE ON SCHEMA pg_catalog TO PUBLIC;
GRANT USAGE ON SCHEMA information_schema TO PUBLIC;

2. 移除所有数据库对PUBLIC的公开访问权限

对每一个你不希望普通用户无授权就能看到的数据库,执行权限吊销(包括默认的系统库、新建的业务库):

-- 示例:对newdb1和默认库执行吊销
REVOKE USAGE ON DATABASE newdb1 FROM PUBLIC;
REVOKE USAGE ON DATABASE dev FROM PUBLIC;
REVOKE USAGE ON DATABASE template0 FROM PUBLIC;
REVOKE USAGE ON DATABASE template1 FROM PUBLIC;

注意:后续每新建一个数据库,都要第一时间执行上述吊销操作,避免自动授权给PUBLIC。

3. 仅给有权限的用户授予对应数据库的USAGE权限

比如你需要让new_user访问newdb1,只单独给该用户授权即可:

GRANT USAGE ON DATABASE newdb1 TO new_user;

4. 验证效果

以new_user身份登录后执行查询:

SELECT datname FROM pg_catalog.pg_database;

此时用户只能看到自己被授予过USAGE权限的数据库,Aginity 等客户端工具的数据库列表也只会展示这些有权限的库。

补充说明
  • 超级用户(superuser)不受上述规则限制,始终能看到所有集群内的数据库,这是平台默认行为。
  • 如果你确实有极端需求要完全禁止用户访问 pg_database 视图(不推荐,会影响客户端工具正常运行),可以通过Redshift的行级安全(RLS)策略实现,不过常规场景下基于USAGE权限的行级过滤已经完全满足隔离需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 09:45:04