创建的用户无需任何授权即可访问PostgreSQL中的所有数据库


44

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

这是我在Ubuntu Server 12.04上执行的操作:

  1. apt-get安装postgresql
  2. sudo -u postgres createuser -DRSP mike1(指定新用户的密码)
  3. 须藤-u postgres createdb data1
  4. psql -h localhost -U mike1 data1(指定用户mike1登录的密码)

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

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


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

Answers:


46

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

REVOKE connect ON DATABASE database_name FROM PUBLIC;

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

GRANT connect ON DATABASE database_name TO rolename;

编辑:在多租户的情况下,connect将不仅仅是删除特权。有关多租户提示和最佳实践,您可能需要阅读postgresql公共Wiki: PostgreSQL中的“ 共享数据库托管管理”权限


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

24

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

REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;

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

REVOKE CONNECT ON DATABASE template1 FROM PUBLIC;

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

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

1
实际上,该CONNECT特权没有从模板传递到新数据库,因此在template1上吊销它不会产生上述效果。
丹尼尔·韦里特(DanielVérité)2012年

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

1
是。我在答案中添加了相关链接,您可能希望阅读更多有关此问题的文档。
DanielVérité2012年

4

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

您可以通过以下方式找到文件的存储位置:

SHOW hba_file;

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

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


谢谢!我没有看pg_hba.conf文件,但我的印象是,它只能支配下,如何在用户进行身份验证连接到数据库的时候,而不是用户在同一数据库中有哪些权限。
mikeplate

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

0

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

按照这个SO问题的答案,没有一种(推荐的)方法可以实现。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.