m6米乐安卓版下载-米乐app官网下载
1

当心postgresql中的'public' -m6米乐安卓版下载

maleah 2022-10-15
596

默认情况下,postgresql包含"public"模式,我们始终建议在postgresql的14版本中drop掉。原因是,默认情况下,连接到数据库的用户都可以在public模式中创建对象。postgresql 15从public模式中删除全局写权限。您可以查看该更改的:“移除public模式上的creation权限(noah misch)”。

除了“public”模式之外,还有特殊“public”角色,可以用来向系统中的每一个角色授予一个权限,但这也带来了对默认情况下可能出现的一些情况的疑惑。默认情况下,public角色具有以下权限:

 username | object_type |    object_name     |            array            
---------- ------------- -------------------- -----------------------------
 public   | database    | postgres           | {connect,temporary}
 public   | database    | template1          | {connect}
 public   | language    | internal           | {usage}
 public   | language    | c                  | {usage}
 public   | language    | sql                | {usage}
 public   | language    | plpgsql            | {usage}
 public   | schema      | pg_catalog         | {usage}
 public   | schema      | public             | {usage}
 public   | schema      | information_schema | {usage}
(9 rows)

有一些“usuage”权限,看起来不错,但也有针对“postgres”和“template1”数据库的“connect”权限(如果您想知道如何从系统中获取这些权限,那么您应该查看)。

上周,一位客户与我们联系,他遇到了这种情况:

postgres=# create database d;
create database
postgres=# create user u with login password 'u';
create role
postgres=# revoke connect on database d from u;
revoke

简单设置:一个数据库,一个用户,并从该用户撤销该数据库的连接权限。该用户是否能够连接到数据库?从数据库主机外部进行简单测试:

[email protected]:~$ psql -h 192.168.100.241 -p 5432 -u u d
psql (14.5, server 16devel)
warning: psql major version 14, server major version 16.
         some psql features might not work.
type "help" for help.
d=> 

即使connect权限被撤销,仍然可以连接(当然我之前修改过)。为什么?原因是“public”角色。如果我们再次检查该角色的权限,我们可以看到以下内容:

 username | object_type |    object_name     |            array
---------- ------------- -------------------- -----------------------------
 public   | database    | postgres           | {connect,temporary}
 public   | database    | template1          | {connect}
 public   | database    | d                  | {connect,temporary}
 public   | language    | internal           | {usage}
 public   | language    | c                  | {usage}
 public   | language    | sql                | {usage}
 public   | language    | plpgsql            | {usage}
 public   | schema      | pg_catalog         | {usage}
 public   | schema      | public             | {usage}
 public   | schema      | information_schema | {usage}
(10 rows)

译者注:默认情况下,在创建数据库之后,允许public角色连接,即允许任何人连接。

由于“public”角色默认具有连接权限,因此所有其他用户都可以自动使用该权限,这就是它仍然有效的原因。你应该做的是这样的:

postgres=# revoke connect on database d from public;
revoke

从public角色撤销connect后,用户将无法再连接:

[email protected]:~$ psql -h 192.168.100.241 -p 5432 -u u d
psql: error: connection to server at "192.168.100.241", port 5432 failed: fatal:  permission denied for database "d"
detail:  user does not have connect privilege.

请记住,授予“public”的权限对所有用户都有效。

原文地址:https://www.dbi-services.com/blog/be-careful-with-public-in-postgresql/

原文作者:

「喜欢文章,快来给作者赞赏墨值吧」
1人已赞赏
【米乐app官网下载的版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

网站地图