这是我在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
不能防止这种情况。根据对此问题的回答,没有一种(推荐的)方法可以实现。
评论
请记住,即使用户仅限于一个数据库,他们仍然可以查询全局表,这将使他们能够查看数据库名称列表和用户列表。