取消某个角色对PostgreSQL数据库的访问权限

8
我已经创建了一个名为"newrole"和一个新模式"newschema"的角色,该角色仅被授权执行一些存储函数。我已成功撤消了当前数据库中模式"public"的访问权限。
以"newrole"身份登录后,我仍然可以像这样访问PostgreSQL数据库:
SELECT * FROM pg_user

我想撤销对PostgreSQL数据库的所有访问权限,并尝试了以下方法但没有成功:

REVOKE ALL ON DATABASE postgres FROM newrole

当使用newrole身份登录时,我仍然可以读取postgres数据库。

如何撤销对postgres管理数据库的访问权限?

我已经搜索了很长时间,但没有找到有关访问postgres管理数据库的任何信息。

TIA,


你想要删除哪个用户?全部用户吗? - Trevor Clarke
只有"newrole"可以访问数据库。普通用户不能直接访问数据库,但有时需要访问PostgreSQL数据库进行其他操作。 - sibert
我认为必须明确指定连接特权,请尝试撤销“REVOKE”公共数据库[dbname]的连接。 - Lucas
2个回答

8

这个问题与数据库postgres无关。相反,您想要操作当前数据库的目录。每个数据库都有一个包含架构pg_catalog中所有对象信息的目录,以符合标准的形式在模式information_schema中,因此您应该限制角色对这些目录的访问权限,并且也要限制public角色的访问权限,因为每个角色也是该角色的成员:

REVOKE ALL PRIVILEGES ON SCHEMA pg_catalog FROM newrole;
REVOKE ALL PRIVILEGES ON SCHEMA pg_catalog FROM public;
REVOKE ALL PRIVILEGES ON SCHEMA information_schema FROM newrole;
REVOKE ALL PRIVILEGES ON SCHEMA information_schema FROM public;

然而,系统并不总是遵守这个全面的限制,目录存在的原因是为了在数据库中提供重要的功能。特定的功能可能仍然会执行。
一般来说,除非你真的知道自己在做什么,否则不要去摆弄目录。

谢谢您的解释。但是,“newrole”仍然可以访问pg_users等信息。没有办法隐藏敏感信息吗(即多租户环境)? - sibert

3

您应该能够运行这个:

select *  FROM information_schema.table_privileges where grantee = 'newrole';

显示newrole的所有特权。有了这些信息,您应该能够明确地撤销除对“newschema”访问之外的所有内容。

@sibert 我已经删除了我的回答,因为我不知道我在做什么... 如果你运行了我的命令并且造成了任何问题,对不起。祝你的项目好运。 - Trevor Clarke
由于表格权限中没有关于“newrole”的信息,所以我仍在继续搜索... - sibert

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