openGauss 用户权限统计及权限回收

  • 适用范围

  • 问题概述

  • 解决方案

  • 一、环境配置

  • 二、用户权限统计(解析acl权限方式)

    • 1、database 权限

    • 2、schema 权限

    • 3、table 权限

    • 4、table column 权限

    • 5、tablespace 权限

    • 6、sequence 权限

    • 7、function 权限

    • 8、procedure 权限

    • 9、view 权限

    • 10、系统权限

    • 11、role 权限

    • 12、any 权限

  • 三、用户权限统计(查询information_schema 相关视图方式)

    • 1、table、view 权限

    • 2、table column 权限

    • 3、function、procedure 权限

    • 4、usage 权限

适用范围

操作系统:CentOS 7.6
数据库:openGauss 6.0.1

问题概述

解析opengauss 数据库中acl权限相关字段,如pg_class 中relacl 字段,将其转换成对应的select、update等权限信息,并拼接revoke 相应权限的sql 语句。

解决方案

一、环境配置

图片

二、用户权限统计

(解析acl权限方式)

本案例为在postgres 库中创建用户,然后创建testdb 数据库,后续在testdb 库中创建用户对象并进行相关授权操作。

创建用户testuser:

\c postgrescreate user testuser with password 'Test1234';
创建数据库testdb
    create database testdb;\c testdb;

    1、database 权限

    授予testuser 访问testdb库以及在testdb库创建新schema 的权限

    grant connect,create on database testdb to testuser;

    查询testuser的database 权限​​​​​​​

    with t as (select datname,(aclexplode(datacl)).grantee,(aclexplode(datacl)).privilege_typefrom pg_database)select t.datname,ro.rolname,t.privilege_type,'revoke '||t.privilege_type||' on database '||t.datname||' from '||ro.rolname||';' as revoke_sqlfrom tinner join pg_roles ro on ro.oid=t.granteewhere ro.rolname='testuser';

    图片

    2、schema 权限

    创建schema1

    create schema schema1;

    授予testuser 在 schema1 模式创建对象的权限

    grant create,usage on schema schema1 to testuser;

    查询testuser 的schema 权限​​​​​​​

    with t as (select nspname "schema",(aclexplode(nspacl)).grantee,(aclexplode(nspacl)).privilege_typefrom pg_namespace)select t.schema,ro.rolname,t.privilege_type,'revoke '||t.privilege_type||' on schema '||t.schema||' from '||ro.rolname||';' as revoke_sqlfrom tinner join pg_roles ro on ro.oid=t.granteewhere ro.rolname='testuser';

    图片

    3、table 权限

    创建public.t1 表

    create table public.t1 (id int);

    授予testuser 对 public.t1 的增删改查权限

    grant select,insert,update,delete on table public.t1 to testuser;

    查询testuser 的table 权限​​​​​​​

    with t as (select na.nspname "schema",cl.relname,(aclexplode(relacl)).grantee,(aclexplode(relacl)).privilege_typefrom pg_class clinner join pg_namespace na on na.oid=cl.relnamespacewhere cl.relkind in ('r','f'))select t.schema,t.relname,ro.rolname,t.privilege_type,'revoke '||t.privilege_type||' on table '||t.schema||'.'||t.relname||' from '||ro.rolname||';' as revoke_sqlfrom tinner join pg_roles ro on ro.oid=t.granteewhere ro.rolname='testuser';
     
    

    图片

    4、table column 权限

    创建public.t2 表

    create table public.t2 (id int,name char(5));

    授予testuser 对public.t2 表的id列的select、insert 权限

    grant select(id),insert(id) on table public.t2 to testuser;

    查询testuser 的table column 权限​​​​​​​

    with t as (select na.nspname "schema",cl.relname "table_name",attname "column_name",(aclexplode(attacl)).grantee,(aclexplode(attacl)).privilege_typefrom pg_attribute atinner join pg_class cl on cl.oid=at.attrelidinner join pg_namespace na on cl.relnamespace=na.oid)select t.schema,t.table_name,t.column_name,ro.rolname,t.privilege_type,'revoke '||t.privilege_type||'('||t.column_name||') on table '||t.schema||'.'||t.table_name||' from '||ro.rolname||';' as revoke_sqlfrom tinner join pg_roles ro on ro.oid=t.granteewhere ro.rolname='testuser';

    图片

    5、tablespace 权限

    创建tbs1 表空间

    create tablespace tbs1 location '/gaussdata/openGauss/tbs';

    授予testuser 在tbs1 表空间创建表的权限

    grant create on tablespace tbs1 to testuser;

    查询testuser 的tablespace 权限​​​​​​​

    with t as (select spcname,(aclexplode(spcacl)).grantee,(aclexplode(spcacl)).privilege_typefrom pg_tablespace)select t.spcname,ro.rolname,t.privilege_type,'revoke '||t.privilege_type||' on tablespace '||t.spcname||' from '||ro.rolname||';' as revoke_sqlfrom tinner join pg_roles ro on ro.oid=t.granteewhere ro.rolname='testuser';

    图片

    6、sequence 权限

    创建public.seq1 序列

    create sequence public.seq1;

    授予testuser 对 public.seq1 的查询、更新等权限

    grant select,update,usage on sequence public.seq1 to testuser;

    查询testuser 的sequence 权限​​​​​​​

    with t as (select na.nspname "schema",cl.relname,(aclexplode(relacl)).grantee,(aclexplode(relacl)).privilege_typefrom pg_class clinner join pg_namespace na on na.oid=cl.relnamespacewhere cl.relkind in ('S','L'))select t.schema,t.relname,ro.rolname,t.privilege_type,'revoke '||t.privilege_type||' on sequence '||t.schema||'.'||t.relname||' from '||ro.rolname||';' as revoke_sqlfrom tinner join pg_roles ro on ro.oid=t.granteewhere ro.rolname='testuser';

    图片

    7、function 权限

    创建public.fun1 函数​​​​​​​

    create function public.fun1(int,int) returns intas 'select $1+$2;'language sqlimmutablereturns null on null input;

    testuser 默认具有fun1 的执行权限
    授予testuser 修改fun1属性的权限,但前提是testuser 拥有修改public 中对象的权限​​​​​​​

    grant usage,create,alter on schema public to testuser;grant alter on function public.fun1(int,int) to testuser;

    查询testuser 的function 权限​​​​​​​

    with t as (select pr.oid,na.nspname "schema",pr.proname,(aclexplode(proacl)).grantee,(aclexplode(proacl)).privilege_typefrom pg_proc prinner join pg_namespace na on na.oid=pr.pronamespacewhere pr.prokind='f')select t.schema,t.proname,ro.rolname,t.privilege_type,'revoke '||t.privilege_type||' on function '||t.schema||'.'||t.proname||'('||pg_get_function_arguments(t.oid)||') from '||ro.rolname||';' as revoke_sqlfrom tinner join pg_roles ro on ro.oid=t.granteewhere ro.rolname='testuser';

    图片

    8、procedure 权限

    创建insert_data_t1 存储过程
    实现调用上述创建的seq1 序列,往t1表里插入数据​​​​​​​

    create procedure public.insert_data_t1()isbegininsert into public.t1 values(nextval('public.seq1'));end;/

    testuser 默认具有insert_data_t1 的执行权限
    授予testuser 修改 insert_data_t1 属性的权限,但前提是testuser 拥有修改public 中对象的权限

    grant alter on procedure public.insert_data_t1() to testuser;

    查询testuser 的procedure 权限​​​​​​​

    with t as (select pr.oid,na.nspname "schema",pr.proname,(aclexplode(proacl)).grantee,(aclexplode(proacl)).privilege_typefrom pg_proc prinner join pg_namespace na on na.oid=pr.pronamespacewhere pr.prokind='p')select t.schema,t.proname,ro.rolname,t.privilege_type,'revoke '||t.privilege_type||' on procedure '||t.schema||'.'||t.proname||'('||pg_get_function_arguments(t.oid)||') from '||ro.rolname||';' as revoke_sqlfrom tinner join pg_roles ro on ro.oid=t.granteewhere ro.rolname='testuser';

    图片

    9、view 权限

    创建view_t1 视图

    create view public.view_t1 as select * from public.t1;

    授予testuser 查询view_t1 的权限

    grant select on table public.view_t1 to testuser;

    查询testuser 的view 权限​​​​​​​

    with t as (select na.nspname "schema",cl.relname,(aclexplode(relacl)).grantee,(aclexplode(relacl)).privilege_typefrom pg_class clinner join pg_namespace na on na.oid=cl.relnamespacewhere cl.relkind in ('v','m'))select t.schema,t.relname,ro.rolname,t.privilege_type,'revoke '||t.privilege_type||' on table '||t.schema||'.'||t.relname||' from '||ro.rolname||';' as revoke_sqlfrom tinner join pg_roles ro on ro.oid=t.granteewhere ro.rolname='testuser';

    图片

    10、系统权限

    系统权限又称用户属性
    查询testuser 的系统权限​​​​​​​

    select rolname as user_name,rtrim(decode(rolsuper,'t','SuperUser,')||decode(rolcreaterole,'t','CreateRole,')||decode(rolcreatedb,'t','CreateDB,')||decode(rolcatupdate,'t','CatUpdate,')||decode(rolcanlogin,'t','Login,')||decode(rolreplication,'t','Replication,')||decode(rolauditadmin,'t','AuditAdmin,')||decode(rolsystemadmin,'t','Sysadmin,')||decode(rolmonitoradmin,'t','MonitorAdmin,')||decode(roloperatoradmin,'t','OperatorAdmin,')||decode(rolpolicyadmin,'t','PolicyAdmin'),',') as role_sys_privilegesfrom pg_roles where rolname='testuser';

    图片

    11、role 权限

    创建role1 角色

    create role role1 with password 'Test1234';

    将role1 角色授予testuser 用户

    grant role1 to testuser;

    查询testuser 拥有的role 权限​​​​​​​

    select ro1.rolname "role",ro2.rolname "user_name",'revoke '||role||' from '||user_name||';' as revoke_sqlfrom pg_auth_members auinner join pg_roles ro1 on ro1.oid=au.roleidinner join pg_roles ro2 on ro2.oid=au.memberwhere user_name='testuser';

    图片

    12、any 权限

    授予testuser 用户create any table,select any table 权限

    grant create any table,select any table to testuser;

    查询testuser 拥有的any 权限​​​​​​​

    select rolname,privilege_type,'revoke '||privilege_type||' from '||rolname||';' as revoke_sqlfrom gs_db_privilege gsinner join pg_roles ro on ro.oid=gs.roleidwhere rolname='testuser';

    图片

    三、用户权限统计

    (查询information_schema 相关视图方式)

    修改search_path 参数

    set search_path=information_schema;

    1、table、view 权限

    select * from table_privileges where grantee='testuser' and grantor<>'testuser';

    图片

    2、table column 权限

    注:授予表级select、insert 权限时,同时会将表的全部列的select、insert 权限记录在column_privileges 中。

    select * from column_privileges where grantee='testuser' and grantor<>'testuser';

    图片

    3、function、procedure 权限

    ​​​​​​​

    select * from routine_priv grantee='testuser' and grantor<>'testuser';ileges where

    4、usage 权限

    select * from usage_privileges where grantee='testuser' and grantor<>'testuser';

    本文作者:车金陆,墨天轮数据库管理服务团队技术顾问。

    ### 修改 openGauss 数据库中的用户权限openGauss 中,可以通过 `GRANT` 和 `REVOKE` 命令来授予或撤销用户权限。以下是具体的操作方法: #### 授予用户权限 要向用户授予权限,可以使用 `GRANT` 语句。例如,如果希望授予用户 `lily` 创建数据库 (`CREATEDB`) 的权限并将其权限赋予另一个用户 `gaussdb`,则执行如下 SQL 语句: ```sql -- 新建一个角色 lily 并指定系统权限 CREATEDB CREATE ROLE lily WITH LOGIN PASSWORD 'your_password' CREATEDB; -- 将角色 lily 的权限赋予 gaussdb GRANT lily TO gaussdb; ``` 这会创建一个新的角色 `lily` 并给予其创建新数据库的能力,同时也允许 `gaussdb` 使用该角色的权限[^2]。 #### 撤销用户权限 当需要收回已分配给某用户的特定权限时,则应使用 `REVOKE` 语句。比如取消名为 `joe` 用户的角色 `manager` 权限时可按下面的方式操作: ```sql -- 取消 joe 的 manager 角色 REVOKE manager FROM joe; ``` 同样地,也可以通过类似的语法移除其他类型的权限或是从组级别撤回权限,如上面例子所示进一步删除了 `senior_manager` 对于 `manager` 的授权关系,并最终删除了这个不再被使用的 `manager` 用户账号。 对于更细粒度的对象级权限控制(如表、视图等),可以根据实际情况选择合适的动作(如 SELECT, INSERT 等)以及目标对象来进行相应的权限调整。支持的一系列权限包括但不限于:SELECT、INSERT、UPDATE、DELETE、TRUNCATE、REFERENCES、CREATE、CONNECT、EXECUTE、ALTER、DROP、COMMENT、INDEX、VACUUM 和 USAGE 等不同种类,这些都可以针对具体的数据库对象进行设定[^3]。
    评论 3
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    Gauss松鼠会

    你的鼓励将是我创作的最大动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值