
Bài th c hành s 6ự ố
VIRTUAL PRIVATE DATABASE (1)
Tóm t t n i dung:ắ ộ
Gi i thi u v Virtual Private Databaseớ ệ ề
Row-level security
K thu t làm vi c v i policy functionỹ ậ ệ ớ
I. Gi i thi u chungớ ệ
Trong nhi u năm dài, vi c áp d ng các chính sách b o m t cho d li u n m trong cácề ệ ụ ả ậ ữ ệ ằ
b ng CSDL đc hi n th c b ng vi c s d ng view cùng v i các function. Tuy nhiênả ượ ệ ự ằ ệ ử ụ ớ
cách hi n th c này nhi u khi không th là m t gi i pháp th c t cho m c đích trên, đcệ ự ề ể ộ ả ự ế ụ ặ
bi t khi c n th c hi n b o m t ệ ầ ự ệ ả ậ ở m c đ “dòng d li u” (row-level security). Th yứ ộ ữ ệ ấ
đc nhu c u ngày càng cao c a ng i dùng, t Oracle Database 8.1.5, Oracle đã gi iượ ầ ủ ườ ừ ớ
thi u m t công ngh m i r t hi u qu là ệ ộ ệ ớ ấ ệ ả Virtual Private Database (t đây g i t t làừ ọ ắ
VPD).
VPD là s k t h p c a 2 k thu t:ự ế ợ ủ ỹ ậ
Fine-grained access control (FGAC): cho phép ng i qu n tr dùng các function đườ ả ị ể
hi n th c các chính sách b o m t và liên k t các chính sách b o m t đó v i các table,ệ ự ả ậ ế ả ậ ớ
view ho c synonym. Vi c gán các chính sách nh v y khi n cho nh ng ng i dùngặ ệ ư ậ ế ữ ườ
v i quy n h n khác nhau s th y đc nh ng “khung nhìn” khác nhau đi v i điớ ề ạ ẽ ấ ượ ữ ố ớ ố
t ng đc b o v . Vi c gi i h n khung nhìn này s trong su t đi v i m i ng iượ ượ ả ệ ệ ớ ạ ẽ ố ố ớ ọ ườ
dùng. Đng th i chính sách b o m t đó s đc áp d ng cho b t k user nào truyồ ờ ả ậ ẽ ượ ụ ấ ỳ
xu t đn table đó mà không c n ng i qu n tr ph i gán chính sách cho t ng user.ấ ế ầ ườ ả ị ả ừ
Đi u này khi n các chính sách b o m t đc hi n th c b ng FGAC d qu n lý h nề ế ả ậ ượ ệ ự ằ ễ ả ơ
khi hi n th c b ng view.ệ ự ằ
Chương Trình Đào Tạo Từ Xa KH & KT Máy Tính – Đại học Bách Khoa TP.HCM

