关于设置PostgreSQL,我一定会有所遗漏。我想做的是创建多个彼此隔离的数据库和用户,以便特定用户只能访问我指定的数据库。但是,根据我的判断,任何创建的用户都可以访问所有数据库,而无需给予任何特定的授权。

这是我在Ubuntu Server 12.04上所做的操作:


apt-get install postgresql
sudo -u postgres createuser -DRSP mike1
(指定新用户的密码)
sudo -u postgres createdb data1
psql- h localhost -U mike1 data1
(指定用户mike1的登录密码)

似乎新用户“ mike1”可以毫无问题地连接到数据库“ data1”并创建表等并且这根本不运行任何GRANT命令(“ data1”的所有者为“ postgres”,因为我没有在步骤3中指定所有者)。

我想做的就是授予mike1对data1的完全访问权限,然后对更多的用户和数据库重复此操作,确保用户只能访问到我选择的一个(或可能几个)数据库。

评论

请记住,即使用户仅限于一个数据库,他们仍然可以查询全局表,这将使他们能够查看数据库名称列表和用户列表。

#1 楼

在SQL级别,每个用户实际上都可以连接到新创建的数据库,直到发出以下SQL命令为止:

REVOKE connect ON DATABASE database_name FROM PUBLIC;


完成后,每个用户或角色应能够连接必须明确授予连接特权:

GRANT connect ON DATABASE database_name TO rolename;


编辑:
在多租户方案中,不仅仅是connect特权会被删除。有关多租户提示和最佳做法,您可能需要阅读postgresql公共Wiki:PostgreSQL中的共享数据库托管和管理权限。

评论


默认值应该是相反的方式。我想用一个随机生成的密码创建一个用户,并授予其访问单个数据库的权限,因为知道postgres可以访问所有数据库。

–TheRealChx101
19年7月26日在3:32

#2 楼

PUBLIC默认情况下可以访问数据库,但不能访问数据。您可以撤消PUBLIC:

REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;


如果要为所有将来的数据库使用此设置,请撤消template1数据库(用于创建新数据库的默认模板数据库)上的CONNECT:

REVOKE CONNECT ON DATABASE template1 FROM PUBLIC;


评论


我懂了。现在更有意义了。我想我不应该以PostgreSQL的新来者的身份来到这里,并质疑也许PUBLIC不应默认对template1拥有CONNECT特权:)但是,我现在还看到数据从未受到危害。谢谢!

–mikeplate
2012年5月13日13:25



作为新手,我们非常欢迎您,也可以对设置提出异议。每个人都可以从中学到东西!

–弗兰克·海肯斯(Frank Heikens)
2012年5月13日13:55

实际上,该CONNECT特权没有从模板传递到新数据库,因此在template1上吊销它不会产生上述效果。

–丹尼尔·韦里特(DanielVérité)
2012年5月13日17:46

@DanielVérité我明白了。因此,我想解决方案是在创建新数据库时始终记住并执行REVOKE CONNECT。这是否真的是PostgreSQL管理员通常执行的操作,还是我应该不在乎,因为无论如何都无法访问数据?不过,我认为,如果仅在多租户环境中已经授权的用户之间,表列表可能会为将来的攻击提供不必要的信息。另外:刚刚意识到,公众还可以在尚未撤销连接的任何数据库中创建自己的表。我必须说,默认设置有点奇怪。

–mikeplate
2012年5月13日19:57



是。我正在为答案添加相关链接,您可能需要阅读更多有关此问题的文档。

–丹尼尔·韦里特(DanielVérité)
2012年5月14日上午10:11

#3 楼

除了默认情况下从PUBLIC撤消连接特权并根据需要授予它们外,可以控制访问的其他级别是通过pg_hba.conf文件。

您可以找到文件的存储位置。 :

SHOW hba_file;


如果您选择使用此机制,则嵌入的注释可能足以帮助您入门。这些文档在这里:

http://www.postgresql.org/docs/current/interactive/auth-pg-hba-conf.html

评论


谢谢!我确实看过pg_hba.conf文件,但给人的印象是,它仅控制用户在连接数据库时如何进行身份验证,而不控制用户在同一数据库中具有的特权。

–mikeplate
2012年5月13日13:29

用户只能连接到pg_hba.conf所允许的数据库。这不仅包括用户和数据库的组合,还包括他们所连接的主机以及允许的身份验证方法。如果不需要这种控制粒度,则其他答案中讨论的GRANT / REVOKE技术可能会更容易。一方面,您只需要一个超级用户数据库连接,而无需OS登录名即可编辑文件。

– kgrittn
2012年5月13日13:53

#4 楼

我遇到了这个线程,正在寻找一种方法来防止用户甚至列出其他数据库名称。 REVOKE CONNECT不能防止这种情况。

根据对此问题的回答,没有一种(推荐的)方法可以实现。