Bài thực hành Bảo mật hệ thống thông tin - Bài thực hành số 6: Virtual Private Database (1)

Bảo Mật Hệ Thống Thông Tin  
Lab 6  
1
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ể 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ả 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 hơn khi hiện thực bằng  
view.  
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).  
Chương Trình Đào Tạo Từ Xa  
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM  
Bảo Mật Hệ Thống Thông Tin  
Lab 6  
2
Lưu ý: bởi đây là 1 phương pháp hiệu quả 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 tả các quy định quản 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.  
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.  
Chương Trình Đào Tạo Từ Xa  
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM  
Bảo Mật Hệ Thống Thông Tin  
Lab 6  
3
Mặc định, policy sẽ được áp dụng cho tất cả các lệnh DML. Người quản trị 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 sẽ  
được thực thi, và rồi lệnh SQL của user sẽ được chỉnh sửa 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 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 để thể sử dụng  
được nó.  
Tất cả các policy function mà ta tạo ra đều phải đú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ố 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 kiểu VARCHAR2.  
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 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ảo Mật Hệ Thống Thông Tin  
Lab 6  
4
Chương Trình Đào Tạo Từ Xa  
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM  
Bảo Mật Hệ Thống Thông Tin  
Lab 6  
5
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ề đ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  
object_name  
=> 'SCOTT',  
=> 'EMP',  
policy_name  
=> 'quickstart',  
=> 'no_dept10');  
policy_function  
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 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 bảo mật 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  
Bảo Mật Hệ Thống Thông Tin  
Lab 6  
6
Để kiểm tra xem chính sách này có làm việc không, ta lần lượt log on vào các account  
sec_mgr và SCOTT truy xuất bảng EMP bằng một lệnh DML. Câu lệnh sau sẽ yêu cầu  
hiển thị ra tất cả các Department có trong bảng. Tuy nhiên, cho dù log on vào account  
nào ta cũng sẽ thấy rằng các Department có deptno bằng 10 sẽ không xuất hiện trong  
kết quả câu truy vấn, bởi vì chính sách RLS đã tự động lọc ra những record đó.  
sec_mgr@KNOX10g> SELECT DISTINCT deptno FROM scott.emp;  
DEPTNO  
----------  
20  
30  
scott@KNOX10g> SELECT DISTINCT deptno FROM emp;  
DEPTNO  
----------  
20  
30  
Một ưu điểm của RLS nữa là ta có thể thay đổi nội dung của 1 chính sách bảo mật bằng  
cách viết lại function hiện thực chính sách đó mà không cần phải đăng lại chính sách  
đó cho đồi tượng cần bảo vệ. Để thấy được ưu điểm này, ta trở lại với dụ trên, thay  
đổi nội dung của function no_dept10:  
sec_mgr@KNOX10g> CREATE OR REPLACE FUNCTION no_dept10 (  
p_schema IN VARCHAR2,  
p_object IN VARCHAR2)  
RETURN VARCHAR2  
AS  
BEGIN  
RETURN 'USER != ''SCOTT''';  
END;  
/
Function created.  
Chính sách vừa được sửa đổi quy định không cho người dùng SCOTT truy xuất nội  
dung của bảng được bảo vệ (USER là một hàm của Oracle trả về tên người dùng hiện  
Chương Trình Đào Tạo Từ Xa  
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM  
Bảo Mật Hệ Thống Thông Tin  
Lab 6  
7
tại của session đó). Ta kiểm tra lại xem việc áp dụng chính sách đã được thay đổi chưa  
bằng cách lần lượt log on vào hệ thống bằng 2 account sec_mgr, SCOTT và truy xuất  
bảng EMP:  
sec_mgr@KNOX10g> SELECT COUNT(*) Total_Records FROM scott.emp;  
TOTAL_RECORDS  
-------------  
14  
scott@KNOX10g> SELECT COUNT(*) Total_Records FROM emp;  
TOTAL_RECORDS  
-------------  
0
Sau khi tạo các policy function, ta có thể kiểm tra chuỗi trả về của function vửa tạo  
bằng cách thực hiện câu lệnh sau:  
sec_mgr@KNOX10g> col predicate format a50;  
sec_mgr@KNOX10g> SELECT no_dept10 ('SCOTT','EMP') predicate  
FROM DUAL;  
PREDICATE  
--------------------------------------------------  
USER != 'SCOTT'  
Nếu trong câu lệnh tạo policy function ta quy định các tham số có giá trị mặc định là  
null thì câu lệnh để kiểm tra chuỗi trả về vửa nêu trên có thể được viết ngắn gọn lại:  
sec_mgr@KNOX10g> CREATE OR REPLACE FUNCTION no_dept10 (  
p_schema IN VARCHAR2 DEFAULT NULL,  
p_object IN VARCHAR2 DEFAULT NULL)  
RETURN VARCHAR2  
AS  
BEGIN  
RETURN 'deptno != 10';  
END;  
/
Chương Trình Đào Tạo Từ Xa  
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM  
Bảo Mật Hệ Thống Thông Tin  
sec_mgr@KNOX10g> col predicate format a50;  
Lab 6  
8
sec_mgr@KNOX10g> SELECT no_dept10 predicate FROM DUAL;  
PREDICATE  
--------------------------------------------------  
USER != 'SCOTT'  
Giả sử ta có chính sách bảo mật quy định các user chỉ được insert và update trên các  
dòng dữ liệu của các Department có deptno < 4. Policy function được hiện thực như  
sau:  
sec_mgr@KNOX10g> CREATE OR REPLACE FUNCTION dept_less_4 (  
p_schema IN VARCHAR2 DEFAULT NULL,  
p_object IN VARCHAR2 DEFAULT NULL)  
RETURN VARCHAR2  
AS  
BEGIN  
RETURN 'deptno < 4';  
END;  
/
Function created.  
sec_mgr@KNOX10g>BEGIN  
DBMS_RLS.add_policy  
(object_schema  
object_name  
=> 'SCOTT',  
=> 'EMP',  
policy_name  
=> 'EMP_IU',  
=> 'SEC_MGR',  
=> 'dept_less_4',  
=> 'INSERT,UPDATE',  
=> TRUE);  
function_schema  
policy_function  
statement_types  
update_check  
END;  
/
Tên chính sách (policy_name) nên mô tả mục đích sử dụng của policy function 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ảo Mật Hệ Thống Thông Tin  
Lab 6  
9
(trong ví dụ này tên chính sách là EMP_IU chỉ ra rằng chính sách được áp dụng cho  
bảng EMP đối với các tác vụ Insert, Update). Tương tự, việc chọn tên policy_function  
cũng cần phải gợi nhớ rằng function đó trả về cái gì.  
Tham số update_check là tham số tùy chọn cho các loại lệnh INSERT và UPDATE. Nó  
có giá trị mặc định là FALSE. Nếu update_check có giá trị TRUE, sau khi câu lệnh  
SQL đã được chỉnh sửa theo điều kiện của chính sách bảo mật được thực thi, Oracle  
sẽ thực hiện việc kiểm tra lại các giá trị vừa được UPDATE/INSERT xem nó có vi  
phạm chính sách bảo mật không. Nếu có vi phạm thì việc thực thi câu lệnh SQL đó sẽ  
thất bại và thông báo lỗi sẽ được xuất ra. Điều này sẽ được thấy ở phần tiếp theo.  
Ta kiểm tra việc áp dụng chính sách bảo mật trên. Đầu tiên ta SELECT trên bảng EMP  
một số record, ta nhận thấy rằng ràng buộc ‘deptno < 4’ không ảnh hưởng đối với câu  
lệnh SELECT:  
scott@KNOX10g> SELECT username, deptno  
FROM emp WHERE username < 'C';  
USERNAME  
DEPTNO  
---------- ----------  
ALLEN  
BLAKE  
ADAMS  
1
2
6
Tiếp theo ta update trên bảng EMP lần lượt ở record có deptno bằng 1 và deptno bằng 6  
sẽ được kết quả như sau:  
scott@KNOX10g> UPDATE emp  
SET username = 'GRIZZLY'  
WHERE username = 'ALLEN';  
1 row updated.  
scott@KNOX10g> UPDATE emp  
SET username = 'BOZO'  
WHERE username = 'ADAMS';  
0 rows updated.  
Chương Trình Đào Tạo Từ Xa  
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM  
Bảo Mật Hệ Thống Thông Tin  
Lab 6 10  
Lưu ý rằng sẽ không có lỗi nào được xuất ra cho câu lệnh update thứ hai. Vì không có  
dòng nào trong bảng thỏa đồng thời điều kiện của câu lệnh SQL trên và điểu kiện được  
đưa ra trong chính sách bảo mật nên không có hàng nào được update. Tuy nhiên, nếu ta  
thực hiện câu lệnh sau thì sẽ có thông báo lỗi xuất hiện:  
scott@KNOX10g> UPDATE emp  
SET deptno = 6  
WHERE username = 'BLAKE';  
update emp  
*
ERROR at line 1:  
ORA-28115: policy with check option violation  
Trong câu lệnh trên, đầu tiên Oracle tìm được 1 hàng thỏa điều kiện username =  
'BLAKE' và điều kiện của chính sách bảo mật là deptno < 4 nên nó sẽ thực hiện việc  
update. Nhưng do ta đã thiết lập tham số update_check = TRUE nên Oracle sẽ kiểm tra  
những giá trị vừa được update và nhận thấy rằng giá trị vừa được update vi phạm chính  
sách bảo mật deptno < 4 (câu lệnh trên đã thay đổi giá trị deptno thành 6 > 4). Do có vi  
phạm này nên câu lệnh update trên bị thất bại và có thông báo lỗi xuất hiện. Nếu  
update_check = FALSE thì câu lệnh update vừa rồi sẽ được thực thi thành công (nghĩa  
là deptno của BLAKE sẽ có giá trị là 6).  
Ta kiểm tra tiếp trường hợp khi ta INSERT vào bảng EMP:  
scott@KNOX10g> INSERT INTO emp (username, deptno)  
VALUES ('KNOX',1);  
1 row created.  
scott@KNOX10g> INSERT INTO emp (username, deptno)  
VALUES ('ELLISON',5);  
insert into emp(username,deptno)  
*
ERROR at line 1:  
ORA-28115: policy with check option violation  
Tương tự như trường hợp khi ta kiểm tra với các lệnh Update, tác vụ insert 1 record có  
Chương Trình Đào Tạo Từ Xa  
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM  
Bảo Mật Hệ Thống Thông Tin  
Lab 6 11  
deptno >= 4 bị thất bại và sinh ra lỗi. Tác vụ này thất bại do vi phạm policy function và  
do ta đã thiết lập UPDATE_CHECK=TRUE khi gọi thủ tục ADD_POLICY. Nếu ta  
không thiết lập TRUE, việc insert trên sẽ thành công (nghĩa sẽ có thêm 1 dòng có  
deptno = 5 được tạo ra).  
III. Kỹ thuật làm việc với policy function  
A. Lý thuyết  
Một trong những cách hiệu quả nhất để ngăn không cho bất kỳ record nào bị truy xuất  
bằng phương pháp RLS là tạo ra 1 policy function có chuỗi trả về chứa một điều kiện  
nào đó mà không bao giờ thể xảy ra (ví dụ: chuỗi “1 = 0”). Cần lưu ý rằng trả về 1  
chuỗi null hoặc chuỗi độ dài bằng 0 thì sẽ cho kết quả ngược lại: tất cả các record sẽ  
được phép truy xuất.  
B. Thực hành  
Sẽ rất lợi nếu ta tạo một policy function có tác dụng ngăn chặn tất cả các record. Mỗi  
khi cần khóa lại một bảng nào đó một cách nhanh chóng ta có thể sử dụng nó:  
sec_mgr@KNOX10g> CREATE OR REPLACE FUNCTION no_records (  
p_schema IN VARCHAR2 DEFAULT NULL,  
p_object IN VARCHAR2 DEFAULT NULL)  
RETURN VARCHAR2  
AS  
BEGIN  
RETURN '1=0';  
END;  
/
Function created.  
Đây cũng một cách giúp ta có thể biến một bảng thành bảng chỉ được phép đọc  
(Read Only table). Ta chỉ cần đăng ký policy function trên cho bảng đó với lựa chọn áp  
dụng cho các câu lệnh INSERT, UPDATE, DELETE:  
Chương Trình Đào Tạo Từ Xa  
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM  
Bảo Mật Hệ Thống Thông Tin  
Lab 6 12  
sec_mgr@KNOX10g> BEGIN  
DBMS_RLS.add_policy  
(object_schema  
object_name  
=> 'SCOTT',  
=> 'EMP',  
policy_name  
=> 'PEOPLE_RO_IUD',  
=> 'SEC_MGR',  
=> 'No_Records',  
=>  
function_schema  
policy_function  
statement_types  
'INSERT,UPDATE,DELETE',  
update_check  
=> TRUE);  
END;  
/
PL/SQL procedure successfully completed.  
Kiểm tra lại việc áp dụng chính sách bảo mật trên:  
scott@KNOX10g> SELECT COUNT (*) FROM emp;  
COUNT(*)  
----------  
14  
scott@KNOX10g> -- Không thể update bất kỳ record nào  
scott@KNOX10g> UPDATE emp SET username = NULL;  
0 rows updated.  
scott@KNOX10g> -- Không thể delete bất kỳ record nào  
scott@KNOX10g> DELETE FROM emp;  
0 rows deleted.  
scott@KNOX10g> -- Không thể insert thêm bất kỳ record nào  
scott@KNOX10g> INSERT INTO emp (username) VALUES ('KNOX');  
INSERT INTO emp (username) VALUES ('KNOX')  
*
ERROR at line 1:  
ORA-28115: policy with check option violation  
Chương Trình Đào Tạo Từ Xa  
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM  
Bảo Mật Hệ Thống Thông Tin  
Lab 6 13  
Để xóa bỏ việc 1 chính sách bảo mật đã được đăng ký cho một table/view, ta dùng thủ  
tục DROP_POLICY của package DBMS_RLS. Ví dụ:  
sec_mgr@KNOX10g> BEGIN  
DBMS_RLS.drop_policy  
(object_schema  
object_name  
policy_name  
=> 'SCOTT',  
=> 'EMP',  
=> 'debug');  
END;  
/
PL/SQL procedure successfully completed.  
IV. Bài tập  
Tạo cấu trúc bảng sau:  
EMPHOLIDAY  
( EmpNo  
Name  
NUMBER(5),  
VARCHAR2(60),  
DATE )  
Holiday  
EmpNo  
Name  
---------  
Han  
Holiday  
---------  
---------  
1
2/1/2010  
12/5/2010  
26/8/2009  
2
An  
3
Thu  
Xây dựng một policy HolidayControl cho các trường hợp sau đây:  
1.  
2.  
3.  
An chỉ được xem và chỉnh sửa thông tin cá nhân của riêng mình.  
Thu không được xem hay chỉnh sửa bất kỳ thông tin nào.  
Han được quyền xem tất cả các thông tin nhưng chỉ chỉnh sửa (Insert, Update, Delete)  
được Holiday nào mà ngày lớn hơn hay bằng ngày hiện tại (không chỉnh sửa được ngày quá  
khứ).  
Ghi chú:  
Chương Trình Đào Tạo Từ Xa  
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM  
Bảo Mật Hệ Thống Thông Tin  
Lab 6 14  
1/ Giả thiết trường Name có các dữ liệu phân biệt nhau và tương ứng với Username trong hệ  
thống.  
2/ Schema chứa đối tượng cần được bảo vệ là SCOTT.  
3/ Schema chứa policy function được sử dụng 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  
docx 14 trang yennguyen 08/04/2022 3800
Bạn đang xem tài liệu "Bài thực hành Bảo mật hệ thống thông tin - Bài thực hành số 6: Virtual Private Database (1)", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • docxbai_thuc_hanh_bao_mat_he_thong_thong_tin_bai_thuc_hanh_so_6.docx