为啥 PostgreSQL 中的新用户可以连接到所有数据库?

Posted

技术标签:

【中文标题】为啥 PostgreSQL 中的新用户可以连接到所有数据库?【英文标题】:Why new user in PostgreSQL can connect to all databases?为什么 PostgreSQL 中的新用户可以连接到所有数据库? 【发布时间】:2011-10-16 13:48:30 【问题描述】:

我安装了 PostgreSQL 9 数据库(从 Oracle10g 迁移),我对用户/角色管理感到非常困惑。当我使用CREATE USERCREATE ROLE 等SQL 命令或通过Navicat 工具创建新用户时,创建的用户可以看到所有数据库!他真的可以把他们联系起来!虽然他不能从表格中选择任何数据,但他可以看到表格对象和序列等。我试图撤销连接特权,但没有效果。我预计新用户没有特权,也看不到任何东西。我真的不知道他为什么可以。

【问题讨论】:

您是如何尝试撤销 CONNECT 权限的? 如果你使用的是pgAdmin,你可以查看用户的登录角色和权限。在您的服务器中,展开登录角色,右键单击有问题的登录角色并检查角色权限和角色成员资格。然后将这些特权和成员资格与有问题的 DB 和 DB 对象进行匹配。如果数据库或对象具有授予的角色,并且您的用户登录具有该角色,则说明访问权限。如果用户在“角色权限”选项卡上单击了复选框,则说明其他权限。 所以我启动了 pgAdmin 并在我的数据库上的角色选项卡上观看(右键单击数据库,然后是权限)。我的所有数据库都加入了一个“公共”角色。所以我删除它。现在它起作用了!!!非常感谢,因为我有点害怕 :-) 你的目标是什么?您是否要使架构保密?您是否尝试默认设置“拒绝所有人登录”?您的真正意图并不完全清楚。 【参考方案1】:

来自http://www.postgresql.org/docs/9.2/static/sql-grant.html#SQL-GRANT-DESCRIPTION-OBJECTS(强调我的):

PostgreSQL 将某些类型对象的默认权限授予PUBLIC。默认情况下,PUBLIC 不会对表、列、模式或表空间授予任何特权。对于其他类型,授予PUBLIC 的默认权限如下:CONNECTCREATE TEMP TABLE 用于数据库EXECUTE 函数权限;和USAGE 语言特权。当然,对象所有者可以REVOKE 默认和明确授予的权限。 (为了获得最大的安全性,请在创建对象的同一事务中发出REVOKE;然后没有其他用户可以使用该对象的窗口。)此外,可以使用ALTER DEFAULT PRIVILEGES 命令更改这些初始默认权限设置.

要删除数据库上所有未指定用户的所有权限(包括CONNECT),请使用:

REVOKE ALL PRIVILEGES ON DATABASE <database> FROM public;

另见:

PostgreSQL: View database connect permissions http://wiki.postgresql.org/wiki/Shared_Database_Hosting

【讨论】:

谢谢,太好了,除了“为了最大的安全性,请在创建对象的同一事务中发出 REVOKE;那么就没有另一个用户可以使用该对象的窗口”——这听起来像是个好建议,但不适用于数据库,因为(引用错误消息)“CREATE DATABASE 不能在事务块内运行”。那么有没有办法关闭窗口让别人使用新的数据库呢?【参考方案2】:

您可能还需要修改pg_hba.conf 文件。默认情况下,本地安装不进行授权检查。

【讨论】:

以上是关于为啥 PostgreSQL 中的新用户可以连接到所有数据库?的主要内容,如果未能解决你的问题,请参考以下文章

从外部连接到 docker 容器中的 Postgresql

无法连接到 Pentaho Kettle 中的 PostgreSQL 数据库

连接到在 Docker 容器中运行的数据库时,sails-postgresql“poolSize”太高错误

Postgresql 用户未连接到数据库(Nginx Django Gunicorn)

深入浅出PostgreSQL数据库---连接到PostgreSQL数据库

如何在弹性beantalk中将PostgreSQL RDS连接到spring boot?