更新时间:2024-09-05 GMT+08:00

使用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';第二个参数是可以缺省的,是否缺省取决于要执行的函数是否需要参数值。