Application Context: cung c p m t n i l u tr b o m t cho nh ng giá tr ng c nhấ ộ ơ ư ữ ả ậ ữ ị ữ ả
ng d ng. S d ng Application Context s nâng cao hi u qu th c hi n c a FGACứ ụ ử ụ ẽ ệ ả ự ệ ủ
(trong ch ng trình chúng ta không h c v Application-context).ươ ọ ề
L u ýư : b i vì đây là 1 ph ng pháp hi u qu và ph bi n đ hi n th c vi c b o m t ở ươ ệ ả ổ ế ể ệ ự ệ ả ậ ở
m c dòng d li u trong Oracle, nên ng i ta th ng dùng thu t ng ứ ữ ệ ườ ườ ậ ữ Row-level security
(RLS) đ thay cho ểFine-grained access control ho c ặVirtual Private Database.
II. Row-level Security
A. Lý thuy tế
1. Row-level Security
Row-level security (RLS) cho phép gi i h n vi c truy xu t các hàng (record)ớ ạ ệ ấ
d a trên m t chính sách b o m t (security policy) đc hi n th c b ng PL/SQL.ự ộ ả ậ ượ ệ ự ằ
M t chính sách b o m t mô t các quy đnh qu n lý vi c truy xu t các dòng dộ ả ậ ả ị ả ệ ấ ữ
li u.ệ
2. C ch th c hi nơ ế ự ệ
Đ th c hi n RLS, đu tiên ta t o 1 hàm PL/SQL (PL/SQL function) tr vể ự ệ ầ ạ ả ề
m t chu i (string). Chu i string này ch a các đi u ki n c a chính sách b o m tộ ỗ ỗ ứ ề ệ ủ ả ậ
mà ta mu n hi n th c.ố ệ ự
Hàm PL/SQL v a đc t o trên sau đó đc đăng ký cho các table, view màừ ượ ạ ở ượ
ta mu n b o v b ng cách dùng package PL/SQL DBMS_RLS.ố ả ệ ằ
Khi có m t câu truy v n c a b t k user nào trên đi t ng đc b o v ,ộ ấ ủ ấ ỳ ố ượ ượ ả ệ
Oracle s n i chu i đc tr v t hàm nêu trên vào m nh đ WHERE c a câuẽ ố ỗ ượ ả ề ừ ệ ề ủ
l nh SQL ban đu (n u trong câu l nh SQL ban đu không có m nh đ WHEREệ ầ ế ệ ầ ệ ề
thì Oracle s t đng t o thêm m nh đ WHERE đ đa chu i đi u ki n vào),ẽ ự ộ ạ ệ ề ể ư ỗ ề ệ
nh đó s l c đc các hàng d li u theo các đi u ki n c a chính sách b o m t.ờ ẽ ọ ượ ữ ệ ề ệ ủ ả ậ
Chương Trình Đào Tạo Từ Xa KH & KT Máy Tính – Đại học Bách Khoa TP.HCM

3. Các l u ý khi làm vi c v i RLSư ệ ớ
Các hàm PL/SQL đc đăng ký cho các table, view hay synonym b ng cách g iượ ằ ọ
th t c DBMS_RLS.ADD_POLICY.ủ ụ
Th t c ADD_POLICY đòi h i ít nh t ph i có 3 tham s nh p vào:ủ ụ ỏ ấ ả ố ậ
object_name, policy_name, policy_function. (Mô t chi ti t c a packageả ế ủ
DBMS_RLS đc ch a trong fileượ ứ
th _m c_cài_đt_Oracle\Oracle\RDBMS\ADMIN\dbmsrlsa.sql).ư ụ ặ
S k t h p c a object_schema, object_name, và policy_name ph i là duy nh t.ự ế ợ ủ ả ấ
M c đnh, policy s đc áp d ng cho t t c các l nh DML. Ng i qu n tr cóặ ị ẽ ượ ụ ấ ả ệ ườ ả ị
th dùng tham s STATEMENT_TYPES đ ch ra policy áp d ng cho lo i câuể ố ể ỉ ụ ạ
l nh nào.ệ
B t c khi nào 1 user truy xu t m t cách tr c ti p hay gián ti p vào đi t ngấ ứ ấ ộ ự ế ế ố ượ
đc b o v , RLS engine s đc g i m t cách trong su t, hàm PL/SQL đã đăngượ ả ệ ẽ ượ ọ ộ ố
ký s đc th c thi, và r i l nh SQL c a user s đc ch nh s a và th c thi.ẽ ượ ự ồ ệ ủ ẽ ượ ỉ ử ự
Tuy nhiên, account SYS không b nh h ng b i b t k chính sách b o m tị ả ưở ở ấ ỳ ả ậ
nào.
Nhi u policy cũng có th áp d ng cho cùng 1 đi t ng. Khi đó CSDL s k tề ể ụ ố ượ ẽ ế
h p t t c các policy đó l i v i nhau theo phép AND.ợ ấ ả ạ ớ
Quy n s d ng package DBMS_RLS không đc gán cho m i ng i dùng.ề ử ụ ượ ọ ườ
Nh ng ng i qu n tr c n đc gán quy n EXECUTE ON DBMS_RLS đ cóữ ườ ả ị ầ ượ ề ể
th s d ng đc nó.ể ử ụ ượ
T t c các policy function mà ta t o ra đu ph i có đúng 2 tham s truy n vào.ấ ả ạ ề ả ố ề
Tham s đu tiên là tên c a schema s h u đi t ng mà chính sách RLS đó b oố ầ ủ ở ữ ố ượ ả
v . Tham s th hai là tên c a đi t ng đc b o v . Hai tham s này r t h uệ ố ứ ủ ố ượ ượ ả ệ ố ấ ữ
ích vì 1 policy function có th đc áp d ng cho nhi u đi t ng khác nhau trongể ượ ụ ề ố ượ
nhi u schema khác nhau. Tên c a các tham s có th đc đt tho i mái nh ngề ủ ố ể ượ ặ ả ư
th t c a 2 tham s ph i tuân th theo th t trên. Các tham s s đc dùngứ ự ủ ố ả ủ ứ ự ố ẽ ượ
đ xác đnh đi t ng nào mà chính sách đó đc g i cho nó. Ki u c a 2 thamể ị ố ượ ượ ọ ể ủ
s truy n vào và c a giá tr tr v ph i là ki u VARCHAR2.ố ề ủ ị ả ề ả ể
Chương Trình Đào Tạo Từ Xa KH & KT Máy Tính – Đại học Bách Khoa TP.HCM

