【发布时间】: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”语句的权限将按预期被拒绝。