首页 > 其他分享 >KingbaseES 行级安全策略介绍

KingbaseES 行级安全策略介绍

时间:2023-09-19 18:59:54浏览次数:26  
标签:行级 name partid user1 -- 安全策略 policydemo test KingbaseES

本文详细介绍了KingbaseES中通过CREATE POLICY为一个表定义一条行级安全性策略。注意为了应用已被创建的策略,在表上必须启用行级安全性。

策略名称是针对每个表的。因此,一个策略名称可以被用于很多个不同的表并且对于不同的表呈现适合于该表的定义。

策略可以被应用于特定的命令或者特定的角色。除非特别指定,新创建的策略的默认行为是适用于所有命令和角色。

前置条件:

要为一个表创建或者修改策略,必须是该表的拥有者。

注意事项:

  • 如果为一个表启用了行级安全性但是没有适用的策略存在,将假定为一种 “默认否定”策略,这样任何行都不可见也不可更新。

  • 行级别安全策略对SUPERUSER权限用户无效。

  • 行级别安全策略对表的TRUNCATE操作无效。

  • 行级别安全策略对表的所有者无效,可以通过(ALTER TABLE .. FORCE ROW LEVEL SECURITY;)方式强制安全策略对表所有者生效。

一、数据准备

-- 创建用户

CREATE USER user1 WITH LOGIN password '123456';

CREATE USER user2 WITH LOGIN password '123456';

CREATE USER user3 WITH LOGIN password '123456';

二、实验步骤

-- user1 登录Kes数据库

test=> select current_user ;
 current_user 
--------------
 user1
(1 行记录)

-- 建表
test=> CREATE TABLE policydemo(id int , name varchar(10), partid varchar(10));
CREATE TABLE

-- 开启安全策略
test=> ALTER TABLE policydemo ENABLE ROW LEVEL SECURITY;
ALTER TABLE

-- 开启表所有者安全策略生效
test=> ALTER TABLE policydemo FORCE ROW LEVEL SECURITY;
ALTER TABLE

-- 赋权user2表dml操作权限
test=> GRANT ALL ON policydemo TO user1;
GRANT

-- 赋权user2表dml操作权限
test=> GRANT ALL ON policydemo TO user2;
GRANT

-- 赋权user3表dml操作权限
test=> GRANT ALL ON policydemo TO user3;
GRANT

-- 撤销user1对表的TRUNCATE操作
test=> REVOKE TRUNCATE ON  TABLE policydemo FROM user1;
REVOKE

-- 撤销user2对表的TRUNCATE操作
test=> REVOKE TRUNCATE ON  TABLE policydemo FROM user2;
REVOKE

-- 撤销user3对表的TRUNCATE操作
test=> REVOKE TRUNCATE ON  TABLE policydemo FROM user3;
REVOKE

创建行安全策略

-- user1 登录Kes数据库

test=> select current_user ;
 current_user 
--------------
 user1
(1 行记录)

--创建校验函数
test=> \set SQLTERM /
test=> CREATE OR REPLACE FUNCTION policycheck()RETURNS varchar AS 
test-> BEGIN 
test-> RETURN current_user;
test-> END;
test-> /

-- 创建数据表操作行安全策略
CREATE POLICY policydemo_all ON policydemo AS PERMISSIVE FOR ALL USING (partid = policycheck());

-- 创建数据表查询安全策略
CREATE POLICY policydemo_select ON policydemo AS PERMISSIVE FOR SELECT USING (partid = partid);

*********
PERMISSIVE参数设置安全策略生效方式
policydemo_all or policydemo_select
*********

1.1、user1数据操作验证

-- user1 登录Kes数据库

test=> select current_user ;
 current_user 
--------------
 user1
(1 行记录)

test=> INSERT INTO policydemo(id , name , partid )values(1,'a','user1');
INSERT 0 1

test=> INSERT INTO policydemo(id , name , partid )values(1,'a','user2');
错误:  新行违背了表"policydemo"的行级安全策略

test=> INSERT INTO policydemo(id , name , partid )values(1,'a','user3');
错误:  新行违背了表"policydemo"的行级安全策略

test=> select * from policydemo;
 id | name | partid 
----+------+--------
  1 | a    | user1
(1 行记录)

1.2、user2数据操作验证

-- user2 登录Kes数据库

test=> select current_user ;
 current_user 
--------------
 user2
(1 行记录)

test=> INSERT INTO policydemo(id , name , partid )values(1,'a','user1');
错误:  新行违背了表"policydemo"的行级安全策略

test=> INSERT INTO policydemo(id , name , partid )values(1,'a','user2');
INSERT 0 1

test=> INSERT INTO policydemo(id , name , partid )values(1,'a','user3');
错误:  新行违背了表"policydemo"的行级安全策略

