2014年8月21日 星期四

Oracle 12c - Data Redaction



在11G要遮蔽 Table 欄位時,需要建立 View 來讓 User 無法看到某些欄位的機密資料,現在12C有個新功能叫" Data Redaction ",無須建立View只要下指令就可以達到遮蔽的效果,這個功能只在用戶端進行資料遮蔽並不會引響原來的資料。

就像以下這樣

原本

新增限制後

這樣具有隱私性的資料就會被遮蔽起來,只顯示後面的數字

*要注意的是User 擁有 EXP_FULL_DATABASE 以及 DBA 權限時,遮蔽則無效 


這個功能是使用 DBMS_REDACT 包來做管理
ADD_POLICY: Add a redaction policy to a table.
DROP_POLICY: Remove a redaction policy from a table.
ALTER_POLICY: Change a redaction policy.
ENABLE_POLICY: Enable a redaction policy after it is disabled.
DISABLE_POLICY: Disable a redaction policy.


對於資料遮蔽,Oracle 提供了很多種遮蔽效果,以下來一一做示範


先建立測試Table 

SQL> CREATE TABLE test.test_Redaction
  2  (
  3    t_id     NUMBER,
  4    t_name   VARCHAR2(50),
  5    t_add    VARCHAR2(50),
  6    t_phone  VARCHAR2(50),
  7    t_time   DATE
  8  )
  9  ;

已建立表格.

SQL> INSERT INTO TEST_REDACTION VALUES (101,'jimmy','senior program','7458-9658-3256',sysdate);

已建立 1 個資料列.

SQL> INSERT INTO TEST_REDACTION VALUES (102,'mike','general man','1236-6541-3214',sysdate);

已建立 1 個資料列.

SQL> INSERT INTO TEST_REDACTION VALUES (103,'eva','assistant','3574-1596-9856',sysdate);

已建立 1 個資料列.

SQL>

SQL> select * from test_redaction;

      T_ID T_NAME     T_ADD           T_PHONE         T_TIME
---------- ---------- --------------- --------------- -------------------
       101 jimmy      senior program  7458-9658-3256  2014-08-21 02:15:52
       102 mike       general man     1236-6541-3214  2014-08-21 02:17:12 
       103 eva        assistant       3574-1596-9856  2014-08-21 02:17:13





進行第一個遮蔽效果 "full",對於文字類型欄位顯示出來為空白,對於日期類型欄位顯示為2001-01-01,對於數字類型欄位顯式為0

BEGIN
DBMS_REDACT.ADD_POLICY (
   object_schema          => 'TEST',
   object_name            => 'TEST_REDACTION',
   policy_name            => 'TEST_POLICY',
   column_name            => 'T_ADD',
   function_type          => DBMS_REDACT.FULL,
   expression             => '1=1',
   enable                 => TRUE
   );
END;
/


SQL> select * from test.test_redaction;

      T_ID T_NAME     T_ADD           T_PHONE         T_TIME
---------- ---------- --------------- --------------- -------------------
       101 jimmy                      7458-9658-3256  2014-08-21 02:15:52
       102 mike                       1236-6541-3214  2014-08-21 02:17:12
       103 eva                        3574-1596-9856  2014-08-21 02:17:13



第二個效果是"PARTIAL",可以自訂function_parameters參數來顯示出我們指定的樣式



BEGIN
DBMS_REDACT.ALTER_POLICY (
   object_schema          => 'TEST',
   object_name            => 'TEST_REDACTION',
   policy_name            => 'TEST_POLICY',
   column_name            => 'T_PHONE',
   action                 => DBMS_REDACT.MODIFY_COLUMN,
   function_type          => DBMS_REDACT.PARTIAL,
   function_parameters    => 'VVVVFVVVVFVVVV,VVVV-VVVV-VVVV,*,1,6'   --*為替代得文字,從第1個文字開始到第6個文字都遮蔽
   );
END;
/


SQL> select * from test.test_redaction;

      T_ID T_NAME     T_ADD           T_PHONE         T_TIME
---------- ---------- --------------- --------------- -------------------
       101 jimmy                      ****-**58-3256  2014-08-21 02:15:52
       102 mike                       ****-**41-3214  2014-08-21 02:17:12
       103 eva                        ****-**96-9856  2014-08-21 02:17:13

SQL>

要為數字類型遮蔽時,替代符號只能使用1-9

數字範例
BEGIN
DBMS_REDACT.ALTER_POLICY (
   object_schema          => 'TEST',
   object_name            => 'TEST_REDACTION',
   policy_name            => 'TEST_POLICY',
   column_name            => 'T_ID',
   action                 => DBMS_REDACT.ADD_COLUMN,
   function_type          => DBMS_REDACT.PARTIAL,
   function_parameters    => '1,1,5'   
   );
END;

/

