【发布时间】: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