暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

KingbaseDB关于superuser权限用户与模式对象访问

原创 驿路辰风 2023-12-14
1390

注:【该篇不考虑三权分立中sso和sao用户相关模式及模式对象】

关于kingbase超级用户

超级用户(supperuser)权限说明:

拥有所有数据库最高权限,可以越过数据库内的所有访问限制

数据库模式及模式对象:

    1. 模式为数据库对象,是数据对象的逻辑集合,一个数据库中包含1个或多个模式,不同库中模式互不影响,同库中模式不能同名,不同库中可以存在同名模式
    1. superuser权限用户连接任意数据库,可以越过数据库内的所有访问限制
    1. 同库不同模式下可存在同名模式对象
    1. public模式默认对所有用户给予UC权限,可创建、操作模式对象,生产环境中一般收回该权限
    1. public收回UC权限对superuser权限用户无效
    1. 普通用户(或具有loggin权限的角色)对于可连接的任意数据库,\dn可以看到所有非系统模式,但以模式存取权限和模式对象存取权限对访问用户做访问控制
    1. 数据库对用户的权限有CTc,模式对用户的权限有UC,模式对象对用户的权限有arwdDxt,根据需求赋予相应权限
    1. 用户访问操作模式对象的条件(以下为顺序必要条件):

​ (1)可以连接对应库

​ (2)对模式有相应权限

​ (3)对模式对象有相应权限

实验测试:

环境说明

redhat 7.7 kingbase V9

对象说明:

企业微信截图_17025479642245.png

实验测试:

测试准备:

回收test库all users在public模式上的UC权限,创建superuser权限用户dbadmin

-- 以system用户连接test数据库 test=# \c You are now connected to database "test" as userName "system". -- 检查public架构模式信息及权限 test=# \dn+ public 架构模式列表 名称 | 拥有者 | 存取权限 | 描述 ------------------+--------+------------------+------------------------ public | system | system=UC/system+| standard public schema -- system=UC/system system用户对public模式有UC权限 | | =UC/system | -- =UC/system 所有用户对public模式有UC权限 test=# revoke CREATE,USAGE on SCHEMA public from PUBLIC ; -- 回收all users(除超级用户)在public模式上的UC权限 REVOKE test=# \dn+ public 架构模式列表 名称 | 拥有者 | 存取权限 | 描述 --------+--------+------------------+------------------------ public | system | system=UC/system | standard public schema -- 已收回非超级用户对public模式对的UC权限 (1 行记录) -- 创建超级用户 test=# create user dbadmin with password '123456' superuser; CREATE ROLE -- 检查dbadmin用户信息及权限 test=# \du+ dbadmin 角色列表 角色名称 | 属性 | 成员属于 | 描述 ----------+----------+----------+------ dbadmin | 超级用户 | {} | /***revoke语句中的public解释说明: revoke CREATE,USAGE on SCHEMA public from PUBLIC ; 两个public,分别为一个大写和一个小写。 public:模式,可以被替换为数据库中其他任意有效的模式名。 PUBLIC:特殊的关键字,代表了all users(除superuser权限用户)。可以被替换为一个特定的角色名或者以逗号分隔的角色名列表 ***/ /***模式权限说明: 模式权限信息的格式包含三部分,从左到右为:接受权限者、权限、权限授予者 对于模式来说,只有两种可能被授予的权限:USAGE和CREATE,对应存取权限中的U和C。 USAGE:允许角色查询模式对象,例如包含在模式中的表和视图。 CREATE:允许角色在模式中创建数据库对象。 ***/

测试实验

