我正在尝试以主用户身份针对 AWS RDS 集群运行以下形式的命令:
ALTER DEFAULT PRIVILEGES FOR ROLE "foo_role"
IN SCHEMA "bar"
GRANT SELECT ON TABLES TO "foo-reader";
但是,
rds_superuser
角色不允许这样做:
ERROR: must be member of role "foo_role"
AWS 发布了
rds_superuser
角色可以运行的命令列表此处:
CREATE ROLE, CREATE DB, PASSWORD VALID UNTIL INFINITY, CREATE EXTENSION, ALTER EXTENSION, DROP EXTENSION, CREATE TABLESPACE, ALTER <OBJECT> OWNER, CHECKPOINT, PG_CANCEL_BACKEND(), PG_TERMINATE_BACKEND(), SELECT PG_STAT_REPLICATION, EXECUTE PG_STAT_STATEMENTS_RESET(), OWN POSTGRES_FDW_HANDLER(), OWN POSTGRES_FDW_VALIDATOR(), OWN POSTGRES_FDW, EXECUTE PG_BUFFERCACHE_PAGES(), SELECT PG_BUFFERCACHE
是否可以仅使用
rds_superuser
提供的内容来运行等效命令,理想情况下无需将 foo_role
分配给主用户?
PostgreSQL 文档表明
ALTER DEFAULT PRIVILEGES
只能由会话用户使用,它没有提到超级用户可以将它用于其他用户:
您只能更改由您自己或您所属的角色创建的对象的默认权限。
https://www.postgresql.org/docs/current/sql-alterdefaultprivileges.html
这是违反直觉的。
superuser
角色表明它应该能够执行数据库中的所有操作。
因此,超级用户属于每个用户组并没有错。毕竟,超级用户几乎可以做其他用户可以做的所有事情,
ALTER DEFAULT PRIVILEGES
是一个例外。
GRANT role_name1 TO rds_superuser;
ALTER DEFAULT PRIVILEGES FOR ROLE role_name1
IN SCHEMA schema_name
GRANT SELECT ON TABLES TO role_name2;
https://www.postgresql.org/docs/current/sql-grant.html
如果出于某种原因超级用户不应该成为该角色的成员,那么之后可以将其删除:
REVOKE role_name1 FROM rds_superuser;
https://www.postgresql.org/docs/current/sql-revoke.html
或者,如果不将该角色分配给超级用户,则可以在以超级用户身份登录时更改会话用户:
SET ROLE role_name1
ALTER DEFAULT PRIVILEGES FOR ROLE role_name1
IN SCHEMA schema_name
GRANT SELECT ON TABLES TO role_name2;
RESET ROLE
根据文档,超级用户可以使用
SET ROLE
更改为任何其他角色:
指定的
必须是当前会话用户的角色 是 的成员。如果会话用户是超级用户,则可以是任何角色 已选择。role_name
https://www.postgresql.org/docs/current/sql-set-role.html
毕竟,超级用户可以为任何角色执行
ALTER DEFAULT PRIVILEGES
。只是有点麻烦,必须先更改会话角色,然后再重新设置。