【问题标题】:How to Implement read-only user using ALTER DEFAULT PRIVILEGES in RDS Postgresql?如何在 RDS Postgresql 中使用 ALTER DEFAULT PRIVILEGES 实现只读用户?
【发布时间】:2021-09-30 00:30:27
【问题描述】:

团队,我想在 RDS PostgreSQL 中实现只读权限(例如版本:10.15),我尝试了以下方法,但在成功执行 ALTER DEFAULT PRIVILGES 语句后无法查询表。我想实现这一点 - 每当用户 admin_user001 在该特定数据库中创建架构、表、序列和函数时,只读用户“read_user01”应该获得对这些架构和对象的只读权限。

第一步:用户设置

a. CREATE ROLE admin_role with INHERIT LOGIN password 'Password123#';
   grant admin_role to rdsmasteruser;

b. CREATE USER "admin_user001"  WITH PASSWORD 'Password123#'  INHERIT CREATEDB  valid until 'infinity';
   CREATE USER "read_user01"  WITH PASSWORD 'Password123#'    INHERIT valid until 'infinity';
   grantadmin_user001 to admin_role;
   grant read_user01 to admin_role;

c. CREATE role readonly with INHERIT LOGIN password 'Password123#';;
   grant readonly to read_user01;

Step2:执行 ALTER DEFAULT 命令

d。 admin_user001 创建名为“proddb01”的新数据库

e。 rds 主用户连接这个新的数据库“proddb01”并执行这些命令:

comamnd1: ALTER DEFAULT PRIVILEGES for role admin_role GRANT USAGE ON SCHEMAS TO  readonly; 
comamnd2: ALTER DEFAULT PRIVILEGES for role admin_role GRANT SELECT  ON TABLES    TO readonly;
comamnd3: ALTER DEFAULT PRIVILEGES for role admin_role GRANT SELECT  ON SEQUENCES TO  readonly;
comamnd4: ALTER DEFAULT PRIVILEGES for role admin_role GRANT EXECUTE ON FUNCTIONS TO  readonly;

注意:我不想在任何 abvoe ALTER DEFAUT comamnds 中传递架构名称,第一个 comamnd1 将适用于主要版本 10.x 及更高版本,根据 Postgresql 文档,它可能不适用于 9.x,所以,如果版本是

第 3 步:proddb01 中的架构和表

d。 admin_user001 创建名为“schema01”的模式 admin_user001 创建一个名为“table01”的表(在 schema01 中)

Step4:rds master用户和admin_role的访问验证

e。以 rds maser 用户身份连接 proddb01 并检查此 sql 查询:select * from schema01.table01; ---成功了

以 admin_role 身份连接 proddb01 并检查此 sql 查询:select * from schema01.table01; ---成功了

将 proddb01 连接为“只读”角色并检查此 sql 查询:select * from schema01.table01; ---失败了

***ERROR:  permission denied for schema schema01***

然后我手动授予此角色只读的架构权限并测试了相同的查询 select * from schema01.table01; ---失败了

***ERROR:  permission denied for relation table01

我的观察:ALTER DEFAULT 命令没有授予目标角色“只读”的权限。以下是授予的默认权限的输出

rdsmasteruser@rdspostgres1015 12:54:26@proddb01=#\ddp
                   Default access privileges
   Owner    | Schema |   Type   |       Access privileges
------------+--------+----------+-------------------------------
 admin_role |        | function | =X/admin_role                +
            |        |          | admin_role=X/admin_role      +
            |        |          | readonly=X/admin_role
 admin_role |        | sequence | admin_role=rwU/admin_role    +
            |        |          | readonly=r/admin_role
 admin_role |        | table    | admin_role=arwdDxt/admin_role+
            |        |          | readonly=r/admin_role
 admin_role |        |          | admin_role=UC/admin_role     +
            |        |          | readonly=U/admin_role
(4 rows)

问题:在上面的示例中,我创建了一个名为“admin_role”(带有 INHERIT)的角色,它是所有其他数据库角色的成员,因此,admin_role 能够访问任何其他数据库用户创建的对象/模式/角色。我可以在 ALTER DEFAULT PRIVILGES 命令的 FOR ROLE 子句中使用这个 admin_role 吗?我想传递一个角色名称(在此 FOR USER 子句中),它应该可以访问所有用户创建的所有对象。

【问题讨论】:

    标签: postgresql amazon-rds


    【解决方案1】:

    如果您希望它与admin_user001 创建的对象一起使用,您必须创建默认权限FOR ROLE admin_user001。角色成员资格是不够的。

    【讨论】:

    • 嗨 Laurenz,感谢您的评论,我想传递一个角色名称,它应该是所有其他数据库角色的成员,在本例中是 admin_role,但它不起作用。我不确定这是否可能。您建议的选项肯定会起作用,但是,我需要传递一个角色名称,该名称可以控制所有用户在任何时间点创建的所有对象(代理用户类型)。谢谢
    • 如我所说,如果用户x创建表时要授予权限,那么您必须使用ALTER DEFAULT PRIVILEGES FOR ROLE x。就这么简单。角色成员资格不计算在内。
    • 谢谢 Laurenz,这是我之前试图获得的答案并创建了这个主题。这对劳伦兹很有帮助。所以,我将在 FOR ROLE 子句中传递所有数据库用户,并将只读权限切为组只读。我关闭这个线程。再次感谢。
    猜你喜欢
    • 2023-03-29
    • 2010-10-20
    • 2020-01-06
    • 2017-03-19
    • 1970-01-01
    • 2021-01-05
    相关资源
    最近更新 更多