使用rds_hwdrs_privs插件
简介
rds_hwdrs_privs插件用来给未root提权的RDS for PostgreSQL版本做部分的权限提升,包括:
- 对pg_catalog.pg_authid的select权限
- 对用户赋予bypassrls,replication的权限
- 创建对all tables的发布
- 执行部分pg_replication_origin_xxx函数的权限
支持的版本说明
该插件支持从9.5到15的版本,但是该插件的目的是给未root提权版本(9.5, 9.6, 10, 11.5及之前的版本)提升权限的,建议11.5之后的版本直接使用root用户进行此插件执行的赋权动作。
可通过以下SQL语句查询当前实例是否支持该插件:
SELECT * FROM pg_available_extension_versions WHERE name = 'rds_hwdrs_privs';
RDS for PostgreSQL实例支持的插件,具体请参见支持的插件列表。
插件安装与卸载
- 安装插件
SELECT control_extension ('create', 'rds_hwdrs_privs');
- 卸载插件
SELECT control_extension ('drop', 'rds_hwdrs_privs');
更多信息,请参见通过界面安装和卸载插件和通过SQL命令安装和卸载插件。
基本使用
此插件只能由root用户或者root的成员用户执行。
可以通过root用户直接执行,或者通过如下操作:
grant root to drs_sync;
将root权限赋予drs_sync,这样drs_sync用户也能够执行。
- 赋予某个用户对pg_catalog.pg_authid的select权限。
select control_select_on_pg_authid('grant', 'drs_sync');
其中,第一个参数可以选择grant, revoke;第二个参数是具体的用户,用户必须已存在。
- 对用户赋予bypassrls, replication的权限。
select control_user_privilege('bypassrls', 'drs_sync');
其中,第一个参数是要赋予的权限,可选范围是bypassrls, nobypassrls, replication, noreplication;第二个参数是具体的用户,用户必须已存在。
- 创建对all tables的发布。
select create_publication_for_all_tables('foo_pub', 'insert, update'); select create_publication_for_all_tables('foo_pub');
该函数只创建for all tables的发布,对于某个表的发布可以使用正常的SQL。
其中,第一个参数是发布名,不能和已有的发布重名;第二个参数是选项,可以缺省,缺省情况下和create publication foo_pub for all tables一样;不缺省的情况下,在RDS for PostgreSQL 10版本中可选的是insert, update, delete,在11版本中可选项多了truncate。
创建出来的publication的owner是root。可以使用root用户或者root的成员用户,通过SQL对该publication进行接下来的操作。
- 执行部分pg_replication_origin_xxx函数。
-- 创建一个复制源 select exec_pg_replication_origin_func('pg_replication_origin_create', 'foo_repl_origin'); -- 删除这个复制源 select exec_pg_replication_origin_func('pg_replication_origin_create', 'foo_repl_origin'); -- 查看当前会话是否绑定了复制源 select exec_pg_replication_origin_func('pg_replication_origin_session_is_setup');
其中,第一个参数是要执行的函数名,可选范围是'pg_replication_origin_create', 'pg_replication_origin_drop', 'pg_replication_origin_oid', 'pg_replication_origin_session_setup', 'pg_replication_origin_session_reset', 'pg_replication_origin_session_is_setup';第二个参数是可以缺省的,是否缺省取决于要执行的函数是否需要参数值。