ự
ố
Bài th c hành s 7
VIRTUAL PRIVATE DATABASE (2)
ắ ộ
Tóm t
t n i dung:
(cid:0) Quy n ề EXEMPT ACCESS POLICY
(cid:0) Giám sát quy n ề EXEMPT ACCESS POLICY
(cid:0) ử ề X lý các Exception v Policy Function
(cid:0) Column Sensitive VPD
ề
I. Quy n EXEMPT ACCESS POLICY
A. Lý thuy tế
ậ ấ ố ậ ả ấ ư ế ẫ ộ ỹ Tuy RLS cung c p m t k thu t b o m t r t t t, nh ng nó cũng d n đ n m t s ộ ự
ữ ệ ự ụ ụ ụ ệ ả ị ị khó ch u khi th c hi n các tác v qu n tr CSDL (ví d : tác v backup d li u). Nh ư
ế ả ườ ủ ủ ố ượ ể đã bi t, ngay c các DBA và ng i ch c a các đ i t ng đó cũng không th tránh
ượ ế ả ậ ườ ộ ả ủ ủ ặ ộ đ c các chính sách b o m t. N u ng i ch c a m t b ng nào đó ho c m t DBA
ữ ệ ủ ả ự ệ ả ậ ẫ th c hi n backup d li u c a b ng đó trong khi các chính sách b o m t trên nó v n
ữ ệ ụ ể ẽ ế ấ ộ có tác d ng, r t có th file backup s không có d li u nào h t. Vì lý do này (và m t
ữ ề ấ ố s lý do khác n a), Oracle cung c p quy n EXEMPT ACCESS POLICY. Ng ườ i
ượ ẽ ượ ấ ỏ ấ ả ễ ườ đ ề c c p quy n này s đ c mi n kh i t t c các function RLS. Ng ả i qu n tr ị
ả ằ ụ ự ể ả ệ ệ ề ầ ấ ả CSDL có nhi m v th c hi n backup c n có quy n này đ đ m b o r ng t t c các
ạ ữ ệ ẽ ượ d li u s đ c backup l i.
ự B. Th c hành
Ví d sau s minh h a vi c c p quy n này và nh h
ệ ấ ụ ẽ ề ả ọ ưở ủ ng c a nó trên các function
system@KNOX10g> CONN system/manager
Connected.
RLS:
Chương Trình Đào Tạo Từ Xa
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM
system@KNOX10g> -- SYSTEM bị ảnh hưởng bởi các policy function
system@KNOX10g> -- Nên không có record nào được delete
system@KNOX10g> DELETE FROM scott.emp;
0 rows deleted.
system@KNOX10g> -- Cấp quyền để SYSTEM kg bị ảnh hưởng bởi
policy function
system@KNOX10g> GRANT EXEMPT ACCESS POLICY TO SYSTEM;
Grant succeeded.
system@KNOX10g> -- SYSTEM không còn bị ảnh hưởng bởi các policy
function
system@KNOX10g> -- Tất cả các record bị xóa
system@KNOX10g> DELETE FROM scott.emp;
14 rows deleted.
system@KNOX10g> ROLLBACK;
ề
II. Giám sát quy n EXEMPT ACCESS POLICY
A. Lý thuy tế
ụ ể ộ ề ấ ạ ỉ ị Do đây là quy n r t m nh, không ch đ nh trên c th m t schema hay object nào nên
ệ ầ ẩ ả ọ ượ ắ ữ ề ta c n c n tr ng trong vi c qu n lý xem ai đ c phép n m gi ặ quy n này. M c
ữ ề ẽ ề ị đ nh, nh ng user có các quy n SYSDBA s có quy n này (account SYS)
ể ả ượ ấ ệ ạ ụ ề ề ỏ Ta không th ngăn c n các user đ c c p quy n kh i vi c l m d ng quy n đ ượ c
ể ề ọ ớ ỉ ượ ấ ấ c p. Ta ch có th theo dõi xem h làm gì v i quy n đ ộ c c p đó. Auditing là m t
ả ể ả ệ ề ễ ả ừ ỏ cách hi u qu đ đ m b o quy n mi n tr ị ạ kh i các chính sách RLS không b l m
ẽ ượ ỹ ơ ề ụ d ng. Auditing s đ c trình bày k h n trong các bài lab v Auditing sau này. Trong
ẽ ặ ầ ế ể ề ị ph n này s m c đ nh là sinh viên đã bi ể ọ t và hi u v auditing. Sinh viên có th đ c
ọ ề ầ ạ l i ph n này sau khi h c v Auditing.
Chương Trình Đào Tạo Từ Xa
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM
ự B. Th c hành
ể ể ượ ề ấ ằ Ta có th ki m tra xem ai đ c c p quy n EXEMPT ACCESS POLICY b ng câu
ệ l nh sau:
Chương Trình Đào Tạo Từ Xa
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM
sec_mgr@KNOX10g> SELECT grantee
FROM dba_sys_privs
WHERE PRIVILEGE = 'EXEMPT ACCESS POLICY';
GRANTEE
------------------------------
SYSTEM
ụ ụ ẽ ể ệ ồ ờ ỗ ề Ví d sau s trình bày cách đ audit quy n này. Đ ng th i m i khi áp d ng vi c này,
sec_mgr@KNOX10g> -- Audit quyền EXEMPT ACCESS POLICY
sec_mgr@KNOX10g> AUDIT EXEMPT ACCESS POLICY BY ACCESS;
Audit succeeded.
sec_mgr@KNOX10g> -- Kiểm tra việc audit bằng cách thực hiện tác
sec_mgr@KNOX10g> -- vụ trong account người được cấp quyền
sec_mgr@KNOX10g> CONN system/manager
Connected.
system@KNOX10g> DELETE FROM scott.emp;
14 rows deleted.
system@KNOX10g> -- Rollback để undo lệnh delete
system@KNOX10g> -- Lệnh Rollback sẽ không xóa được audit record
mà Oracle
system@KNOX10g> -- vừa tạo ra khi SYSTEM thực hiện lệnh DELETE
system@KNOX10g> ROLLBACK ;
Rollback complete.
system@KNOX10g> CONN sec_mgr/oracle10g
Connected.
sec_mgr@KNOX10g> -- Hiển thị tác vụ vừa được audit
sec_mgr@KNOX10g>
BEGIN
ệ ể ầ ượ ự ư ệ ta cũng c n ki m tra xem vi c audit đã đ ư c th c hi n nh mình nghĩ ch a.
Chương Trình Đào Tạo Từ Xa
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM
FOR rec IN (SELECT * FROM dba_audit_trail)
LOOP
DBMS_OUTPUT.put_line ('-------------------------');
DBMS_OUTPUT.put_line ('Who: ' || rec.username);
DBMS_OUTPUT.put_line ('What: ' || rec.action_name
|| ' on ' || rec.owner
|| '.' || rec.obj_name);
DBMS_OUTPUT.put_line ('When: '
|| TO_CHAR(rec.TIMESTAMP,'MM/DD HH24:MI'));
DBMS_OUTPUT.put_line ('How: "'|| rec.sql_text || '"');
DBMS_OUTPUT.put_line ('Using: ' || rec.priv_used);
END LOOP;
END;
/
-------------------------
Who: SYSTEM
What: DELETE on SCOTT.EMP
When: 04/04 14:22
How: "DELETE FROM scott.emp"
Using: DELETE ANY TABLE
-------------------------
Who: SYSTEM
What: DELETE on SCOTT.EMP
When: 04/04 14:22
How: "DELETE FROM scott.emp"
Using: EXEMPT ACCESS POLICY
PL/SQL procedure successfully completed.
ử ụ ự ể ề ở ị ệ ệ Audit trail hi n th 2 record b i vì SYSTEM đã s d ng 2 quy n khi th c hi n l nh
ứ ề ề ấ DELETE. Quy n th nh t là quy n DELETE ANY TABLE cho phép delete trên t ấ t
ứ ề ề ả ả c các b ng. Quy n th hai là quy n EXEMPT ACCESS POLICY cho phép không b ị
ả ưở ậ ượ ả ờ ặ ả nh h ng b i chính sách b o m t đ c áp đ t cho b ng EMP.
Chương Trình Đào Tạo Từ Xa
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM
ử
ề
III. X lý các Exception v Policy Function
A. Lý thuy tế
ị ấ ạ ể ạ ộ ế Nói chung có 2 lo i error có th khi n cho m t chính sách RLS b th t b i:
Policy function không h p l
ợ ệ ượ ự cho nên nó không đ ụ c recompile và th c thi. Ví d ,
ẽ ả ồ ạ ế ấ ộ ỗ ề ỗ l i này s x y ra khi policy truy v n đ n m t table không t n t i. L i v chính
ể ả ồ ạ ế ệ ườ sách cũng có th x y ra n u policy function không t n t i (vi c này th ng do
ặ ượ ị policy function đã b drop ho c nó đã đ ủ ụ c đăng ký không đúng trong th t c
ADD_POLICY).
Chu i tr v c a policy function khi đ
ỗ ả ề ủ ượ ệ ấ c thêm vào câu l nh SQL truy v n trên
ượ ả ỗ ợ ệ ệ ề ấ ố ượ đ i t ng đ ệ c b o v gây ra l i câu l nh SQL không h p l . Có r t nhi u lý do
ế ả ệ khi n cho vi c này x y ra.
ự B. Th c hành
ạ ỗ ố ủ ứ ể ạ ấ Trong 2 lo i l ấ i trên, lo i th nh t có th làm m t đi tính trong su t c a VPD. Ta
scott@KNOX10g> -- Tạo ra table sẽ được gọi bởi policy function
scott@KNOX10g> CREATE TABLE t AS SELECT * FROM DUAL;
Table created.
scott@KNOX10g> -- Tạo ra policy function phụ thuộc vào table t
scott@KNOX10g> CREATE OR REPLACE FUNCTION pred_function (
p_schema IN VARCHAR2 DEFAULT NULL,
p_object IN VARCHAR2 DEFAULT NULL)
RETURN VARCHAR2
AS
l_total_recs NUMBER;
BEGIN
SELECT COUNT (*) INTO l_total_recs
FROM t;
RETURN '1 <= ' || l_total_recs;
END;
/
Function created.
ụ ướ xem ví d d i đây:
Chương Trình Đào Tạo Từ Xa
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM
scott@KNOX10g> CONN sec_mgr/oracle10g
Connected.
sec_mgr@KNOX10g> -- Gán policy function trên cho bảng EMP;
sec_mgr@KNOX10g> BEGIN
DBMS_RLS.add_policy
(object_schema => 'SCOTT',
object_name => 'EMP',
policy_name => 'debug',
function_schema => 'SCOTT',
policy_function => 'pred_function');
END;
/
PL/SQL procedure successfully completed.
sec_mgr@KNOX10g> CONN scott/tiger
Connected.
scott@KNOX10g> SELECT COUNT(*) FROM emp;
COUNT(*)
----------
14
ệ ố ứ ề ậ ầ ấ ọ Ta nh n th y m i th ban đ u đ u làm vi c t t:
scott@KNOX10g> DROP TABLE t;
Table dropped.
scott@KNOX10g> -- Policy function không hợp lệ và không được
recompile
scott@KNOX10g> SELECT COUNT(*) FROM emp;
SELECT COUNT(*) FROM emp
*
ERROR at line 1:
ORA-28110:policy function/package SCOTT.PRED_FUNCTION has error
ế ẽ ả ị ỗ Tuy nhiên, n u b ng T b xóa đi thì s có l i sinh ra:
Chương Trình Đào Tạo Từ Xa
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM
Đ s a l
ể ử ỗ ạ ệ ả ằ ỉ ầ i trên ta ch c n recover l ệ i vi c xóa b ng b ng l nh Flashback Drop. Khi
scott@KNOX10g> -- Phục hồi bảng
scott@KNOX10g> FLASHBACK TABLE t TO BEFORE DROP;
Flashback complete.
scott@KNOX10g> SELECT COUNT(*) FROM emp;
COUNT(*)
----------
14
ẽ ượ ự ủ ệ ả ậ ụ ồ đó vi c th c thi c a chính sách b o m t cũng s đ c ph c h i:
ụ ề ấ ấ ượ Tuy nhiên, trong ví d trên, v n đ chúng ta quan tâm là khi câu truy v n đ ự c th c
ệ ả ị ướ ụ ồ ả ệ ượ ự ệ hi n sau khi b ng T b xóa và tr c khi vi c ph c h i b ng T đ c th c hi n. Khi
ẽ ư ỗ ỉ ạ ị ỗ ấ đó CSDL s đ a ra l i và có ch ra chính xác t i sao câu truy v n b l i. Thông báo
ể ấ ư ạ ộ tuy r t có ích đ ta bi ế ượ ỗ ả c l i x y ra do đâu nh ng nó l t đ i làm l ạ 2 thông tin nh y
ườ ườ ế ứ ấ ằ ỉ ả c m mà ng i dùng bình th ng không nên bi ộ t. Th nh t là nó ch ra r ng có m t
ứ ả ậ ế ủ ả chính sách b o m t trên table đó. Th hai nó cho bi ậ t tên c a chính sách b o m t
ệ ả b o v table đó.
ừ ệ ể ấ ầ ấ T đó xu t hi n nhu c u che d u các exception do policy function gây ra đ không
ạ ả ể ị ườ ế ậ ố ấ ấ hi n th các thông tin nh y c m cho ng i dùng th y. Cách ti p c n t t nh t cho yêu
ử ụ ấ ộ ộ ố ầ c u này là s d ng 1 câu SQL đ ng (dynnamic SQL) che d u các ràng bu c trên đ i
ẽ ẫ ệ ả ộ ị ượ t ng CSDL. Policy function s v n ph i return ra m t giá tr vì vi c return null s ẽ
ể ẫ ớ ệ ườ ấ ế ấ ả có th d n t i vi c cho phép ng i dùng truy xu t đ n t t c các record. Function
ử ế ỗ ả ượ ả ề ụ ầ c n x lý sao cho n u có l i x y ra thì không có record nào đ c tr v . Ví d sau
ọ minh h a cho cách làm này:
Chương Trình Đào Tạo Từ Xa
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM
scott@KNOX10g> CREATE OR REPLACE FUNCTION pred_function (
p_schema IN VARCHAR2 DEFAULT NULL,
p_object IN VARCHAR2 DEFAULT NULL)
RETURN VARCHAR2
AS
l_total_recs NUMBER;
BEGIN
-- Câu SQL động để che dấu sự phụ thuộc trên T
EXECUTE IMMEDIATE 'SELECT COUNT (*) FROM t'
INTO l_total_recs;
RETURN '1 <= ' || l_total_recs;
EXCEPTION
WHEN OTHERS THEN
-- Loại bỏ tất các record khi chính sách bảo mật không
-- thực hiện được
RETURN '1=0';
END;
/
Function created.
scott@KNOX10g> SELECT COUNT(*) FROM emp;
COUNT(*)
----------
14
scott@KNOX10g> DROP TABLE t;
Table dropped.
scott@KNOX10g> -- Chính sách bảo mật bị lỗi. Không có record nào
scott@KNOX10g> -- được trả về và không có thông báo lỗi nào được
scott@KNOX10g> -- đưa ra cho user
scott@KNOX10g> SELECT COUNT(*) FROM emp;
COUNT(*)
----------
0
Chương Trình Đào Tạo Từ Xa
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM
IV.
Column Sensitive VPD
A.
Lý thuy tế
Oracle Database 10g cung c p thêm 1 tính năng m i cho VPD g i là Column Sensitive
ấ ớ ọ
ụ ủ ự ệ ả ậ ộ ầ VPD. M c đích c a tính năng này là th c hi n các chính sách b o m t khi c t c n
ệ ượ ả ả b o v đ c tham kh o.
ự
B.
Th c hành
Gi
ả ử ủ ệ ả ả ộ ộ ị s ta có m t chính sách b o v trên b ng EMP c a SCOTT quy đ nh m t user có
ể ấ ấ ả ạ ừ ươ ủ ữ th th y t t c các thông tin c a nh ng nhân viên khác ngo i tr l ủ ọ ng c a h . Khi
ỉ ượ ự ệ ầ ậ ả ộ ị đó ta c n hi n th c 1 chính sách b o m t trên EMP quy đ nh m t user ch đ c truy
ấ ế ủ ả ườ ệ ế ấ xu t đ n record c a b n thân ng ả i đó n u trong câu l nh truy xu t có tham kh o
sec_mgr@KNOX10g> CREATE OR REPLACE FUNCTION user_only (
p_schema IN VARCHAR2 DEFAULT NULL,
p_object IN VARCHAR2 DEFAULT NULL)
RETURN VARCHAR2
AS
BEGIN
-- Giả sử username của các account
-- chính là username được lưu trong bảng EMP
RETURN 'username = user’;
END;
/
Function created.
ế ộ đ n c t salary:
Chương Trình Đào Tạo Từ Xa
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM
sec_mgr@KNOX10g> BEGIN
DBMS_RLS.add_policy
(object_schema => 'SCOTT',
object_name => 'EMP',
policy_name => 'people_sel_sal',
function_schema => 'SEC_MGR',
policy_function => 'user_only',
statement_types => 'SELECT',
sec_relevant_cols => 'SALARY');
END;
/
PL/SQL procedure successfully completed.
scott@KNOX10g> -- Người dùng có thể thấy tất cả các record khi
scott@KNOX10g> -- salary không được truy vấn.
scott@KNOX10g> -- Câu lệnh sau chỉ xuất 5 record đầu tiên
scott@KNOX10g> SELECT username FROM emp
WHERE ROWNUM <= 5;
USERNAME
----------
SMITH
ALLEN
WARD
JONES
MARTIN
scott@KNOX10g> -- Thêm cột salary vào câu truy vấn, chính sách
scott@KNOX10g> -- bảo mật được áp dụng
scott@KNOX10g> SELECT username, salary FROM emp;
USERNAME SALARY
---------- ----------
SCOTT 3000
ạ ụ ệ ể Ki m tra l i vi c áp d ng chính sách trên:
Chương Trình Đào Tạo Từ Xa
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM
Có m t nhu c u th c t
ự ế ầ ộ ườ ả ố ị ườ là ng i qu n tr mong mu n cho dù ng i dùng có tham
ế ộ ượ ả ả ả ề ẽ ứ ầ ủ ệ ế ư ả ố kh o đ n c t đ c b o v , k t qu tr v s ch a đ y đ các record gi ng nh khi
ị ủ ộ ế ộ ả ở ữ ượ ả không có tham kh o đ n c t đó và các giá tr c a c t đó nh ng record đ c b o v ệ
ữ ệ ả ề ề ị ỉ ườ ẽ s có giá tr null. Đi u này không ch giúp cho d li u tr v cho ng i dùng đ ượ c
ố ố ớ ậ ở ủ ườ ả ầ đ y đ mà còn giúp cho chính sách b o m t tr nên trong su t đ i v i ng i dùng.
ượ ọ ế ậ Cách ti p c n này đ c g i là “column masking”.
ụ ế ề ấ ả ợ ế ộ Xét ti p ví d trên. Đi u ta mong đ i là khi trong câu truy v n có tham kh o đ n c t
ấ ả ề ấ ỏ ượ ả ề ị ạ ộ salary, t t c các record th a câu truy v n đ u đ c tr v và giá tr t i c t salary
sec_mgr@KNOX10g> BEGIN
-- Xóa chính sách hiện tại
DBMS_RLS.drop_policy
(object_schema => 'SCOTT',
object_name => 'EMP',
policy_name
=> 'people_sel_sal');
-- Thêm lại chính sách với thay đổi ở
-- tham số SEC_RELEVANT_COLS_OPT
DBMS_RLS.add_policy
(object_schema
=> 'SCOTT',
object_name
=> 'EMP',
policy_name
=> 'people_sel_sal',
function_schema => 'SEC_MGR',
policy_function => 'user_only',
statement_types => 'SELECT',
sec_relevant_cols => 'SALARY',
sec_relevant_cols_opt
=>
DBMS_RLS.all_rows);
END;
/
PL/SQL procedure successfully completed.
scott@KNOX10g> SELECT username, salary FROM emp
WHERE deptno = 20;
ữ ủ ẽ ị ủ c a nh ng record c a các user khác s có giá tr null.
Chương Trình Đào Tạo Từ Xa
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM
USERNAME SALARY
----------
----------
SMITH
JONES
SCOTT 3000
ADAMS
FORD
ụ ư ể ệ ố ỉ L u ý: tham s sec_relevant_cols_opt ch có th áp d ng cho câu l nh select.
V. Bài t pậ
1.
ậ ở ệ ả ự ố Hoàn thi n chính sách b o m t ể ả bài th c hành s 6 (HolidayControl) đ đ m
ộ ộ ẽ ạ ả ả ả ả b o khi exception x y ra s không b c l ậ ủ thông tin nh y c m c a chính sách b o m t
2.
này.
ử ạ ỉ ậ ở ả ượ Ch nh s a l i chính sách b o m t câu 1, cho phép Annu xem đ c các thông
3.
ư ả ỉ ượ ỉ ủ tin trong b ng Holiday nh ng ch xem đ c ngày ngh c a chính mình.
ừ ở ế ậ ề ả ưở T chính sách HolidayControl câu 2, thi t l p quy n không nh h ng và
ả ự ố ớ ộ ố ự ả đ m b o s giám sát đ i v i chính sách này cho user Hann. Th c thi m t s thay đ i d ổ ữ
ệ ế ả li u và xem k t qu .