1. superuser权限用户对public模式对象操作
-- 对象准备 test=# \c You are now connected to database "test" as userName "system". test=# create table tbsys(id int); -- system用户默认模式(public)下创建表tbsys CREATE TABLE test=# \c - dbadmin -- 连接dbadmin用户 You are now connected to database "test" as userName "dbadmin". test=# create table tbsup(id int); -- dbadmin用户默认模式(public)下创建表tbsup CREATE TABLE -- 查看public模式存取权限 test=# \dn+ public 架构模式列表 名称 | 拥有者 | 存取权限 | 描述 --------+--------+------------------+------------------------ public | system | system=UC/system | standard public schema (1 行记录) test=# \c - dbadmin -- 连接dbadmin用户 You are now connected to database "test" as userName "dbadmin". test=# show search_path ; -- 查看用户默认查找路径 search_path ----------------- "$user", public (1 行记录) test=# \dt+ tb* -- 查看表对象拥有者 关联列表 架构模式 | 名称 | 类型 | 拥有者 | 大小 | 描述 ----------+-------+--------+---------+---------+------ public | tbsup | 数据表 | dbadmin | 0 bytes | -- tbsup为dbadmin用户在public模式下创建 public | tbsys | 数据表 | system | 0 bytes | -- tbsys为system用户在public模式下创建 (2 行记录) -- 查看模式对象权限 test=# \dp+ public.tbs* 存取权限 架构模式 | 名称 | 类型 | 存取权限 | 列特权 | 策略 ----------+-------+--------+----------+--------+------ public | tbsup | 数据表 | | | -- tbsup表对非owner用户无存取权限 public | tbsys | 数据表 | | | -- tbsys表对非owner用户无存取权限 (2 行记录) -- 对象操作 -- 用dbadmin用户对public模式下的表操作 test=# \c - dbadmin -- 连接dbadmin用户 You are now connected to database "test" as userName "dbadmin". test=# insert into tbsys values(1); INSERT 0 1 test=# insert into tbsup values(2); INSERT 0 1 -- 查看public模式对象 test=# select id from tbsys; id ---- 1 (1 行记录) test=# select id from tbsup; id ---- 2 (1 行记录) /*** 条件: 1. public模式存取权限为system=UC/system,对dbadmin用户无UC权限 2. tbsys表为system用户在public模式下创建的表对象,且对其他用户无存取权限 结果: 1. superuser权限用户dbadmin默认模式依然为public,且可在public模式下做查询,创建对象等操作 2. superuser权限用户dbadmin对owner非自己的用户在public模式下的对象具有操作权限 ***/
2. superuser权限用户对同库但非自属模式对象操作
-- 对象准备 test=# \c You are now connected to database "test" as userName "system". test=# create schema tsysshm; -- system用户在test数据库上创建模式tsysshm CREATE SCHEMA test=# create table tsysshm.tbtsysshm(flg nvarchar(20)); -- system用户在模式tsysshm下创建tbtsysshm表 CREATE TABLE -- 对象属性权限信息查询 test=# \du+ dbadmin -- 查看用户dbadmin属性权限信息 角色列表 角色名称 | 属性 | 成员属于 | 描述 ----------+--------------------------------------------+----------+------ dbadmin | 超级用户 | {} | test=# \du+ system -- 查看用户system属性权限信息 角色列表 角色名称 | 属性 | 成员属于 | 描述 ----------+--------------------------------------------+----------+------ system | 超级用户, 建立角色, 建立 DB, 复制, 绕过RLS | {} | test=# \dn+ tsysshm -- 查看模式system属性权限信息 架构模式列表 名称 | 拥有者 | 存取权限 | 描述 ---------+--------+----------+------ tsysshm | system | | -- system用户所有,且对其他用户无显式权限 (1 行记录) test=# \dp+ tsysshm.tbtsysshm -- 查看表tsysshm.tbtsysshm属性权限信息 存取权限 架构模式 | 名称 | 类型 | 存取权限 | 列特权 | 策略 ----------+-----------+--------+----------+--------+------ tsysshm | tbtsysshm | 数据表 | | | -- 对其他用户无显式权限 (1 行记录) test=# \dt+ tsysshm.tbtsysshm -- 查看表tsysshm.tbtsysshm所属用户 关联列表 架构模式 | 名称 | 类型 | 拥有者 | 大小 | 描述 ----------+-----------+--------+--------+---------+------ tsysshm | tbtsysshm | 数据表 | system | 0 bytes | -- owner为system用户 (1 行记录) -- 对象操作 test=> \c - dbadmin You are now connected to database "test" as userName "dbadmin". test=# create table tsysshm.tbtssup(flg nvarchar(20)); -- 可以在非自己所属的模式下创建对象 CREATE TABLE -- 查询tsysshm模式下的对象用户及权限 test=# \dp+ tsysshm.* 存取权限 架构模式 | 名称 | 类型 | 存取权限 | 列特权 | 策略 ----------+-----------+--------+----------+--------+------ tsysshm | tbtssup | 数据表 | | | tsysshm | tbtsysshm | 数据表 | | | (2 行记录) test=# \dt+ tsysshm.* 关联列表 架构模式 | 名称 | 类型 | 拥有者 | 大小 | 描述 ----------+-----------+--------+---------+------------+------ tsysshm | tbtssup | 数据表 | dbadmin | 8192 bytes | tsysshm | tbtsysshm | 数据表 | system | 8192 bytes | (2 行记录) -- 数据操作 -- 用dbadmin用户对public模式下的表操作 test=# \c - dbadmin You are now connected to database "test" as userName "dbadmin". test=# insert into tsysshm.tbtssup values('该表由dbadmin创建'); INSERT 0 1 test=# insert into tsysshm.tbtsysshm values('该条数据由dbadmin插入'); INSERT 0 1 test=# select * from tsysshm.tbtsysshm ; flg ----------------------- 该条数据由dbadmin插入 (1 行记录) test=# select * from tsysshm.tbtssup; flg ------------------- 该表由dbadmin创建 (1 行记录) test=# truncate tsysshm.tbtsysshm ; TRUNCATE TABLE /*** 条件: 1. tsysshm模式存取权限无显式权限,属于system用户 2. tbtsysshm所属用户表为system用户在tsysshm模式下创建的表对象,且对其他用户无存取权限 结果: 1. superuser权限用户dbadmin可在tsysshm模式下对对象操作。 2. superuser权限用户dbadmin对owner非自己的用户在非public模式下的对象具有操作权限。 ***/
3. superuser权限用户对非同库对象操作
-- 对象准备 test=# \c - dbadmin You are now connected to database "test" as userName "dbadmin". test=# create user tyxl01 with password '123456' createdb createrole; CREATE ROLE test=> \du+ tyxl01 角色列表 角色名称 | 属性 | 成员属于 | 描述 ----------+-------------------+----------+------ tyxl01 | 建立角色, 建立 DB | {} | test=# \c - tyxl01 You are now connected to database "test" as userName "tyxl01". test=> create database db01; CREATE DATABASE test=> \c db01 You are now connected to database "db01" as userName "tyxl01". db01=> create schema shm01; CREATE SCHEMA db01=> create table shm01.tb01(flg nvarchar(20)); CREATE TABLE -- 对象权限查询 test=> \l+ db01 数据库列表 名称 | 拥有者 | 字元编码 | 校对规则 | Ctype | 存取权限 | 大小 | 表空间 | 描述 ------+--------+----------+-------------+-------------+----------+-------+-------------+------ db01 | tyxl01 | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | | 14 MB | sys_default | db01=> \dn+ shm01 架构模式列表 名称 | 拥有者 | 存取权限 | 描述 -------+--------+----------+------ shm01 | tyxl01 | | (1 行记录) db01=> \dt+ shm01.tb01 关联列表 架构模式 | 名称 | 类型 | 拥有者 | 大小 | 描述 ----------+------+--------+--------+---------+------ shm01 | tb01 | 数据表 | tyxl01 | 0 bytes | (1 行记录) db01=> \dp+ shm01.tb01 存取权限 架构模式 | 名称 | 类型 | 存取权限 | 列特权 | 策略 ----------+------+--------+----------+--------+------ shm01 | tb01 | 数据表 | | | (1 行记录) -- 对象操作 -- 用dbadmin用户对db01库shm01模式下的表操作 -- 1.dbadmin用户连接db01库 db01=# \c db01 dbadmin -- dbadmin用户连接db01库 You are now connected to database "db01" as userName "dbadmin". db01=# revoke CREATE,USAGE on SCHEMA public from PUBLIC ; -- dbadmin回收非超级用户对public模式对的UC权限 db01=# create schema dbadmshm; -- dbadmin用户创建数据库模式对象 CREATE SCHEMA db01=# create table dbadmshm.test(id int); -- dbadmin用户可操作数据库模式对象 CREATE TABLE db01=# create table test(id int); -- dbadmin用户默认使用public模式 CREATE TABLE -- 查看对象权限信息 db01=# \dt 关联列表 架构模式 | 名称 | 类型 | 拥有者 ----------+--------+--------+--------- public | tbtyxl | 数据表 | tyxl01 public | test | 数据表 | dbadmin (2 行记录) db01=# \dt+ shm01.tb01 关联列表 架构模式 | 名称 | 类型 | 拥有者 | 大小 | 描述 ----------+------+--------+--------+---------+------ shm01 | tb01 | 数据表 | tyxl01 | 0 bytes | (1 行记录) db01=# \dt+ dbadmshm.test 关联列表 架构模式 | 名称 | 类型 | 拥有者 | 大小 | 描述 ----------+------+--------+---------+---------+------ dbadmshm | test | 数据表 | dbadmin | 0 bytes | (1 行记录) db01=# \dp+ public.t* 存取权限 架构模式 | 名称 | 类型 | 存取权限 | 列特权 | 策略 ----------+--------+--------+----------+--------+------ public | tbtyxl | 数据表 | | | public | test | 数据表 | | | (2 行记录) db01=# \dp+ shm01.t* 存取权限 架构模式 | 名称 | 类型 | 存取权限 | 列特权 | 策略 ----------+------+--------+----------+--------+------ shm01 | tb01 | 数据表 | | | (1 行记录) -- superuser权限用户对其他模式对象操作 db01=> \c - dbadmin You are now connected to database "db01" as userName "dbadmin". db01=# select * from SYS_HM.PARAM ; type_name | support_offline | type | name | defval -----------------------+-----------------+---------+-------------+-------- All Datafiles Check | t | | | Single Datafile Check | t | INTEGER | RELFILENODE | (2 行记录) db01=# insert into dbadmshm.test values (5); INSERT 0 1 db01=# insert into test values (6); INSERT 0 1 db01=# insert into shm01.tb01 values (4); INSERT 0 1 -- 用tyxl01用户对db01库中操作 db01=> create schema testshm; -- tyxl01用户有createdb权限,可以创建模式 CREATE SCHEMA db01=> create table test01(id int); -- tyxl01用户非superuser权限用户,不能操作未授权的或owner不是自己的模式对象 错误: 创建中没有选择模式 第1行create table test01(id int); ^ db01=> create table public.test01(id int); 错误: 对模式 public 权限不够 第1行create table public.test01(id int); -- 用tyxl01用户对test库中模式下的表操作 db01=> \c test tyxl01 -- 以tyxl01用户连接test数据库 You are now connected to database "test" as userName "tyxl01". test=> select * from tsysshm.tbtssup ; -- 非superuser权限用户tyxl01不能访问未授权模式对象 错误: 对模式 tsysshm 权限不够 第1行select * from tsysshm.tbtssup ; ^ test=> create table test(id int); -- 非superuser权限用户tyxl01不能在未授权模式操作模式对象 错误: 创建中没有选择模式 第1行create table test(id int); /*** 条件: 1. db01数据库,shm01模式,tb01表均为tyxl01用户创建,依次包含 2. shm01,tb01对象owner均为tyxl01用户,且对其他用户无存取、操作显式权限 结果: 1. superuser权限用户dbadmin可以在db01数据库中对模式对象操作 2. superuser权限用户dbadmin对owner非自己的用户在非public模式下的对象具有操作权限 3. superuser权限用户dbadmin在db01中默认模式public模式,可直接操作其模式对象 4. 非superuser权限用户不能操作未授权模式对象或owner不是自己的模式对象 ***/
最后修改时间:2023-12-14 18:56:54
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论