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
相关产品推荐
相关产品推荐

