PostgreSQL 权限解释

Posted

技术标签:

【中文标题】PostgreSQL 权限解释【英文标题】:PostgreSQL permissions explained 【发布时间】:2014-10-30 17:04:57 【问题描述】:

请解释 PostgreSQL 中\z 命令的输出。我理解许可,我阅读了文档,但不知何故我错过了对\z 输出的解释。

datastore_default=> \z

                                    Access privileges
 Schema |      Name       | Type  |         Access privileges         | Column access privileges 
--------+-----------------+-------+-----------------------------------+--------------------------
 public | _table_metadata | view  | ckan_default=arwdDxt/ckan_default+| 
        |                 |       | datastore_default=r/ckan_default +| 
        |                 |       | readonlyuser=r/ckan_default      +| 
 public | foo             | table | ckan_default=arwdDxt/ckan_default+| 
        |                 |       | datastore_default=r/ckan_default +| 
        |                 |       | readonlyuser=r/ckan_default      +| 

不知何故 readonlyuser 似乎能够读取表 foo 和 _foo 但实际上它不能。两个命令都返回错误:

sudo -u postgres psql -d datastore_default -U readonlyuser -c 'SELECT * FROM foo'
sudo -u postgres psql -d datastore_default -U readonlyuser -c 'SELECT * FROM public.foo'
ERROR:  permission denied for schema public
LINE 1: SELECT * FROM public.foo

编辑:显然我对数据库和模式权限的工作方式了解甚少。首先,只有数据库管理员(用户 postgres)或数据库所有者(在我的情况下是用户 ckan_default)可以授予其他用户对特定数据库的权限。架构只是数据库级别的,所以我添加readonlyuser查看公共架构的权限是可以的,无论如何它无法从其他数据库中选择。

【问题讨论】:

我在我的答案中添加了一些关于阅读 ACL 的详细信息。 【参考方案1】:

错误表明 schema public 的权限被拒绝(强调我的)

您需要在公共架构上授予只读用户权限:

GRANT USAGE ON SCHEMA public TO readonlyuser;

ACL 的内容在this page 上进行了解释。此处引用的最相关部分:

rolename=xxxx -- 授予角色的权限 =xxxx -- 授予 PUBLIC 的权限

        r -- SELECT ("read")
        w -- UPDATE ("write")
        a -- INSERT ("append")
        d -- DELETE
        D -- TRUNCATE
        x -- REFERENCES
        t -- TRIGGER
        X -- EXECUTE
        U -- USAGE
        C -- CREATE
        c -- CONNECT
        T -- TEMPORARY
  arwdDxt -- ALL PRIVILEGES (for tables, varies for other objects)
        * -- grant option for preceding privilege

    /yyyy -- role that granted this privilege

+ 是 psql 格式化结果的方式的一部分,它们不是值的一部分。

【讨论】:

谢谢,但它似乎仍然不起作用。 sudo -u postgres psql -d datastore_default -U ckan_default -c 'GRANT USAGE ON SCHEMA public TO readonlyuser;' WARNING: no privileges were granted for "public" GRANT。 \z 打印同样的东西。我有 PostgreSQL 9.1.14 (Ubuntu 12.04 LTS) 我认为当您登录的用户没有足够的权限授予这些权限时,它会发出该消息。您应该拥有 GRANT 权限或者是 public 的所有者或者是超级用户。 谢谢。现在很清楚了。我的印象是 + 有一些特殊的含义。 我有一个 postgres 用户,他是一个无法截断的表的所有者...我在该用户的 ACL 中看到它是:arwdRxt。这是什么意思,它与arwdDxt 有何不同?我的假设是因为 DR 其中 D 代表 TRUNCATE psql_access_priv_decoder 是一个工具,您可以提供psql 的输出,并以明文形式向您解释访问权限。

以上是关于PostgreSQL 权限解释的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL:将所有权限授予 PostgreSQL 数据库上的用户

Postgresql权限不断失败

postgresql - 查看架构权限

PostgreSQL(丢失数据的复制或复制)-远程主PostgreSQL的只读权限

漏洞预警 | PostgreSQL 设计缺陷可导致权限提升

浅谈PostgreSQL用户权限