Policy function c n đc t o ra trong schema c a ng i qu n tr b o m t.ầ ượ ạ ủ ườ ả ị ả ậ
Đi u này quan tr ng vì vi c truy xu t vào các policy function c n đc b o v .ề ọ ệ ấ ầ ượ ả ệ
Các user khác không nên có quy n th c thi hay quy n alter ho c quy n drop trênề ự ề ặ ề
các policy function này.
Đ hi n th c đc các chính sách b o m t ph c t p m t cách hi u qu , thôngể ệ ự ượ ả ậ ứ ạ ộ ệ ả
th ng ng i ta s d ng k t h p RLS v i Application Context. Nh đó các chínhườ ườ ử ụ ế ợ ớ ờ
sách b o m t s đc áp d ng theo các đi u ki n linh ho t h n (ví d : áp d ngả ậ ẽ ượ ụ ề ệ ạ ơ ụ ụ
chính sách b o m t nào là d a trên ng i dùng thu c Department s m y). Trongả ậ ự ườ ộ ố ấ
ch ng trình th c hành c a chúng ta không h c v Application Context, sinh viênươ ự ủ ọ ề
t tìm hi u thêm v v n đ 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

B. Th c hànhự
Gi s ta có m t chính sách b o m t (security policy) quy đnh không m tả ử ộ ả ậ ị ộ
ng i dùng nào đc truy xu t đn các record thu c Department có deptno là 10ườ ượ ấ ế ộ
trong b ng EMP thu c schema c a user SCOTT. Đ chính sách này có th áp d ngả ộ ủ ể ể ụ
cho CSDL, đu tiên ta c n t o 1 PL/SQL function có chu i tr v là đi u ki n c aầ ầ ạ ỗ ả ề ề ệ ủ
chính sách b o m t trên:ả ậ
sec_mgr@KNOX10g> CREATE OR REPLACE FUNCTION no_dept10 (
p_schema IN VARCHAR2,
p_object IN VARCHAR2)
RETURN VARCHAR2
AS
BEGIN
RETURN 'deptno != 10';
END;
/
Function created.
Sau khi t o function hi n th c chính sách b o m t, ta c n đăng ký function đóạ ệ ự ả ậ ầ
cho đi t ng mà chính sách đó mu n b o v b ng cách dùng th t cố ượ ố ả ệ ằ ủ ụ
ADD_POLICY trong package DBMS_RLS.
sec_mgr@KNOX10g> BEGIN
DBMS_RLS.add_policy
(object_schema => 'SCOTT',
object_name => 'EMP',
policy_name => 'quickstart',
policy_function => 'no_dept10');
END;
/
PL/SQL procedure successfully completed.
Hai b c hi n th c chính sách b o m t v a trình bày trên nên đc th cướ ệ ự ả ậ ừ ở ượ ự
hi n b iệ ở account ch u trách nhi m v qu n lý b o m t (trong ví d này và c các víị ệ ề ả ả ậ ụ ả
d khác trong bài lab, account ch u trách nhi m qu n lý b o m t là ụ ị ệ ả ả ậ sec_mgr).
Chương Trình Đào Tạo Từ Xa KH & KT Máy Tính – Đại học Bách Khoa TP.HCM