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 [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]
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 [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]
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 [email protected]
2 Lucy [email protected]
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 [email protected]
2 1_** [email protected]
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 [email protected]
2 Lucy [email protected]
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 [email protected]
2 Lucy [email protected]
4 資料撰寫策略相關的資料字典視圖
4.1 redaction_columns
該視圖展示資料撰寫策略對應的物件資訊,包括表、列、資料撰寫型別等資訊,
4.2 redaction_policies
該視圖展示資料撰寫策略資訊,
4.3 redaction_values_for_type_full
該視圖展示當前資料庫中使用全資料撰寫對應的資料撰寫策略的值,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/2481.html
標籤:Oracle
上一篇:SpringMVC
下一篇:oracle快速向表插入大量資料
