【问题标题】:Create true read only user in PostgreSQL在 PostgreSQL 中创建真正的只读用户
【发布时间】:2023-02-09 18:57:47
【问题描述】:

我已经跨越了 Digital Ocean 中的 PostgreSQL 数据库。我现在需要提供一组用户和数据库,我曾考虑为其创建多个数据库(productionstaging 等)并为每个数据库设置 2 个关联角色,并具有只读和读写权限(production_roproduction_rwstaging_rostaging_rw 等)。我的想法是,通过拥有这些角色,我现在可以创建个人用户并为他们分配其中一个角色,这样我就可以在发生违规情况时快速更改/删除他们。

我一直在研究这个,我能找到的所有页面都有一组类似于 in here 的说明:

-- Revoke privileges from 'public' role
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
REVOKE ALL ON DATABASE mydatabase FROM PUBLIC;

-- Read-only role
CREATE ROLE readonly;
GRANT CONNECT ON DATABASE mydatabase TO readonly;
GRANT USAGE ON SCHEMA myschema TO readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA myschema TO readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT SELECT ON TABLES TO readonly;

-- Read/write role
CREATE ROLE readwrite;
GRANT CONNECT ON DATABASE mydatabase TO readwrite;
GRANT USAGE, CREATE ON SCHEMA myschema TO readwrite;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA myschema TO readwrite;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO readwrite;
GRANT USAGE ON ALL SEQUENCES IN SCHEMA myschema TO readwrite;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT USAGE ON SEQUENCES TO readwrite;

-- Users creation
CREATE USER reporting_user1 WITH PASSWORD 'some_secret_passwd';
CREATE USER reporting_user2 WITH PASSWORD 'some_secret_passwd';
CREATE USER app_user1 WITH PASSWORD 'some_secret_passwd';
CREATE USER app_user2 WITH PASSWORD 'some_secret_passwd';

-- Grant privileges to users
GRANT readonly TO reporting_user1;
GRANT readonly TO reporting_user2;
GRANT readwrite TO app_user1;
GRANT readwrite TO app_user2;

我已经仔细按照这些说明进行了监控,没有一个失败,但是在成功运行它们之后,我剩下的应该是只读用户,实际上他们可以创建表,看不到其他用户创建的表,和切换数据库。

我究竟做错了什么?

- - 编辑 - -

这是 \dn+ 命令的结果:

                          List of schemas
  Name  |  Owner   |  Access privileges   |      Description
--------+----------+----------------------+------------------------
 public | postgres | postgres=UC/postgres+| standard public schema
        |          | =UC/postgres         |

--- 编辑 2 ---

这是我所做的(出于安全原因,我将用户编辑为 <USER_A><USER_B> 等。这些编辑用户将与真实用户 1 对 1 匹配):

$ psql "postgresql://USER_A:<PASSWORD>@<DOMAIN>:<PORT>/<DEFAULT_DB>?sslmode=require"
psql (15.1, server 14.6)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.

<DEFAULT_DB>=> \connect production
psql (15.1, server 14.6)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
You are now connected to database "production" as user "USER_A"
production=> \du
                                                                      List of roles
    Role name    |                         Attributes                         |                                 Member of
-----------------+------------------------------------------------------------+---------------------------------------------------------------------------
 USER_B          | Superuser, Replication                                     | {}
 USER_A          | Create role, Create DB, Replication, Bypass RLS            | {pg_read_all_stats,pg_stat_scan_tables,pg_signal_backend,r_production_ro}
 postgres        | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 production_ro   | Cannot login                                               | {}

production=> REVOKE CREATE ON SCHEMA public FROM PUBLIC;
WARNING:  no privileges could be revoked for "public"
REVOKE
production=>

--- 编辑 3 ---

与 DigitalOcean 取得了联系。这是他们的回应:

只是想让你知道我们正在调查这个问题,到目前为止我 能够重现该行为。似乎为了去除 从我们需要的用户的公共模式创建表 “REVOKE CREATE ON SCHEMA public FROM PUBLIC;”这是不允许的 doadmin 用户不是超级用户,撤销此权限会 影响其他角色。

【问题讨论】:

    标签: postgresql digital-ocean privileges


    【解决方案1】:

    如果用户可以创建表,则它对相关模式具有 CREATE 权限。在psql中用dn+ public查看那些权限。确定有问题的权限并REVOKE他们。

    或者,如果您使用 PostgreSQL v15 或更高版本,则可能是您的数据库用户直接或间接是预定义角色pg_write_all_data 的成员。撤销该会员资格。

    在您的特定情况下,正确的做法是从PUBLIC 撤销对架构public 的默认CREATE 特权,即每个人:

    REVOKE CREATE ON SCHEMA public FROM PUBLIC;
    

    你说你已经这样做了,它引起了警告并且没有效果。那不是 PostgreSQL 会做的。你必须问修改 PostgreSQL 的人,在你的例子中是 DigitalOcean。

    【讨论】:

    • 嗨@Laurenz,我似乎无法实现这个:-(。我已经运行了你的命令并尝试了REVOKE CREATE ON SCHEMA public FROM production_ro但它打印出WARNING: no privileges could be revoked for "public"并且它仍然可以创建表。有什么建议吗?
    • 好吧,你没有将dn+ schemaname的结果添加到问题中,所以我无法知道当前的权限是什么。
    • 抱歉,我认为此命令的重要部分是模式的名称。我已经用它的结果更新了原来的问题。
    • 感谢更新,但这是我运行的第一个命令。当我运行它时,我得到 WARNING: no privileges could be revoked for "public",我开始怀疑这意味着我没有权限对这个用户这样做:-(
    • 这在 PostgreSQL 中是不可能的。要么你犯了一些微不足道的错误,例如当你运行dn+ 和运行REVOKE 时你连接到不同的数据库,或者你正在使用修改了权限系统的 PostgreSQL 的黑客版本。您收到警告的事实表明是后者,因为您不会在 PostgreSQL 中收到这样的警告。
    猜你喜欢
    • 2010-10-20
    • 2020-01-06
    • 1970-01-01
    • 1970-01-01
    • 2021-01-05
    • 2023-03-22
    相关资源
    最近更新 更多