当前位置: 首页 > news >正文

一个简单的Oracle Redaction实验

本实验包含了:

  • 简单的Oracle Redaction演示
  • 针对指定用户的Redaction

实验环境

假设有一个19c多租户数据库,PDB名为orclpdb1。

我们将在orclpdb1中建立2个用户:

  • redact_user: redact管理员
  • schema_user: schema用户

基础实验

首先进入数据库orclpdb1,创建用户redact_user:

alter session set container=orclpdb1;
create user redact_user identified by oracle;
grant connect, resource, unlimited tablespace to redact_user;
grant select on Sys.redaction_policies to redact_user;
grant select on Sys.redaction_columns to redact_user;
grant execute on dbms_redact to redact_user;

然后再创建一个普通用户schema_user:

alter session set container=orclpdb1;
create user schema_user identified by oracle;
grant connect, resource, unlimited tablespace to schema_user;

以schema_user用户登录,并创建表和插入数据:

connect schema_user/oracle@orclpdb1
CREATE TABLE "EMPLOYEES" ("EMPLOYEE_ID" NUMBER(6,0), "FIRST_NAME" VARCHAR2(20), "LAST_NAME" VARCHAR2(25), "SOCIAL_SECURITY" VARCHAR2(11), "SALARY" NUMBER(4,0));
insert into EMPLOYEES (EMPLOYEE_ID,FIRST_NAME,LAST_NAME,SOCIAL_SECURITY,SALARY) values (100,'Steven','King','247-85-9056',7000);
insert into EMPLOYEES (EMPLOYEE_ID,FIRST_NAME,LAST_NAME,SOCIAL_SECURITY,SALARY) values (101,'Neena','Kochhar','334-08-6578',5000);
commit;

以redact_user登入,定义redact策略:

connect redact_user/oracle@orclpdb1BEGIN
DBMS_REDACT.ADD_POLICY (object_schema          => 'SCHEMA_USER',object_name            => 'EMPLOYEES',policy_name            => 'redact_policy',column_name            => 'SOCIAL_SECURITY',function_type          => DBMS_REDACT.RANDOM,expression             => '1=1',enable                 => TRUE);
END;
/

注意,此时redact_user对于schema_user中的表是没有读取权限的:

SQL> show user
USER is "REDACT_USER"
SQL> select * from schema_user.employees;
select * from schema_user.employees*
ERROR at line 1:
ORA-00942: table or view does not exist

此时schema_user查看SOCIAL_SECURITY列,策略生效:

