Oracle 12c的高級安全特性包含Transparent Data Encryption(透明的數據加密)和Oracle Data Redaction(數據編寫),經過這兩個特性,能夠對數據進行較高的安全控制,以防止非法的訪問,上篇介紹了Transparent Data Encryption(透明的數據加密),本篇將對Oracle Data Redaction(數據編寫)進行介紹和演示。正則表達式
1 數據編寫概述經過Oracle提供的數據編寫特性,能夠對應用程序執行的查詢的結果進行屏蔽(編寫),從而隱藏真實的數據。能夠經過如下幾種方法中的一種對列的數據進行編寫:數據庫
經過Oracle提供的程序包DBMS_REDACT,能夠建立數據編寫策略,指定必須知足哪些條件後才能對數據進行編寫並將其返回給用戶,定義此類策略期間,DBA能夠指定必須對哪些列應用何種類型的保護。DBMS_REDACT包含的過程以下:express
存儲過程安全 |
描述信息dom |
DBMS_REDACT.ADD_POLICYide |
在表或視圖上增長數據編寫策略測試 |
DBMS_REDACT.ALTER_POLICY加密 |
修改數據編寫策略spa |
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 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
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 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
若是再也不使用數據編寫策略了,可使用下面的方法禁用:
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 alen@qq.com 2 Lucy lucy@163.com
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 xxxx@qq.com 2 1_** xxxx@163.com
若是數據編寫策略再也不須要了,也能夠對其進行刪除。
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 alen@qq.com 2 Lucy lucy@163.com3 配置數據編寫(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.com4 數據編寫策略相關的數據字典視圖
該視圖展現數據編寫策略對應的對象信息,包括表、列、數據編寫類型等信息。
該視圖展現數據編寫策略信息。
該視圖展現當前數據庫中使用全數據編寫對應的數據編寫策略的值。