撤销PostgreSQL中pg_catalog表的权限

9
有没有一种方法可以撤销用户对目录对象(即information_schema)和PostgreSQL表(即pg_catalog)的权限?我尝试了几种方法并搜索了网络,但都没有成功。我读到唯一有点帮助的是,我可能不想从系统表中删除“public”,因为用户定义的函数可能依赖于这些模式中的一个对象。以下命令只是我还没有能够成功运行的一小部分示例。
REVOKE ALL PRIVILEGES ON SCHEMA pg_catalog FROM PUBLIC; -- didn't work
REVOKE ALL PRIVILEGES ON SCHEMA pg_catalog FROM public; -- didn't work
REVOKE ALL PRIVILEGES ON SCHEMA pg_catalog FROM user1; -- didn't work
REVOKE SELECT ON pg_catalog.pg_roles FROM user1; -- worked
REVOKE SELECT ON pg_catalog.pg_database FROM user1;  -- didn't work

REVOKE ALL PRIVILEGES ON SCHEMA pg_catalog FROM g_users; -- didn't work
REVOKE SELECT ON pg_catalog.pg_database FROM g_users;  -- didn't work

有什么想法吗?还是这不可能吗?谢谢... Leslie

请定义“没有工作”。另外,您的PostgreSQL版本是什么? SELECT version()pg_catalog权限的当前状态如何?查看\dp pg_catalog.*(无需粘贴,但如果您看到任何提到除postgres之外的任何用户的条目,请粘贴)。粘贴\dn+ pg_catalog的输出。在编辑问题后在此处发表评论,以便我收到通知。 - Craig Ringer
解释一下你为什么要这样做可能也是个好主意;有时候会有更好的方法。 - Craig Ringer
“Didn't work” 意味着在 psql 环境中,该账户通过使用 "Select" 语句访问了表。有趣的是,"\dp pg_catalog.*" 得到了 "权限被拒绝..." 的结果。然而,我可以成功地运行查询并对 pg_databases 进行选择。运行 "\dn +pg_catalog" 也返回了 "权限被拒绝"。我的目标是撤销任何其他账户对这些表进行查询或修改的权限。基本上是保护表免受 SQL 注入和窥探。运行的版本是 9.1.10。 - Guest Posting
1
更新: 使用您给我的想法,我查询了information_schema.table_privileges以查找哪些角色具有对pg_database的权限。 -- 没有从用户中删除权限 REVOKE SELECT ON pg_catalog.pg_database FROM PUBLIC;-- 从用户中删除权限 REVOKE SELECT ON pg_catalog.pg_database FROM PUBLIC; 由于某种原因,如果我使用“SELECT”语句,模式将不允许我从整个模式中撤销权限。但是,如果我从特定表中撤销权限,则可以像预期的那样拒绝对该表的“SELECT”语句的权限。 - Guest Posting
2个回答

16

让我来帮助你:

  • 第一步: 因为pg_catalog是由超级用户postgres拥有的,所以请确保您使用此角色登录到服务器: pg_catalog模式权限

  • 第二步: 确保您连接到需要对其进行GRANT/REVOKE权限的正确数据库。GRANT/REVOKE只会影响您连接的当前数据库。这意味着在使用超级用户账户登录后,请发出: \c [the db]来连接到该数据库,shell将更改为: [the db]=>

  • 第三步: pg_catalog中的表默认授予PUBLIC SELECT权限: pg_catalog中的表。因此,您必须运行REVOKE SELECT FROM PUBLIC,然后向适当的用户授予SELECT权限:

    REVOKE SELECT ON ALL TABLES IN SCHEMA pg_catalog FROM PUBLIC;

    GRANT SELECT ON TABLE [table] TO [user];

    要列出数据库中的表,请使用:pg_classpg_namespace

就是这样:)


7
您试图在PostgreSQL中实现的目标是根据设计而被拒绝的。
如果用户无法访问pg_catalog模式(就像您使用REVOKE命令尝试做的那样),他/她甚至无法运行最简单的SELECT查询 - 规划器将无法访问表定义。
您的目标可以通过撤销对所有模式的访问权限来实现 - 从而仅将用户锁定在其私有模式中(使用CREATE SCHEMA AUTHORIZATION username)。
如果public已经授予了任何权限,则无法有选择地为一个用户阻止它们 - 您只能从public中撤销。
相关文档:
- {{link1:创建模式}} - {{link2:模式和特权}}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接