【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包含的過程以下: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

刪除數據編寫策略

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

該視圖展現當前數據庫中使用全數據編寫對應的數據編寫策略的值。

相關文章
相關標籤/搜索