日期範例
BEGIN
dbms_redact.alter_policy (
   object_schema          => 'TEST',
   object_name            => 'TEST_REDACTION',
   policy_name            => 'TEST_POLICY',                         
   column_name           => 'T_TIME',
   action                => dbms_redact.MODIFY_COLUMN,
   function_type          => DBMS_REDACT.PARTIAL,
   function_parameters   => 'Md15y2010HMS',                          
   expression            => '1=1');
END;

/

Md15y2010HMS > 顯示出來的日期一率為15 ,年一率為2010 ,前面的英文小寫才有效果

MDYHMS > 月日年時分秒 , 此為固定格式



第三個效果是"RANDOM",對於文字與數字會變成具有相同長度的隨機文字與數字,對於日期會變成隨機日期,上述說的隨機都不會與原來的相同

BEGIN
DBMS_REDACT.ALTER_POLICY (
   object_schema          => 'TEST',
   object_name            => 'TEST_REDACTION',
   policy_name            => 'TEST_POLICY',
   column_name            => 'T_PHONE',
   action                 => DBMS_REDACT.MODIFY_COLUMN,
   function_type          => DBMS_REDACT.RANDOM
   );
END;
/


SQL> select * from test.test_redaction;

      T_ID T_NAME     T_ADD           T_PHONE         T_TIME
---------- ---------- --------------- --------------- -------------------
      101 jimmy      senior program  >*}$Y5n_F2&,a=  2014-08-21 02:15:52
      102 mike       general man     x.eIMi:A!6mQUq  2014-08-21 02:17:12
    103 eva        assistant       *`"*PE#g2h*2XM  2014-08-21 02:17:13


SQL>


第四種是"REGEXP"使用 正規表達式是來規範


Data Redaction 功能還可以設定只對哪些 User 進行遮蔽

BEGIN
DBMS_REDACT.ALTER_POLICY (
   object_schema          => 'TEST',
   object_name            => 'TEST_REDACTION',
   policy_name            => 'TEST_POLICY',
   column_name            => 'T_PHONE',
   action                 => DBMS_REDACT.MODIFY_EXPRESSION,
   expression             => 'SYS_CONTEXT ( ''USERENV'',''SESSION_USER'' ) = ''jimmy''');
END;
/

對於jimmy這個User進行遮蔽,其他User則可以看到全部內容



取消欄位的遮蔽

BEGIN
DBMS_REDACT.ALTER_POLICY (
   object_schema          => 'TEST',
   object_name            => 'TEST_REDACTION',
   policy_name            => 'TEST_POLICY',
   column_name            => 'T_ADD',
   action                 => DBMS_REDACT.MODIFY_COLUMN,
   function_type          => DBMS_REDACT.NONE
   );
END;
/


新增其他欄位的遮蔽

BEGIN
DBMS_REDACT.ALTER_POLICY (
   object_schema          => 'TEST',
   object_name            => 'TEST_REDACTION',
   policy_name            => 'TEST_POLICY',
   column_name            => 'T_NAME',
   action                 => DBMS_REDACT.ADD_COLUMN,
   function_type          => DBMS_REDACT.FULL
);
END;
/


刪除Table的遮蔽

BEGIN
   DBMS_REDACT.DROP_POLICY (
   object_schema          => 'CHECK_DB',
   object_name            => 'TEST_REDACTION',
   policy_name            => 'TEST_POLICY');
END;
/




資料的遮蔽對於 where 的條件有無影響?!

原始資料
SQL> select * from test.test_redaction;

      T_ID T_NAME          T_ADD           T_PHONE         T_TIME
---------- --------------- --------------- --------------- -------------------
       101 jimmy           senior program  7458-9658-3256  2014-08-21 02:15:52
       102 mike            general man     1236-6541-3214  2014-08-21 02:17:12
       103 eva             assistant       3574-1596-9856  2014-08-21 02:17:13


對遮蔽後的資料進行select


SQL> select * from test.test_redaction where t_id =101;


      T_ID T_NAME     T_ADD           T_PHONE         T_TIME
---------- ---------- --------------- --------------- -------------------
       111 jimmy      senior program  7458-9658-3256  2014-08-21 02:15:52


SQL> select * from test.test_redaction where t_id =102;

      T_ID T_NAME     T_ADD           T_PHONE         T_TIME
---------- ---------- --------------- --------------- -------------------
       111 mike       general man     1236-6541-3214  2014-08-21 02:17:12


由此可以判斷資料在處理後,在客戶端這邊才進行遮蔽。



可以對利用create table select * from  方式把資料複製出去?!

SQL> create table test100 as select * from test.test_redaction;
create table test100 as select * from test.test_redaction
                               *
 ERROR 在行 1:
ORA-28081: 權限不足 - 命令參照隱匿的物件.


--刪除遮蔽policy

BEGIN
   DBMS_REDACT.DROP_POLICY (
   object_schema          => 'TEST',
   object_name            => 'TEST_REDACTION',
   policy_name            => 'TEST_POLICY');
END;
/


SQL> create table test100 as select * from  test.test_redaction;

已建立表格.

SQL>


在我們刪除policy後才能複製表格,很顯然的並不能用這種方式把資料複製出去。









沒有留言:

張貼留言