为什么新用户能够在PostgreSQL中创建表?


13

我遵循了两个教程来使用以下内容创建数据库:

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

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

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

为什么新用户具有此功能?撤消该特权后,数据库对于该用户是否真正是只读的?

Answers:


13

TL; DR:新用户可以在public架构中创建表,因为人们抱怨说,如果不能这样做,那就太难了。

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

DROP SCHEMA public;

要么

REVOKE ALL ON SCHEMA public FROM public;
GRANT USAGE ON SCHEMA public TO public;

在您的模板中。

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

REVOKE ALL ON DATABASE mydbname FROM public;
GRANT CONNECT ON DATABASE mydbname TO public;

因此public用户无法创建架构或使用临时表。


就我个人而言,如果我正在设计此程序,则TEMP默认情况下,我将授予用户对数据库的权限,而不是CREATE(数据库CREATE中的public方案)或(架构中的表)权限。我把那些留给主人。

但是,它们是很久以前做出的选择,现在很难更改它们。


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

对于新用户而言,确实存在一些实用性问题-特别是,大多数人不知道peerauth是什么,或者为什么仅psql在安装PostgreSQL后运行才能告诉他们没有以登录名命名的用户。

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

但是,很多事情是安全默认值和简单默认值之间的折衷,在这种情况下,项目永远都不会令所有人满意。


因此,我运行revoke create on database [databasename] from [username];,现在数据库仅对[username]只读。对?当我读到一本好的Postgres书时,我将再次回到这个答案:)
Jesvin Jose 2015年

2
在回复以前的评论时,其否。
Jesvin Jose
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.