test=> select * from policydemo;
 id | name | partid 
----+------+--------
  1 | a    | user1
  1 | a    | user2
(2 行记录)

1.3、user3数据操作验证

-- user3 登录Kes数据库

test=> select current_user ;
 current_user 
--------------
 user3
(1 行记录)

test=> INSERT INTO policydemo(id , name , partid )values(1,'a','user1');
错误:  新行违背了表"policydemo"的行级安全策略

test=> INSERT INTO policydemo(id , name , partid )values(1,'a','user2');
错误:  新行违背了表"policydemo"的行级安全策略

test=> INSERT INTO policydemo(id , name , partid )values(1,'a','user3');
INSERT 0 1

test=> select * from policydemo ;
 id | name | partid 
----+------+--------
  1 | a    | user1
  1 | a    | user2
  1 | a    | user3
(3 行记录)

1.4、数据更新,删除操作验证

-- user1 登录Kes数据库

test=> select current_user ;
 current_user 
--------------
 user1
(1 行记录)

test=> select * from policydemo;
 id | name | partid 
----+------+--------
  1 | a    | user1
  1 | a    | user2
  1 | a    | user3
(3 行记录)

test=> update policydemo set id = 10 ;
UPDATE 1
test=> select * from policydemo;
 id | name | partid 
----+------+--------
  1 | a    | user2
  1 | a    | user3
 10 | a    | user1
(3 行记录)

test=> delete from policydemo;  
DELETE 1
test=> select * from policydemo;
 id | name | partid 
----+------+--------
  1 | a    | user2
  1 | a    | user3
(2 行记录)

1.5、truncate数据限制操作

-- user1 登录Kes数据库
test=> select current_user ;
 current_user 
--------------
 user1
(1 行记录)

test=> INSERT INTO policydemo(id , name , partid )values(100,'a','user1');
INSERT 0 1

test=> select * from policydemo;                                          
 id  | name | partid 
-----+------+--------
   1 | a    | user2
   1 | a    | user3
 100 | a    | user1
(3 行记录)

test=> truncate policydemo ;
错误:  对表 policydemo 权限不够

三、结论

KingbaseES可以通过CREATE POLICY方式,实现不同用户对同一个表的行级别数据差异操作,用户只能操作自身权限范围之内的数据(dml操作)。由于安全策略对表的TRUNCATE操作无效,可以通过限制用户的TRUNATE权限方式进行规避限制。

四、附录

CREATE POLICY语法:

CREATE POLICY name ON table_name
    [ AS { PERMISSIVE | RESTRICTIVE } ]
    [ FOR { ALL | SELECT | INSERT | UPDATE | DELETE } ]
    [ TO { role_name | PUBLIC | CURRENT_USER | SESSION_USER } [, ...] ]
    [ USING ( using_expression ) ]
    [ WITH CHECK ( check_expression ) ]

语义

name
要创建的策略的名称。这必须和该表上已有的任何其他策略名称相区分。

table_name
该策略适用的表的名称(可以被模式限定)。

PERMISSIVE
指定策略被创建为宽容性策略。适用于一个给定查询的所有宽容性策略将被使用布尔“OR”操作符组合在一起。通过创建宽容性策略,管理员可以在能被访问的记录集合中进行增加。策略默认是宽容性的。

RESTRICTIVE
指定策略被创建为限制性策略。适用于一个给定查询的所有限制性策略将被使用布尔“AND”操作符组合在一起。通过创建限制性策略,管理员可以减少能被访问的记录集合,因为每一条记录都必须通过所有的限制性策略。

注意在限制性策略真正能发挥作用减少访问之前,需要至少一条宽容性策略来授予对记录的访问。如果只有限制性策略存在,则没有记录能被访问。当宽容性和限制性策略混合存在时,只有当一个记录能通过至少一条宽容性策略以及所有的限制性策略时,该记录才是可访问的。

command
该策略适用的命令。合法的选项是 ALL、SELECT、 INSERT、UPDATE 以及DELETE。 ALL为默认。有关这些策略如何被应用的 细节见下文。

role_name
该策略适用的角色。默认是PUBLIC,它将把策略应用到所有的角色。

using_expression
任意的SQL条件表达式(返回 boolean)。该条件表达式不能包含任何聚集或者窗口函数。如果行级安全性被启用,这个表达式将被增加到引用该表的查询。让这个表达式返回真的行将可见。让这个表达式返回假或者空的任何行将对用户不可见(在SELECT中)并且将对修改不可用(在UPDATE或DELETE中)。这类行会被悄悄地禁止而不会报告错误。

