【问题标题】:PostgreSQL Revoking Permissions from pg_catalog tablesPostgreSQL 撤销 pg_catalog 表的权限
【发布时间】:2013-12-31 12:42:20
【问题描述】:

有没有一种方法可以撤销用户对目录对象(即 information_schema)和 PostgreSQL 表(即 pg_catalog)的权限?我已经尝试了几件事并搜索了网络。我没有运气。我读到的唯一部分有用的是我可能不想从系统表中删除“公共”,以防用户定义的函数依赖于其中一个模式中的对象。下面的命令是我除了一个表之外我还没有开始工作的一个小快照。

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

有什么想法吗?或者这是不可能的?谢谢...

莱斯利

【问题讨论】:

  • 定义“无效”。另外,你的 PostgreSQL 版本是什么? SELECT version()pg_catalog 的权限的当前状态是什么?查看\dp pg_catalog.*(无需粘贴,但如果您看到任何提及除postgres 之外的任何用户的条目,请粘贴这些条目)。粘贴\dn+ pg_catalog 的输出。编辑您的问题后在此处发表评论,以便我收到通知。
  • 解释一下为什么您尝试这样做也是一个好主意;有时有一种不同的方法会效果更好。
  • “不起作用”表示该帐户在 psql 环境中使用“Select”语句保持对表的访问。有趣的是,“\dp pg_catalog.*”得到“权限被拒绝...”。但是我可以运行查询在 pg_databases 上成功运行选择。运行“\dn +pg_catalog”也会返回“permission denied”。我的目标是撤销任何其他帐户查询或修改这些表的权限。基本上保护表免受 SQL 注入和窥探。运行 9.1.10。
  • 更新:使用你给我的想法,我查询了 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”语句的权限将按预期被拒绝。

标签: postgresql permissions


【解决方案1】:

你试图完成的事情在 PostgreSQL 中被设计拒绝。

如果用户无法访问 pg_catalog 架构(就像您尝试使用 REVOKE 命令所做的那样),他/她将无法运行最简单的 SELECT 查询 - 规划者将无法访问表定义。

您的目标可能可以通过REVOKE'ing 访问所有模式来实现 - 因此仅将用户锁定在他的私有模式中(使用CREATE SCHEMA AUTHORIZATION username)。

如果任何权利已经被GRANT'ed 到public,您不能选择性地为一个用户阻止它们 - 您只能REVOKE ... FROM public

相关文档:

【讨论】:

    【解决方案2】:

    让我帮你解决这个问题:

    • 1st:因为pg_catalog 归超级用户postgres所有,所以请确保您使用此角色登录服务器: pg_catalog schema permission

    • 2nd:确保连接到需要GRANT/REVOKE权限的正确数据库。 GRANT/REVOKE 仅影响您连接到的当前数据库。这意味着在您使用超级用户帐户登录后,发出:\c [the db] 以连接到该数据库,shell 将更改为:[the db]=>

    • 3rdpg_catalog 中的表默认授予 SELECT 到 PUBLIC:tables in pg_catalog。所以,你必须运行 REVOKE SELECT FROM PUBLIC 然后 GRANT SELECT 给适当的用户:

      REVOKE SELECT ON SCHEMA pg_catalog FROM PUBLIC 中的所有表;

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

      对于数据库中的列表:pg_classpg_namespace

    仅此而已:)

    【讨论】:

      猜你喜欢
      • 2021-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-05
      • 2016-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多