为什么新用户可以在 PostgreSQL 中创建表?

Jes*_*ose 13 postgresql permissions

我按照两个教程创建了一个数据库:

  1. 一个完全特权的用户链接
  2. 只读用户链接

然后我从CJ Estel 的教程中得到了一条提示,指出“即使我们从未明确将其提供给我们的新用户,您也可能继承了创建表的能力”。果然,只读用户能够创建和拥有表!

CJ Estel 很好地指出了根本原因,即模板数据库。但是,创建表格的能力破坏了您通过谷歌搜索“只读用户 postgres”获得的大多数教程,包括在 postgresql.org 上托管的教程。您的用户拥有的不仅仅是只读权限!

为什么新用户有这种能力?撤销此权限后,该用户的数据库是否真的是只读的?

Cra*_*ger 13

TL;DR:新用户可以在public模式中创建表,因为人们抱怨他们不能创建表太难了。

如果您不喜欢默认设置,您可能应该使用您想要的初始配置创建一个新的模板数据库。例如,您可能会:

DROP SCHEMA public;
Run Code Online (Sandbox Code Playgroud)

或者

REVOKE ALL ON SCHEMA public FROM public;
GRANT USAGE ON SCHEMA public TO public;
Run Code Online (Sandbox Code Playgroud)

在您的模板中。

如果您希望public用户对数据库没有任何权限,您还应该:

REVOKE ALL ON DATABASE mydbname FROM public;
GRANT CONNECT ON DATABASE mydbname TO public;
Run Code Online (Sandbox Code Playgroud)

以便public用户无法创建架构或使用临时表。


就我个人而言,如果我正在设计这个,我会TEMP默认为用户提供数据库的权限,但不是CREATE(数据库CREATE中的public模式)或(模式中的表)。我会为业主保留那些。

然而,它们是很久以前做出的选择,现在很难改变它们。


事实上,经常有人抱怨 PostgreSQL 太难开始使用,因为您必须创建一个用户帐户并且通常还想创建一个数据库。为什么我们不只是自动创建它们并默认为“信任”作为身份验证模式以使其变得容易?为什么postgres用户默认没有密码postgres?如果操作系统中存在用户,我们为什么不自动创建用户?等等。

对于新用户来说,存在一些真正的可用性问题 - 特别是,大多数人不知道peerauth 是什么,或者为什么psql在安装 PostgreSQL 后运行会告诉他们没有他们登录的用户名。

pg_hba.conf配置文件也很乱,但用户是在 SQL 级别创建的。这种分裂让用户感到困惑。

但是,很多事情都是安全默认值和简单默认值之间的折衷,项目永远不会让每个人都满意。

  • 在回复之前的评论时,它不是。 (3认同)