Oracle Data Redaction實驗記錄

huangxuemail發表於2016-06-27
Oracle從11.2.0.4以後新增了資料校訂作為一個新的安全特性。Oracle Data Redaction(Oracle資料校訂),它提供了一個有效且易於實現的方法來遮蔽敏感資訊。該工具能夠實時地從資料校訂得出的查詢結果會返回到它們原來的應用程式。當你想要隱藏一個欄位的所有值或部分值,但同時還要為使用者提供他們需要的資訊的時候,Data Redaction便有了用武之地。諸如社會保險號,信用卡號和客戶端IP地址之類的個人標識未經許可是不能釋出的。通過允許你隱藏個人資訊並同時仍允許訪問關
鍵檔案,Data Redaction將幫助你遵循法規和行業標準,同時保證不中斷業務的正常流程。

下面以TT.DEPT表為例,對DNAME列進行data redaction,這意味著除了TT自己,其它使用者在對tt.dept表進行查詢時將看不會看到真實資料(當然這不包括SYS及SYSTEM使用者),以下是我的操作記錄:

登入Cloud Control 12c,選擇測試資料庫-->Security-->Data Redaction

在Data Redaction頁面中點選Create按鈕,新建一個Data Redaction Policies

這裡我選擇對TT.DEPT表進行data redaction. 在策略中我寫入的是該策略對非TT使用者生效。


點選上面的Edit按鈕後,選擇ADD新增DNAME列。

點選OK按鈕以後,Data Redaction Policy就建立好了,下面通過查詢具體驗證下效果。


--TT使用者登入後可以檢視真實的資料
TT@BWC2(dm02db02)> show user
USER is "TT"
TT@BWC2(dm02db02)> select * from tt.dept;

DEPTNO DNAME LOC
---------- ---------- --------------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON

--T2使用者登入後,雖然對tt.dept表有查詢許可權,但他看到的DNAME列卻為空,並不是真實的資料。
SYS@BWC2(dm02db02)> conn t2/t2
Connected.
SYS@BWC2(dm02db02)> select * from tt.dept;

DEPTNO DNAME   LOC
---------- ----------     --------------------
10                           NEW YORK
20                           DALLAS
30                           CHICAGO
40                           BOSTON


如果沒有Cloud Control 12c的環境,還是通過PLSQL方式來管理data redaction的,下面是一些記錄:
--有關data redaction的幾個檢視
REDACTION_COLUMNS
REDACTION_POLICIES
REDACTION_VALUES_FOR_TYPE_FULL


create table employee(id number,name varchar2(10),salary number,jobdate date,mobile varchar2(20));
insert into employee values(1,'tom',6000,to_date('01-07-2012','dd-mm-yyyy'),'135-2009-1146');
insert into employee values(2,'mary',9000,to_date('01-07-2013','dd-mm-yyyy'),'135-2009-1111');
commit;
select * from employee;

--針對NUMBER型別的列進行redaction
begin 
dbms_redact.add_policy(
object_schema=>'tt',
object_name=>'employee',
policy_name=>'p1',
column_name=>'salary',
function_type=>dbms_redact.full,
enable=>true,
expression=>'1=1');
end;
/

--針對varchar2型別的列進行redaction
begin 
dbms_redact.alter_policy(
object_schema=>'tt',
object_name=>'employee',
policy_name=>'p1',
column_name=>'name',
action=>dbms_redact.add_column,
function_type=>dbms_redact.full,
expression=>'1=1');
end;
/

--針對date型別的列進行redaction
begin 
dbms_redact.alter_policy(
object_schema=>'tt',
object_name=>'employee',
policy_name=>'p1',
column_name=>'jobdate',
action=>dbms_redact.add_column,
function_type=>dbms_redact.full,
expression=>'1=1');
end;
/

--新增一條策略,使不是TT的使用者檢視該表時資料被redaction
begin 
dbms_redact.alter_policy(
object_schema=>'tt',
object_name=>'employee',
policy_name=>'p1',
action=>dbms_redact.modify_expression,
expression=>'SYS_CONTEXT(''USERENV'',''SESSION_USER'') != ''TT''');
end;
/

刪除遮罩保護策略 
EXEC DBMS_REDACT.DROP_POLICY('TT','EMPLOYEE','p1'); 
啟用遮罩保護策略 
EXEC DBMS_REDACT.ENABLE_POLICY ('TT','EMPLOYEE','p1');
禁用遮罩保護策略 
EXEC DBMS_REDACT.DISABLE_POLICY ('TT','EMPLOYEE','p1');

--通過授予以下許可權達到訪問真實資料目的

SQL> grant exempt redaction policy to user1;
Grant succeeded.

SQL> revoke exempt redaction policy from user1;
Revoke succeeded.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26753337/viewspace-2121057/,如需轉載,請註明出處,否則將追究法律責任。

相關文章