限制用户权限仅限于一个特定的数据库

7

PostgreSQL版本9.1,

我正在使用默认用户“postgres”登录数据库,我的数据库包含默认角色“public”

我拥有的数据库列表如下,

1.database1

2.database2

3.database3

现在,我需要创建一个名为“newuser”的用户,该用户只能访问“database2”,不能登录其他数据库。

我尝试使用以下语法:

create role newuser with login nosuperuser nocreatedb nocreaterole noinherit password 'newpassword';
revoke all privileges on database database1, database3 from newuser;

但是"newuser"仍然可以登录到其他数据库(database1/database3),并且可以从其他模式中选择表。 (公共模式中的表未列出)

请问,有人能够向我解释正确的创建用户并授予权限的过程吗?

我需要一个用户仅对特定数据库拥有所有权限,他不应该登录其他数据库 :)


https://wiki.postgresql.org/wiki/A_Guide_to_CVE-2018-1058:_Protect_Your_Search_Path - Entree
https://www.cvedetails.com/vulnerability-list/vendor_id-336/product_id-575/Postgresql-Postgresql.html - Entree
4个回答

13

您可以通过运行以下命令从数据库中删除用户的权限:

REVOKE ALL PRIVILEGES ON DATABASE database_name FROM username;

7

默认情况下,所有public架构都将对常规(非超级用户)用户可用。为了防止这种情况,请作为超级用户登录并发出以下命令:

REVOKE ALL ON DATABASE somedatabase FROM PUBLIC;

这将撤销给定数据库的所有用户的所有权限。

6

你是否尝试过撤销连接数据库的权限?这将禁止对数据库进行任何进一步操作。

REVOKE CONNECT ON DATABASE your_db FROM user;

经过一番调查,很明显上述方法不起作用。也许 Tom Lane 的回答可以给你更好的解决方案。


@MAHI 进行了一些研究,请查看邮件列表中的答案链接。 - DrColossos
我认为这确实是一个合乎逻辑的解释,@DrColossos。无论如何,值得一试。 - pyrocumulus
@MAHI:你还需要从公共区域撤销连接。 - user330315

1

我通常是通过 pg_hba.conf 来进行操作的,虽然我认为你尝试的方式也应该是可行的。

我们期望撤销所有权限将拒绝任何列出实体的内容。所以没有连接,更不用说实际选择了。可能有一些明显的东西我们在这里忘记了。

无论如何,使用配置文件应该很容易解决这个问题。添加 newuser 并仅列出您想要允许的数据库即可。它将有效地阻止该用户与任何其他数据库建立连接。显然,除了您已经拥有的特权设置之外,还要使用此设置。


谢谢您的回复,这是唯一的选择吗?对于每个新用户进行配置可能会很困难。 - MAHI
我不知道,我不认为这是唯一的选择。今晚如果我有空闲时间,我会在我的本地Postgres服务器上构建一个测试环境。如果我能够在不更改pg_hba.conf的情况下使其工作,我会告诉你 :) - pyrocumulus

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