【12c】Oracle 12c Data Redaction 数据编写

Oracle 12c的高级安全特性包含Transparent Data Encryption(透明的数据加密)和Oracle Data Redaction(数据编写),通过这两个特性,可以对数据进行较高的安全控制,以防止非法的访问,上篇介绍了Transparent Data Encryption(透明的数据加密),本篇将对Oracle Data Redaction(数据编写)进行介绍和演示。

1 数据编写概述

通过Oracle提供的数据编写特性,可以对应用程序执行的查询的结果进行屏蔽(编写),从而隐藏真实的数据。可以通过以下几种方法中的一种对列的数据进行编写:

  • 完全编写:保护列的所有内容,返回值的类型取决于列的数据类型,对于数据值,返回值0,对于字符类型的列,返回空格;
  • 部分编写:只更改部分信息,例如,将手机号码进行编写,后三位之后以*号代替;
  • 正则表达式编写:使用正则表达式,编写匹配的内容;
  • 随机编写:执行查询时,返回随机的值以替代真实的值;
  • 无编写:允许测试编写策略的内部工作情况,对当前运行的查询的结果没有任何影响。常用于编写策略的测试。

2 配置数据编写(命令行方式)

2.1 内置程序包

通过Oracle提供的程序包DBMS_REDACT,可以创建数据编写策略,指定必须满足哪些条件后才能对数据进行编写并将其返回给用户,定义此类策略期间,DBA可以指定必须对哪些列应用何种类型的保护。DBMS_REDACT包含的过程如下:

存储过程

描述信息

DBMS_REDACT.ADD_POLICY

在表或视图上增加数据编写策略

DBMS_REDACT.ALTER_POLICY

修改数据编写策略

DBMS_REDACT.UPDATE_FULL_REDACTION_VALUES

全局更新给定数据类型的全部编写值,在使用更新后的值之前,需重启实例

DBMS_REDACT.ENABLE_POLICY

激活数据编写策略

DBMS_REDACT.DISABLE_POLICY

禁用数据编写策略

DBMS_REDACT.DROP_POLICY

删除数据编写策略

2.2 DBMS_REDACT.ADD_POLICY通用语法

DBMS_REDACT.ADD_POLICY (
 object_schema               IN VARCHAR2 := NULL,
 object_name                 IN VARCHAR2 := NULL,
 policy_name                 IN VARCHAR2, 
 policy_description          IN VARCHAR2 := NULL,
 column_name                 IN VARCHAR2 := NULL,
 column_description          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);

2.3 DBMS_REDACT.ADD_POLICY示例

2.3.1 创建完全数据编写策略

1)语法结构

DBMS_REDACT.ADD_POLICY (
   object_schema           IN VARCHAR2 := NULL, 
   object_name             IN VARCHAR2,
   column_name             IN VARCHAR2 := NULL,
   policy_name             IN VARCHAR2,
   function_type           IN BINARY_INTEGER := NULL,
   expression              IN VARCHAR2,
   enable                  IN BOOLEAN := TRUE);

2)示例一:对数字型列进行数据编写

--sys用户执行数据编写策略

begin

dbms_redact.add_policy(object_schema => 'scott',

object_name => 'emp1',

column_name => 'sal',

policy_name => 'redact_emp_sal',

function_type => dbms_redact.full,

expression => '1=1');

end;



SQL> conn scott/scott@odd

Connected.

SQL> select * from emp1 where rownum <3 ;



EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

---------- ---------- --------- ---------- --------- ---------- ---------- ----------

7369 SMITH CLERK 7902 17-DEC-80 0 20

7499 ALLEN SALESMAN 7698 20-FEB-81 0 300 30

可以看到,sal列的值已经编写为0。

对于SYS用户或授予EXEMPT REDACTION POLICY权限的用户则可以看到真实的值。

3)示例二:对字符型列进行数据编写

--sys用户执行数据编写策略

begin

dbms_redact.add_policy(object_schema => 'scott',

object_name => 'emp2',

column_name => 'ename',

policy_name => 'redact_emp_ename',

function_type => dbms_redact.full,

expression => '1=1');

end;

SQL> conn scott/scott@odd

Connected.

SQL> set linesize 200

SQL> select * from emp2 where rownum <3;



EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

---------- ---------- --------- ---------- --------- ---------- ---------- ----------

7369 CLERK 7902 17-DEC-80 800 20

7499 SALESMAN 7698 20-FEB-81 1600 300 30

可以看到,ename列的值全部变为空格了,这是默认的数据编写策略,可以改变数据编写的值。

2.3.2 创建部分数据编写策略

1)语法结构