check_expression
任意的SQL条件表达式(返回 boolean)。该条件表达式不能包含任何聚集或者窗口函数。如果行级安全性被启用,这个表达式将被用在该表上的 INSERT以及 UPDATE查询中。只有让该表达式计算为真的行才被允许。如果任何被插入的记录或者跟新后的记录导致该表达式计算为假或者空,则会抛出一个错误。注意 ``check_expression`` 是根据行的新内容而不是原始内容计算的。

标签:行级,name,partid,user1,--,安全策略,policydemo,test,KingbaseES
From: https://www.cnblogs.com/kingbase/p/17461125.html

相关文章

  • KingbaseES V8R6 集群运维案例 -- 脚本部署集群后ssh无法连接
    案例说明:在kylinV10环境下,通过脚本方式部署KingbaseESV8R6集群后,发现ssh无法连接主机,通过分析发现在脚本部署过程中会对系统环境进行优化配置,在修改了/etc/ssh/sshd_config中的usePAM=yes后,导致ssh连接不上。适用版本:KingbaseESV8R6系统环境:KylinV10Server一、问题现......
  • KingbaseES V8R3 备份恢复案例 -- sys_rman物理备份异机恢复
    案例说明:在生产环境通过sys_rman执行了物理备份后,需要在异机构建测试环境,本案例描述了通过物理备份异机恢复的详细过程及操作。适用版本:KingbaseESV8R3节点信息:[kingbase@node102bin]$cat/etc/hosts......192.168.1.101node101#生产节点192.168.1.102node......
  • KingbaseES数据库改写SQL Server数据库CROSS APPLY和OUTER APPLY
    一、功能介绍:CROSSAPPLY和OUTERAPPLY是SQLServer中的一种连接操作,类似于JOIN语句可以将一张表与一个表函数或一个子查询进行关联。表函数是一种返回一个表类型的数据的函数,子查询是一个嵌套在外部查询中的查询。它们可以与表值函数或子查询配合使用,返回左表和右表的匹配结果。......
  • KingbaseES数据库安装PostGIS扩展GEOSUnaryunionPrec错误
    一、问题现象:KingbaseESV008R006C007B0012数据库集群安装PostGIS扩展插件报错。createextensionpostgis;ERROR:couldnotloadiibrary"/opt/kingbase/cluster/kingbase/lib/postgis-3.so”:/opt/kingbase/cluster/kingbase/lib/postgis-3.so:undefinedsymbo1:GEOSUnar......
  • KingbaseES数据库分区表添加主键与索引的建议
    一、初始化测试环境#数据库版本信息KingbaseESV008R006C007B0012onx86_64-pc-linux-gnu,compiledbygcc(GCC)4.1.220080704(RedHat4.1.2-46),64-bit1.创建分区表:createtabletb(idbigint,statdate,nobigint,pdatedate,infovarchar2(50))partitionbyra......
  • KingbaseES 数据库中不同user的视图访问授权
    前言本文的目的是实现u1用户访问ud用户下的视图权限。测试登录system用户并创建schema,user,并授权schema的有关权限给ud用户TEST=#selectcurrent_user;current_user--------------system(1row)TEST=#createschemaud;CREATESCHEMATEST=#TEST=#createuserud;......
  • KingbaseES数据库导入数据invalid byte sequence for encoding
    一、适用版本:KingbaseES数据库所有版本。二、问题现象:使用备份的数据进行还原,还原过程中发生异常。日志信息:sys_restore:connectingtodatabaseforrestoresys_restore:creatingTABLE"public.table_name"sys_restore:creatingCOMMENT"public.COLUMNtable_name.co......
  • KingbaseES V8R6集群运维案例之---在线扩容节点通讯故障问题
    案例说明:KingbaseESV8R6集群节点之间通过ssh或securecmdd工具通讯,默认节点之间通过公钥和私钥方式认证,可以密码通讯;在执行集群节点扩容时,出现以下故障,节点之间仍需要输入密码进行连接:适用版本:KingbaseESV8R6一、问题分析1、测试节点securecmdd通讯如上所示:通过securec......
  • KingbaseES数据库适配Activiti7 didn't put process definition问题处理过程
    一、Activiti介绍Activiti是一个轻量级的java开源BPMN2工作流引擎.目前以升级至7.x,支持与springboot2.x集成.二、项目环境SpringBoot版本2.2.5Activiti版本7.1.x源数据库:MySQL5.7目标数据库:KinbgaseESV008R006C007B0024JDBC驱动:Postgre形态的JDBC驱动,postgresql-42.......
  • KingbaseES数据库配置Hikari数据源
    Hikari是一个高性能的数据库连接池,它是SpringBoot2.x中的默认数据源。一、下载驱动打开下面网址:选择对应平台的jdbc驱动程序。人大金仓-成为世界卓越的数据库产品与服务提供商(kingbase.com.cn)这里以x86平台为例:下载完成后目录里面包含以下文件:根据项目的JDK版本选择对应......