Oracle 12c的高级安全特性包含Transparent Data Encryption(透明的数据加密)和Oracle Data Redaction(数据编写),通过这两个特性,可以对数据进行较高的安全控制,以防止非法的访问,上篇介绍了Transparent Data Encryption(透明的数据加密),本篇将对Oracle Data Redaction(数据编写)进行介绍和演示。
通过Oracle提供的数据编写特性,可以对应用程序执行的查询的结果进行屏蔽(编写),从而隐藏真实的数据。可以通过以下几种方法中的一种对列的数据进行编写:
通过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 |
删除数据编写策略 |
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.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列的值全部变为空格了,这是默认的数据编写策略,可以改变数据编写的值。
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
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 [email protected]
2 Lucy [email protected]
--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 [email protected]
2 Lucy [email protected]
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列,可以正常显示。
对于一张表而言,数据编写策略只能有一个,通过redaction_policies数据字典视图可以查看对应表的数据编写策略,如果在一张表上对多个列进行数据编写,则需要修改数据编写策略,不能再通过增加策略的方式。
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);
1)scott用户查看现有数据
SQL> select * from alen;
ID NAME EMAIL
---------- ---------- ------------------------------
1 Alen [email protected]
2 Lucy [email protected]
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 [email protected]
2 PRLS [email protected]
如果不再使用数据编写策略了,可以使用下面的方法禁用:
DBMS_REDACT.DISABLE_POLICY (
object_schema IN VARCHAR2 DEFAULT NULL,
object_name IN VARCHAR2,
policy_name IN VARCHAR2);
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 [email protected]
2 Lucy [email protected]
DBMS_REDACT.ENABLE_POLICY (
object_schema IN VARCHAR2 DEFAULT NULL,
object_name IN VARCHAR2,
policy_name IN VARCHAR2);
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 [email protected]
2 1_** [email protected]
如果数据编写策略不再需要了,也可以对其进行删除。
DBMS_REDACT.DROP_POLICY (
object_schema IN VARCHAR2 DEFAULT NULL,
object_name IN VARCHAR2,
policy_name IN VARCHAR2);
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 [email protected]
2 Lucy [email protected]
1)登录Cloud Control数据库主页
2)若需输入用户名密码,点击登录,新弹出的页面点击创建,如果是修改,可点击对应的按钮即可
3)填写数据编写策略,点击确定,或者继续点击下面的添加按钮添加列
4)选择添加策略的列以及编写模板,点击确定
5)回到上一个页面,点击显示SQL即可看对应的创建SQL语句
6)点击确定
7)对于表上的列的数据编写策略完成
8)Scott用户查看数据,数据已加密
SQL> select * from alen;
ID NAME EMAIL
---------- ---------- ------------------------------
1 Alen [email protected]
2 Lucy [email protected]
该视图展示数据编写策略对应的对象信息,包括表、列、数据编写类型等信息。
该视图展示数据编写策略信息。
该视图展示当前数据库中使用全数据编写对应的数据编写策略的值。