SQL> connect schema_user/oracle@orclpdb1
Connected.
SQL> select social_security from employees;SOCIAL_SECU
-----------
z8e.SQ<Y#@m
qP/uDj(&yX7

赋予redact_user对表的读取权限:

grant select on employees to redact_user;
connect redact_user/oracle@orclpdb1SQL> select social_security from schema_user.employees;SOCIAL_SECU
-----------
Q*NCEmtLY2V
E,8FG0#gM4@

可以看到,目前redact策略对redact_user也是生效的。

扩展实验

在此实验中,我们将实现选择性的redaction。即redact policy仅对schema_user生效。

这时通过redact expresion实现的。

查看DBMS_REDACT的帮助。其语法为:

DBMS_REDACT.ADD_POLICY (object_schema                IN    VARCHAR2 := NULL,object_name                  IN    VARCHAR2,policy_name                  IN    VARCHAR2,column_name                  IN    VARCHAR2 := NULL,function_type                IN    BINARY_INTEGER := DBMS_REDACT.FULL,function_parameters          IN    VARCHAR2 := NULL,expression                   IN    VARCHAR2,enable                       IN    BOOLEAN := TRUE,regexp_pattern               IN    VARCHAR2 := NULL,regexp_replace_string        IN    VARCHAR2 := NULL,regexp_position              IN    BINARY_INTEGER := 1,regexp_occurrence            IN    BINARY_INTEGER := 0,regexp_match_parameter       IN    VARCHAR2 := NULL,policy_description           IN    VARCHAR2 := NULL,column_description           IN    VARCHAR2 := NULL);

其expression参数的作用为:

Default boolean expression for the table or view. If this expression is used, then redaction takes place only if this policy expression evaluates to TRUE.

现在要做的就是修改策略:

connect redact_user/oracle@orclpdb1BEGIN
DBMS_REDACT.ALTER_POLICY (object_schema          => 'SCHEMA_USER',object_name            => 'EMPLOYEES',policy_name            => 'redact_policy',column_name            => 'SOCIAL_SECURITY',action                 => DBMS_REDACT.MODIFY_EXPRESSION,expression             => 'SYS_CONTEXT ( ''USERENV'',''SESSION_USER'' ) =''SCHEMA_USER'''
);
END;
/

现在不同的用户查看的结果就不一样了:

SQL> connect redact_user/oracle@orclpdb1
Connected.
SQL> select social_security from schema_user.employees;SOCIAL_SECU
-----------
247-85-9056
334-08-6578SQL> connect schema_user/oracle@orclpdb1
Connected.
SQL> select social_security from schema_user.employees;SOCIAL_SECU
-----------
9NbODS\?AVj
PAOj4FtYXIW

清理

connect redact_user/oracle@orclpdb1BEGIN
DBMS_REDACT.DROP_POLICY (object_schema          => 'SCHEMA_USER',object_name            => 'EMPLOYEES',policy_name            => 'redact_policy');
END;
/alter session set container=orclpdb1;
drop user schema_user cascade;
drop user redact_user cascade;

Redaction 策略是否可以复用

再来回顾下ADD_POLICY过程的参数:

```sql
DBMS_REDACT.ADD_POLICY (object_schema                IN    VARCHAR2 := NULL,object_name                  IN    VARCHAR2,policy_name                  IN    VARCHAR2,column_name                  IN    VARCHAR2 := NULL,function_type                IN    BINARY_INTEGER := DBMS_REDACT.FULL,function_parameters          IN    VARCHAR2 := NULL,expression                   IN    VARCHAR2,enable                       IN    BOOLEAN := TRUE,regexp_pattern               IN    VARCHAR2 := NULL,regexp_replace_string        IN    VARCHAR2 := NULL,regexp_position              IN    BINARY_INTEGER := 1,regexp_occurrence            IN    BINARY_INTEGER := 0,regexp_match_parameter       IN    VARCHAR2 := NULL,policy_description           IN    VARCHAR2 := NULL,column_description           IN    VARCHAR2 := NULL);

可以看到,由于参数的粒度比较细,唯一可以的是expression,其作用为:

表或视图的默认布尔表达式。 如果使用此表达式,则仅当此策略表达式的计算结果为 TRUE 时才会发生编辑。

如果真的需要有2列,其策略完全一样,基于以上过程再封装也比较简单。

参考

  • Redaction Management in Oracle SQL Developer
http://www.lryc.cn/news/237209.html

相关文章:

  • getchar函数的功能有哪些
  • 信息机房监控系统(动环辅助监控系统)
  • 最强英文开源模型Llama2架构与技术细节探秘
  • 编程刷题网站以及实用型网站推荐
  • 基于STC12C5A60S2系列1T 8051单片机的SPI总线器件数模芯片TLC5615实现数模转换应用
  • 【并发编程】Synchronized的使用
  • 【Python】Python基础
  • gitlab环境准备
  • Apache Doris (五十四): Doris Join类型 - Bucket Shuffle Join
  • 【AI】行业消息精选和分析(23-11-20)
  • Matplotlib实现Label及Title都在下方的最佳姿势
  • 使用 uWSGI 部署 Django 应用详解
  • MyBatis在注解中使用动态查询
  • 百云齐鲁 | 云轴科技ZStack成功实践精选(山东)
  • 【Electron】electron-builder打包失败问题记录
  • OpenCV快速入门:直方图、掩膜、模板匹配和霍夫检测
  • HDD与QLC SSD深度对比:功耗与存储密度的终极较量
  • 医疗软件制造商如何实施静态分析,满足 FDA 医疗器械网络安全验证
  • 【设计模式】聊聊策略模式
  • 二维偏序问题
  • 解析Spring Boot中的CommandLineRunner和ApplicationRunner:用法、区别和适用场景详解
  • 谷歌浏览器版本下载
  • js 打开页面的方法总结
  • element UI表格中设置文字提示(tooltip)或弹出框(popover)时候注意的地方
  • 【网络】OSI模型 与 TCP/IP模型 对比
  • [Docker]记一次使用jenkins将镜像文件推送到Harbor遇到的问题
  • 龙芯 Loongson 架构 UOS 系统编译 Qt 5.15.2 源码
  • 【IDEA 使用easyAPI、easyYapi、Apifox helper等插件时,导出接口文档缺少代码字段注释的相关内容、校验规则的解决方法】
  • asp.net在线考试系统+sqlserver数据库
  • CRM按行业细分的重要性