DBMS_REDACT.ADD_POLICY (
   object_schema           IN VARCHAR2 := NULL, 
   object_name             IN VARCHAR2,
   column_name             IN VARCHAR2 := NULL,
   policy_name             IN VARCHAR2,
   function_type           IN BINARY_INTEGER := NULL,
   function_parameters     IN VARCHAR2 := NULL,
   expression              IN VARCHAR2,
   enable                  IN BOOLEAN := TRUE);

部分数据编写策略,function_type的值固定为dbms_redact.partial。

2)示例:对字符型列进行数据编写

--sys用户执行数据编写策略

begin

dbms_redact.add_policy(object_schema => 'scott',

object_name => 'emp3',

column_name => 'ename',

policy_name => 'redact_cust_ename2',

function_type => dbms_redact.partial,

function_parameters => 'VVVVVVVVVV,VVVVVVVVVV,*,2,9',

expression => '1=1');

end;

--scott用户查询,可以看到第二位至最后,对应的值用*号代替

SQL> select * from emp3 where rownum <3;



EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

---------- ---------- --------- ---------- --------- ---------- ---------- ----------

7369 S**** CLERK 7902 17-DEC-80 800 20

7499 A**** SALESMAN 7698 20-FEB-81 1600 300 30

2.3.3 创建正则表达式数据编写策略

1)语法结构

DBMS_REDACT.ADD_POLICY (
   object_schema           IN VARCHAR2 := NULL, 
   object_name             IN VARCHAR2,
   column_name             IN VARCHAR2 := NULL,
   policy_name             IN VARCHAR2,
   function_type           IN BINARY_INTEGER := 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);

对于该类型的数据编写策略,function_type参数值固定为dbms_redact.regexp。

2)示例

--scott用户创建测试数据

SQL> select * from alen;



ID NAME EMAIL

---------- ---------- ----------------------------------------------------------------------------------------------------

1 Alen alen@qq.com

2 Lucy lucy@163.com

--sys用户执行增加数据编写策略

begin

dbms_redact.add_policy(object_schema => 'scott',

object_name => 'alen',

column_name => 'email',

policy_name => 'redact_email',

function_type => dbms_redact.regexp,

expression => '1=1',

regexp_pattern => dbms_redact.re_pattern_email_address,

regexp_replace_string => dbms_redact.re_redact_email_name,

regexp_position => 1,

regexp_occurrence => 0,

regexp_match_parameter => 'i');

end;

--scott用户查看验证数据,可以看到对email的名称列进行了加密

SQL> select * from alen;



ID NAME EMAIL

---------- ---------- ------------------------------

1 Alen xxxx@qq.com

2 Lucy xxxx@163.com

2.3.4 创建随机数据编写策略

1)语法结构

DBMS_REDACT.ADD_POLICY (
   object_schema           IN VARCHAR2 := NULL, 
   object_name             IN VARCHAR2,
   column_name             IN VARCHAR2 := NULL,
   policy_name             IN VARCHAR2,
   function_type           IN BINARY_INTEGER := NULL,
   expression              IN VARCHAR2,
   enable                  IN BOOLEAN := TRUE);

对于该类型的数据编写策略,function_type参数值固定为dbms_redact.random。

2)示例

begin

dbms_redact.add_policy(object_schema => 'scott',

object_name => 'emp4',

column_name => 'ename',

policy_name => 'redact_ename4',

function_type => dbms_redact.random,

expression => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') = ''SH''');

end;

expression表达的意思是当会话用户是SH的话,会对ename字段进行加密。

SQL> conn sh/sh@odd

Connected.

SQL> select * from scott.emp4 where rownum <3;



EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

---------- ---------- --------- ---------- --------- ---------- ---------- ----------

7369 p;%'5 CLERK 7902 17-DEC-80 800 20

7499 t[32U SALESMAN 7698 20-FEB-81 1600 300 30

可以看到,对于sh用户查询ename列,生成了一串随机产生的字符串,以达到加密的目的。

SQL> conn oe/oe@odd

Connected.

SQL> select * from scott.emp4 where rownum <3;



EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

---------- ---------- --------- ---------- --------- ---------- ---------- ----------

7369 SMITH CLERK 7902 17-DEC-80 800 20

7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30

可以看到,对于od用户查询ename列,可以正常显示。

2.4 修改数据编写策略

对于一张表而言,数据编写策略只能有一个,通过redaction_policies数据字典视图可以查看对应表的数据编写策略,如果在一张表上对多个列进行数据编写,则需要修改数据编写策略,不能再通过增加策略的方式。

2.4.1 语法结构

DBMS_REDACT.ALTER_POLICY (
   object_schema          IN VARCHAR2 := NULL, 
   object_name            IN VARCHAR2 := NULL, 
   policy_name            IN VARCHAR2, 
   action                 IN BINARY_INTEGER := DBMS_REDACT.ADD_COLUMN,
   column_name            IN VARCHAR2 := NULL,
   function_type          IN BINARY_INTEGER := DBMS_REDACT.FULL,
   function_parameters    IN VARCHAR2 := NULL,
   expression             IN VARCHAR2 := NULL,
   regexp_pattern         IN VARCHAR2 := NULL,
   regexp_replace_string  IN VARCHAR2 := NULL,
   regexp_position        IN BINARY_INTEGER := NULL,
   regexp_occurrence      IN BINARY_INTEGER := NULL,
   regexp_match_parameter IN VARCHAR2 := NULL,
   policy_description     IN VARCHAR2 := NULL,
   column_description     IN VARCHAR2 := NULL);

2.4.2 示例

1)scott用户查看现有数据

