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`` 是根据行的新内容而不是原始内容计算的。
KingbaseES 行级安全策略介绍的更多相关文章
- MySQL行级锁、表级锁、页级锁详细介绍
原文链接:http://www.jb51.net/article/50047.htm 页级:引擎 BDB.表级:引擎 MyISAM , 理解为锁住整个表,可以同时读,写不行行级:引擎 INNODB , ...
- Security Policy:行级安全(Row-Level Security)
行级安全RLS(Row-Level Security)是在数据行级别上控制用户的访问,控制用户只能访问数据库表的特定数据行.断言是逻辑表达式,在SQL Server 2016中,RLS是基于安全断言( ...
- [数据库事务与锁]详解五: MySQL中的行级锁,表级锁,页级锁
注明: 本文转载自http://www.hollischuang.com/archives/914 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的 ...
- 第十篇 SQL Server安全行级安全
本篇文章是SQL Server安全系列的第十篇,详细内容请参考原文. 不像一些其他industrial-strength数据库服务,SQL Server缺乏一个内置保护个别数据记录的机制,称为行级安全 ...
- 【数据库】数据库的锁机制,MySQL中的行级锁,表级锁,页级锁
转载:http://www.hollischuang.com/archives/914 数据库的读现象浅析中介绍过,在并发访问情况下,可能会出现脏读.不可重复读和幻读等读现象,为了应对这些问题,主流数 ...
- MySQL中的行级锁,表级锁,页级锁
在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引 ...
- 【转】MySQL中的行级锁,表级锁,页级锁
在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引 ...
- 【译】第十篇 SQL Server安全行级安全
本篇文章是SQL Server安全系列的第十篇,详细内容请参考原文. 不像一些其他industrial-strength数据库服务,SQL Server缺乏一个内置保护个别数据记录的机制,称为行级安全 ...
- python 全栈开发,Day47(行级块级标签,高级选择器,属性选择器,伪类选择器,伪元素选择器,css的继承性和层叠性,层叠性权重相同处理,盒模型,padding,border,margin)
一.HTML中的行级标签和块级标签 块级标签 常见的块级标签:div,p,h1-h6,ul,li,dl,dt,dd 1.独占一行,不和其他元素待在同一行2.能设置宽高3.如果不设置宽高,默认为body ...
- 行级安全(Row-Level Security)
通过授予和拒绝(Grant/Deny)命令控制用户的权限,只能控制用户对数据库对象的访问权限,这意味着,用户访问的粒度是对象整体,可以是一个数据表,或视图等,用户要么能够访问数据库对象,要么没有权限访 ...
随机推荐
- TCP/IP的确认号,序列号和超时重传的学习笔记
一:确认应答和序列号 在tcp中,发送端的数据到达主机时,接收端会返回一个已收到的通知.这个消息叫做确认应答(ACK). 当发送端发送数据后,会等待对端的确认应答.如果有确认应答,说明数据已经成功到达 ...
- SDL开发笔记(三):使用SDL渲染窗口颜色和图片
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- 【Azure 媒体服务】AMS的Manifest文件中SmoothStreamingMedia片段中<c t="6161940" d="749970" r="2" n="0" />, c, t, d, r, n 的解析
问题描述 在Azure媒体服务(AMS: Azure Media Service)中,不管是点播,直播都需要下载manifest文件.而文件中有一段[<c t="6161940&quo ...
- 从零开始学Spring Boot系列-集成MySQL
在Spring Boot中集成MySQL是为了让开发者能够轻松地与MySQL数据库进行交互.本篇文章将指导你如何在Spring Boot 3.2.3项目中使用Gradle来集成MySQL.在此之前,我 ...
- Linux上使用CMake简单例子
记录一下自己简单在linux-Ubuntu上用cmake的例子 首先安装cmake sudo apt install cmake 然后创建一个文件夹,里面放点例子代码 main.cpp //main. ...
- Android switch语句报错Constant expression required
方案一 :可以用 if来替代 如下 原因:在Android Studio中使用JDK17以上版本,会出现switch语句报错"Constant expression required&qu ...
- Word中的公式复制到Visio中乱码问题
将word中编辑好的公式复制到Visio中出现乱码问题 如图所示问题: 解决方案(Visio 选项 --> 高级 --> 显示 ->勾选禁用增强元文件优化) 具体的公式导入和解决操作 ...
- LLM 推理和应用 开源框架梳理
之前对LLM 推理和应用了解不多,因此抽时间梳理了一下,我们从模型量化,模型推理,以及开发平台等三个层面来梳理分析. 模型量化 模型训练时为了进度,采用的32位浮点数,因此占用的空间较大,一些大的模型 ...
- PDF/Excel文件预览功能完整实现-java版本
新需求 最近接到一个新的需求,说是之前直接下载的PDF文件或者是Excel文件,现在不能直接下载,需要实现在线预览功能. 前端人员拿到这个需求后,去看了一下以前的代码,以前调用的下载接口和PDF文件预 ...
- hesitation 单词学习 犹豫 hes 就是 her 粘 助记单词 here
hesitation 单词学习 犹豫 hes 就是 her 粘 助记单词 here hes + itation(ite + ate + ion) hesitation 美: [ˌhezɪˈteɪʃ(ə ...