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

mik*_*ate 55 postgresql permissions

我一定在设置 PostgreSQL 方面遗漏了一些东西。我想做的是创建多个相互隔离的数据库和用户,以便特定用户只能访问我指定的数据库。但是,据我所知,任何创建的用户都可以访问所有数据库,而无需获得任何特定授权。

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

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

似乎新用户“mike1”连接到数据库“data1”并创建表等没有问题。这根本没有运行任何 GRANT 命令(“data1”的所有者是“postgres”,因为我没有指定所有者在第 3 步)。这真的是它应该如何工作吗?

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

Dan*_*ité 60

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

REVOKE connect ON DATABASE database_name FROM PUBLIC;
Run Code Online (Sandbox Code Playgroud)

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

GRANT connect ON DATABASE database_name TO rolename;
Run Code Online (Sandbox Code Playgroud)

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

  • 默认情况应该是相反的。我想创建一个具有随机生成的密码的用户,并授予其对单个数据库的访问权限,因为我知道“postgres”可以访问所有数据库。 (4认同)

Fra*_*ens 30

PUBLIC 默认可以访问数据库,但是不能访问数据。您可以撤销公众:

REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;
Run Code Online (Sandbox Code Playgroud)

如果您希望此设置用于所有未来的数据库,请撤销 template1 数据库(用于创建新数据库的默认模板数据库)上的 CONNECT:

REVOKE CONNECT ON DATABASE template1 FROM PUBLIC;
Run Code Online (Sandbox Code Playgroud)

  • @DanielVérité 我明白了。所以我想解决方案是在创建新数据库时始终记住并执行 REVOKE CONNECT。这真的是 PostgreSQL 管理员通常如何完成的,还是我不应该太在意,因为无论如何都无法访问数据?尽管如此,我认为表格列表可能会为未来的攻击泄露不必要的信息,如果只是在多租户环境中已经授权的用户之间。另外:刚刚意识到 public 也可以在任何没有 REVOKE CONNECT 的数据库中创建自己的表。我必须说,作为默认设置感觉有点奇怪。 (2认同)