Bài th c hành s 11ự ố ORACLE LABEL SECURITY (4) Tóm t t n i dung ắ ộ � Che d u c t thông tin chính sáchấ ộ � S d ng hàm gán nhãnử ụ � Các view c a OLSủ I M t s k thu t nâng cao trong OLSộ ố ỹ ậ A Lý[.]
Trang 1Bài th c hành s 11 ự ố
ORACLE LABEL SECURITY (4)
Che d u c t thông tin chính sách ấ ộ
S d ng hàm gán nhãn ử ụ Các view c a OLS ủ
I M t s k thu t nâng cao trong OLS ộ ố ỹ ậ
A. Lý thuy t ế
1 Che d u c t thông tin nhãn d li u ấ ộ ữ ệ
Đ tránh vi c hi n th c t ch a thông tin chính sách, ng ể ệ ể ị ộ ứ ườ i qu n tr có th thi t ả ị ể ế
l p tùy ch n HIDE khi gán chính sách cho b ng ậ ọ ả
M t khi chính sách đã đ ộ ượ c áp d ng, tr ng thái n/Không n c a c t không ụ ạ Ẩ Ẩ ủ ộ
th đ ể ượ c thay đ i tr khi ta remove chính sách kh i b ng v i tham s ổ ừ ỏ ả ớ ố DROP_COLUMN b ng TRUE. Sau đó chính sách có th đ ằ ể ượ c áp d ng l i v i ụ ạ ớ
tr ng thái m i ạ ớ
Khi ng ườ i dùng INSERT d li u vào b ng có tr ng thái n c t chính sách, giá ữ ệ ả ạ ẩ ộ
tr c a c t ch a nhãn s không b yêu c u ph i insert ị ủ ộ ứ ẽ ị ầ ả
Câu l nh SELECT * s không t đ ng tr v giá tr c a c t n, tr khi nó ệ ẽ ự ộ ả ề ị ủ ộ ẩ ừ
đ ượ c truy xu t tr c ti p ấ ự ế
Câu l nh DESCRIBE cũng s không hi n th thông tin c t n ệ ẽ ể ị ộ ẩ
2 Hàm gán nhãn
Có nh ng b ng d li u l n, ta không th ng i gán nhãn cho t ng tr ữ ả ữ ệ ớ ể ồ ừ ườ ng h p ợ OLS cung c p cho ta m t cách gán nhãn khác. Đó là s d ng m t hàm (function) ấ ộ ử ụ ộ
do mình hi n th c đ OLS s t đ ng gán nhãn m i khi có hàng m i đ ệ ự ể ẽ ự ộ ỗ ớ ượ c insert
Trang 2vào b ng d li u đ ả ữ ệ ượ c b o v Xem ph n th c hành đ hi u rõ h n v cách ả ệ ầ ự ể ể ơ ề
th c làm vi c này ứ ệ
Hàm gán nhãn s override 2 tùy ch n LABEL_DEFAULT và ẽ ọ LABEL_UPDATE.
B. Th c hành ự
1 Che d u c t thông tin chính sách ấ ộ
Do trong bài lab tr ướ c, ta đã áp d ng chính sách cho b ng mà không có tùy ch n ụ ả ọ HIDE nên trong b i lab này ta ph i remove chính sách (xóa luôn c t thông tin), ả ả ộ
th c hi n l i đo n code gán nhãn trong bài lab tr ự ệ ạ ạ ướ c và gán l i chính sách ạ
CONN sec_admin/secadmin;
BEGIN sa_policy_admin.remove_table_policy (policy_name => 'ACCESS_LOCATIONS', schema_name => 'HR',
table_name => 'LOCATIONS', drop_column => true);
END;
/ SELECT * FROM hr.locations;
Ta nh n th y lúc này c t OLS_COLUMN v n ch a b xóa dù Oracle báo th c ậ ấ ộ ẫ ư ị ự
hi n thành công th t c Lý do là khi remove chính sách, ta s xóa c t ệ ủ ụ ẽ ộ OLS_COLUMN, t c là đã thay đ i b ng Locations. Do v y ta c n c p thêm ứ ổ ả ậ ầ ấ quy n ALTER trên b ng Locations cho sec_admin đ c t OLS_COLUMN th t ề ả ể ộ ậ
s b xóa Bây gi ta gán l i chính sách trên đ th y s thay đ i sau khi ự ị ờ ạ ể ấ ự ổ sec_admin đ ượ c gán quy n ề
CONN sec_admin/secadmin;
BEGIN sa_policy_admin.apply_table_policy (policy_name => 'ACCESS_LOCATIONS', schema_name => 'HR',
table_name => 'LOCATIONS', table_options => 'NO_CONTROL');
Trang 3/ CONN system/system;
GRANT alter ON hr.locations TO sec_admin;
CONN sec_admin/secadmin;
BEGIN sa_policy_admin.remove_table_policy (policy_name => 'ACCESS_LOCATIONS', schema_name => 'HR',
table_name => 'LOCATIONS', drop_column => true);
END;
/ SELECT * FROM hr.locations;
Ta nh n th y bây gi c t OLS_COLUMN đã th t s đ ậ ấ ờ ộ ậ ự ượ c xóa.
Gán l i chính sách cho b ng v i NO_CONTROL và HIDE: ạ ả ớ
CONN sec_admin/secadmin;
BEGIN sa_policy_admin.apply_table_policy (policy_name => 'ACCESS_LOCATIONS', schema_name => 'HR',
table_name => 'LOCATIONS', table_options => 'HIDE,NO_CONTROL');
END;
/
Gán l i nhãn cho d li u trong b ng (do lúc remove đã xóa m t c t ch a thông ạ ữ ệ ả ấ ộ ứ tin chính sách):
CONN sec_admin/secadmin;
UPDATE hr.locations SET ols_column = char_to_label ('ACCESS_LOCATIONS', 'CONF');
Trang 4UPDATE hr.locations SET ols_column = char_to_label ('ACCESS_LOCATIONS', 'CONF::US')
WHERE country_id = 'US';
UPDATE hr.locations SET ols_column = char_to_label ('ACCESS_LOCATIONS', 'CONF::UK')
WHERE country_id = 'UK';
UPDATE hr.locations SET ols_column = char_to_label ('ACCESS_LOCATIONS', 'CONF::CA')
WHERE country_id = 'CA';
UPDATE hr.locations SET ols_column = char_to_label ('ACCESS_LOCATIONS', 'CONF:SM:UK,CA')
WHERE (country_id = 'CA' and city = 'Toronto')
or (country_id = 'UK' and city = 'Oxford');
UPDATE hr.locations SET ols_column = char_to_label ('ACCESS_LOCATIONS', 'CONF:HR:UK')
WHERE country_id = 'UK' and city = 'London';
UPDATE hr.locations SET ols_column = char_to_label ('ACCESS_LOCATIONS', 'SENS:HR,SM,FIN:CORP')
WHERE country_id = 'CH' and city = 'Geneva';
COMMIT ;
Ti p theo ta c n gán l i chính sách v i tùy ch n HIDE và READ_CONTROL: ế ầ ạ ớ ọ
Trang 5CONN sec_admin/secadmin;
BEGIN sa_policy_admin.remove_table_policy (policy_name => 'ACCESS_LOCATIONS', schema_name => 'HR',
table_name => 'LOCATIONS');
sa_policy_admin.apply_table_policy (policy_name => 'ACCESS_LOCATIONS', schema_name => 'HR',
table_name => 'LOCATIONS', table_options =>
'HIDE,READ_CONTROL,WRITE_CONTROL,CHECK_CONTROL');
END;
/
Bây gi ta th truy xu t b ng Locations: ờ ử ấ ả
CONN sec_admin/secadmin;
SELECT * FROM hr.locations;
DESCRIBE hr.locations;
K t qu c a dòng code SELECT là “no rows selected” Ch có câu l nh ế ả ủ ỉ ệ DESCRIBE có tr v k t qu Nguyên nhân là do bây gi b ng này đã đ ả ề ế ả ờ ả ượ c b o ả
v , ch nh ng ng ệ ỉ ữ ườ ượ ấ i đ c c p quy n OLS c th m i có th truy xu t. Ta log in ề ụ ể ớ ể ấ
l i b ng user SKING: ạ ằ
CONN sking/sking;
SELECT * FROM hr.locations;
SELECT label_to_char (ols_column) as label, locations.*
FROM hr.locations;
Ta th y trong câu l nh SELECT th 2, ta có ch đ nh rõ c t ols_column nên c t ấ ệ ứ ỉ ị ộ ộ này m i xu t hi n. Trong k t qu truy v n c a câu SELECT th nh t không có ớ ấ ệ ế ả ấ ủ ứ ấ
c t thông tin chính sách này ộ
Trang 62 Dùng hàm gán nhãn
Trong ph n th c hành này, ta s dùng b ng Employees c a schem HR đ minh ầ ự ẽ ả ủ ể
h a ọ
C p các quy n c n thi t cho sec_admin trên b ng Employees: ấ ề ầ ế ả
CONN system/system;
GRANT select, insert, update, alter
ON hr.employees TO sec_admin;
GRANT create procedure TO sec_admin;
CONN lbacsys/lbacsys GRANT execute ON to_lbac_data_label
TO sec_admin WITH GRANT OPTION;
Ti p theo ta vi t m t hàm gán nhãn d a trên đi u ki n c a thông tin nhân viên: ế ế ộ ự ề ệ ủ
CONN sec_admin/secadmin;
CREATE OR REPLACE FUNCTION sec_admin.gen_emp_label (Job varchar2, Depto number, Sal number) RETURN LBACSYS.LBAC_LABEL
AS i_label varchar2(80);
BEGIN /************* Xác định level *************/
IF Sal > 17000 THEN i_label := 'SENS:';
ELSIF Sal > 10000 THEN i_label := 'CONF:';
ELSE i_label := 'PUB:';
END IF;
/************* Xác định compartment *************/
IF Job LIKE '%HR%' THEN i_label := i_label||'HR:';
ELSIF (Job LIKE '%MK%') OR (Job LIKE '%SA%') THEN i_label := i_label||'SM:';
Trang 7ELSIF Job LIKE '%FI%' THEN i_label := i_label||'FIN:';
ELSE i_label := i_label||':';
END IF;
/************* Xác định groups *************/
i_label := i_label||'CORP';
RETURN TO_LBAC_DATA_LABEL('ACCESS_LOCATIONS',i_label); END;
/
Ta c n gán cho LBACSYS quy n th c thi trên hàm gán nhãn v a đ ầ ề ự ừ ượ ạ c t o:
CONN sec_admin/secadmin;
GRANT execute ON sec_admin.gen_emp_label TO lbacsys;
Ta ch đ nh th t c v a hi n th c làm hàm gán nhãn ỉ ị ủ ụ ừ ệ ự cho bảng Employees: CONN sec_admin/secadmin;
BEGIN SA_POLICY_ADMIN.APPLY_TABLE_POLICY ( policy_name => 'ACCESS_LOCATIONS', schema_name => 'HR',
table_name => 'EMPLOYEES', table_options =>
'READ_CONTROL,WRITE_CONTROL,CHECK_CONTROL', label_function => 'sec_admin.gen_emp_label
(:new.job_id,:new.department_id,:new.salary)'); END;
/
II Các view thông tin c a OLS ủ
Các thông tin v các chính sách c a OLS đ ề ủ ượ ư c l u trong data dictionary. Ta có
th xem các thông tin này thông qua các view c a OLS ể ủ
View DBA_SA_USERS: hi n th thông tin v t t c các chính sách có trong ể ị ề ấ ả CSDL.