SQL> select * from alen;



ID NAME EMAIL

---------- ---------- ------------------------------

1 Alen xxxx@qq.com

2 Lucy xxxx@163.com

2)sys用户执行修改数据编写策略

begin

dbms_redact.alter_policy(object_schema => 'scott',

object_name => 'ALEN',

column_name => 'name',

policy_name => 'redact_email',

function_type => dbms_redact.random,

expression => '1=1');

end;

3)scott用户查询,看到的是随机生成的字符串

SQL> select * from alen;



ID NAME EMAIL

---------- ---------- ------------------------------

1 KCGH xxxx@qq.com

2 PRLS xxxx@163.com

2.5 禁用数据编写策略

2.5.1 语法结构

如果不再使用数据编写策略了,可以使用下面的方法禁用:

DBMS_REDACT.DISABLE_POLICY (
   object_schema       IN VARCHAR2 DEFAULT NULL, 
   object_name         IN VARCHAR2, 
   policy_name         IN VARCHAR2);

2.5.2 示例

1)sys用户执行禁用数据编写策略

begin

dbms_redact.disable_policy(object_schema => 'scott',

object_name => 'ALEN',

policy_name => 'redact_email');

end;

2)scott用户查看效果,禁用后可以正常显示

SQL> select * from alen;



ID NAME EMAIL

---------- ---------- ------------------------------

1 Alen alen@qq.com

2 Lucy lucy@163.com

2.6 激活数据编写策略

2.6.1 语法结构

DBMS_REDACT.ENABLE_POLICY (
   object_schema       IN VARCHAR2 DEFAULT NULL, 
   object_name         IN VARCHAR2, 
   policy_name         IN VARCHAR2);

2.6.2 示例

1)sys用户执行激活数据编写策略

begin

dbms_redact.enable_policy(object_schema => 'scott',

object_name => 'ALEN',

policy_name => 'redact_email');

end;

2)scott用户查看效果,数据编写策略再次生效

SQL> select * from alen;



ID NAME EMAIL

---------- ---------- ------------------------------

1 ^$4D xxxx@qq.com

2 1_** xxxx@163.com

2.7 删除数据编写策略

如果数据编写策略不再需要了,也可以对其进行删除。

2.7.1 语法结构

DBMS_REDACT.DROP_POLICY (
   object_schema       IN VARCHAR2 DEFAULT NULL, 
   object_name         IN VARCHAR2,
   policy_name         IN VARCHAR2);

2.7.2 示例

1)sys用户执行删除数据编写策略

begin

dbms_redact.drop_policy(object_schema => 'scott',

object_name => 'ALEN',

policy_name => 'redact_email');

end;

2)scott用户查看效果,看到可以正常显示

SQL> select * from alen;



ID NAME EMAIL

---------- ---------- ------------------------------

1 Alen alen@qq.com

2 Lucy lucy@163.com

3 配置数据编写(Cloud Control行方式)

1)登录Cloud Control数据库主页

2)若需输入用户名密码,点击登录,新弹出的页面点击创建,如果是修改,可点击对应的按钮即可

3)填写数据编写策略,点击确定,或者继续点击下面的添加按钮添加列

4)选择添加策略的列以及编写模板,点击确定

5)回到上一个页面,点击显示SQL即可看对应的创建SQL语句

6)点击确定

7)对于表上的列的数据编写策略完成

8)Scott用户查看数据,数据已加密

SQL> select * from alen;



ID NAME EMAIL

---------- ---------- ------------------------------

1 Alen xxxx@qq.com

2 Lucy xxxx@163.com

4 数据编写策略相关的数据字典视图

4.1 redaction_columns

该视图展示数据编写策略对应的对象信息,包括表、列、数据编写类型等信息。

4.2 redaction_policies

该视图展示数据编写策略信息。

4.3 redaction_values_for_type_full

该视图展示当前数据库中使用全数据编写对应的数据编写策略的值。

 

posted @ 2020-05-07 23:17  追梦男生  阅读(425)  评论(0编辑  收藏  举报