我正在使用 AGI 生成 Postgres SQL(AWS RDS Postgres),但我想阻止用户询问有关底层表的问题,例如“显示所有数据库”、“显示所有用户”,这些问题会导致诸如SELECT * FROM pg_database
和之类的查询SELECT * FROM pg_roles
。
我为此制定的工作脚本是:
连接到postgres
(postgres
超级用户):
CREATE ROLE client_creator WITH LOGIN PASSWORD '<generate>' CREATEDB CREATEROLE;
連接postgres
至client_creator
:
CREATE DATABASE "client_db";
CREATE ROLE "client_reader" WITH LOGIN PASSWORD '<generate>';
連接client_db
至client_creator
GRANT CONNECT, TEMPORARY ON DATABASE "client_db" TO "client_reader";
GRANT SELECT ON ALL TABLES IN SCHEMA public TO "client_reader";
GRANT USAGE ON SCHEMA public TO "client_reader";
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO "client_reader";
REVOKE ALL PRIVILEGES ON SCHEMA pg_catalog FROM client_reader;
REVOKE ALL PRIVILEGES ON SCHEMA pg_catalog FROM public;
问题是最后两个REVOKE
命令似乎没有效果,因为我仍然可以运行SELECT * FROM pg_roles
并接收所有行。
我也尝试过撤销SELECT
表格pg_catalog
。
问题是:
- 我可以这样做吗?
- 我该这么做吗?想法...
- 我在其他帖子中看到过一些评论,认为这是一个坏主意,但由于我了解每个数据库都有一个 pg_catalog 的副本,所以我认为这不会成为问题
- 我相信生成查询不应该依赖于 pg_catalog 对象,但我可能错了
您必须是超级用户才能更改系统架构上的权限
pg_catalog
;普通用户无法执行此操作。删除USAGE
架构上的权限pg_catalog
将PUBLIC
限制普通用户的访问,但不会影响超级用户的访问,因为他们不受权限限制。这样做是个坏主意,因为它会破坏所有交互式客户端,并可能导致其他更严重的问题。元数据在 PostgreSQL 中是公开的,您不应该尝试更改它(请参阅有关该主题的许多其他问题)。防止用户查看他人元数据的唯一合理方法是将它们放入不同的数据库中,因为每个数据库都有自己的目录表。