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

1 数据编写概述

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

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
  • 完全编写:保护列的所有内容,返回值的类型取决于列的数据类型,对于数据值,返回值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数据库主页

【12c】Oracle 12c Data Redaction 数据编写 Oracle 第1张

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

【12c】Oracle 12c Data Redaction 数据编写 Oracle 第2张

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

【12c】Oracle 12c Data Redaction 数据编写 Oracle 第3张

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

【12c】Oracle 12c Data Redaction 数据编写 Oracle 第4张

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

【12c】Oracle 12c Data Redaction 数据编写 Oracle 第5张

6)点击确定

【12c】Oracle 12c Data Redaction 数据编写 Oracle 第6张

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

【12c】Oracle 12c Data Redaction 数据编写 Oracle 第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

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

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