Tài liệu thực hành Bảo mật hệ thống thông tin - Bài thực hành số 10: Oracle Label Security (Phần 3)
Tóm tắt nội dung:
• Các loại nhãn người dùng
• Các quyền đặc biệt trên chính sách
• Các điều kiện áp dụng chính sách
• Áp dụng chính sách cho bảng
I. Các loại nhãn người dùng
A. Lý thuyết
Trong bài Lab 8 - Oracle Label Security (1), ở phần I.A.4, chúng ta đã nhắc đến quy trình cơ bản để xây dựng một chính sách OLS. Theo đó:
B4: Gán chính sách trên cho các table hoặc schema mà bạn muốn bảo vệ.
B5: Gán các giới hạn quyền, các nhãn người dùng hoặc các quyền truy xuất đặc biệt cho những người dùng liên quan.
Thứ tự của 2 bước trên như vậy là hợp lý, vì trong OLS, khi một chính sách được chỉ định bảo vệ cho một bảng/schema, kể từ thời điểm đó bất kỳ người dùng nào cũng không thể truy xuất vào bảng/schema đó trừ khi được gán cho các nhãn người dùng (user label) thích hợp hoặc được cấp những quyền đặc biệt đối với chính sách đó.
Tuy nhiên, để hiểu được tác dụng của các tùy chọn áp dụng chính sách ở bước 4, ta cần phải hiểu về các ràng buộc đối với người dùng khi truy xuất các bảng và schema được bảo vệ. Do vậy, để việc tìm hiểu về OLS được dễ dàng hơn, trong bài lab này sẽ tạm hoán đổi thứ tự tìm hiểu và thực hiện của bước 4 và bước 5. Khi đã hiểu và biết cách hiện thực một chính sách OLS, các bạn hãy thực hiện các bước theo đúng thứ tự của nó để đảm bảo tính bảo mật và toàn vẹn cho dữ liệu .
1. Nhãn người dùng (user label)
Tại mỗi thời điểm, mỗi người dùng đều có một nhãn gọi là nhãn người dùng (user lable). Nhãn này có tác dụng cho biết mức độ tin cậy của người dùng đối với những dữ liệu được chính sách đó bảo vệ. Nhãn người dùng cũng gồm các thành phần giống như nhãn dữ liệu. Khi một người dùng truy xuất trên bảng được bảo vệ, nhãn người dùng sẽ được so sánh với nhãn dữ liệu của mỗi dòng trong bảng để quyết định những dòng nào người dùng đó có thể truy xuất được. Hình bên dưới minh họa mối quan hệ tương ứng của user label và data label.
Trang 1
Trang 2
Trang 3
Trang 4
Trang 5
Trang 6
Trang 7
Trang 8
Trang 9
Trang 10
Tải về để xem bản đầy đủ
Tóm tắt nội dung tài liệu: Tài liệu thực hành Bảo mật hệ thống thông tin - Bài thực hành số 10: Oracle Label Security (Phần 3)
loại nhãn này, nó sẽ lấy giá trị bằng giá trị của max_read_label. min_write_label: nhãn thể hiện mức truy xuất thấp nhất đối với tác vụ đọc. Nhãn này chỉ chứa level thấp nhất (min_level) của người dùng đó, không chứa bất kỳ compartment và group nào. def_read_label: là session label mặc định cho các tác vụ đọc của người dùng. Nó là tập con của max_read_label. Nếu người quản trị không thiết lập giá trị cho loại nhãn này, nó sẽ lấy giá trị bằng giá trị của max_read_label. def_write_label: là session label mặc định cho tác vụ write của người dùng. Nó là tập con của def_read_label (có level bằng level của def_read_label; chứa tất cả các compartment và group mà người dùng có quyền viết trong def_read_label). Giá trị của nhãn này sẽ được tính một cách tự động bởi OLS từ giá trị của def_read_label. Nói cách khác, người quản trị sẽ không mô tả giá trị cho nhãn này. row_label: nhãn mặc định dùng để gán nhãn cho các dòng dữ liệu mà user tạo ra trong bảng được chính sách bảo vệ. Nhãn này là tập con của max_write_label và def_read_label. Nếu người quản trị không thiết lập giá trị cho loại nhãn này, nó sẽ lấy giá trị bằng giá trị của def_write_label. Lưu ý: do def_write_label là nhãn được tính tự động từ def_read_label, người quản trị không cần phải thao tác trên nó nên trong các tài liệu hướng dẫn của Oracle def_read_label thường được gọi là def_label. Kể từ các phần sau, bài thực hành của chúng ta cũng sẽ áp dụng cách gọi như vậy. Giải thuật bảo mật của OLS đối với tác vụ đọc Hình trên mô tả một cách rõ ràng cách thức mà OLS so sánh nhãn dữ liệu và nhãn người dùng tại thời điểm đó (session label) để quyết định xem người dùng có quyền đọc dòng dữ liệu đó hay không. Trong OLS, tác vụ đọc tương đương với lệnh SELECT. Nói một cách ngắn gọn, người dùng chỉ có thể đọc được dữ liệu khi thỏa đồng thời các điều kiện sau: Level của session label cao hơn hoặc bằng level của dữ liệu. Session label có chứa ít nhất một group nằm trong các group của data label hoặc có chứa group cha của ít nhất một group nằm trong data label. Session label có chứa tất cả các compartment xuất hiện trong data label. Giải thuật bảo mật của OLS đối với tác vụ viết Hình trên mô tả một cách rõ ràng cách thức mà OLS so sánh nhãn dữ liệu và nhãn người dùng để quyết định xem người dùng có quyền viết dòng dữ liệu đó hay không. Trong OLS, tác vụ viết tương đương với một trong các lệnh: UPDATE, INSERT, DELETE. Nói một cách ngắn gọn, người dùng chỉ có thể viết được dữ liệu khi đồng thời thỏa 2 điều kiện sau: Điều kiện về level: Level của data label phải thấp hơn hoặc bằng level của session label hiện tại của user và cao hơn hoặc bằng min_level của người dùng. Điều kiện về group và compartment: phải thỏa một trong 2 điều kiện sau: Nếu data label không có group: session label của người dùng phải có quyền viết đối với tất cả các compartment mà data label đó có. Nếu data label có chứa group: session label phải có quyền viết trên ít nhất một group trong data label hoặc có quyền viết trên group cha của ít nhất một group trong data label. Bên cạnh đó, session label cũng phải chứa tất cả các compartment xuất hiện trong data label (tức là có quyền đọc trên tất cả các compartment của data label, còn quyền write có hoặc không có cũng được). Các quyền đặc biệt trong OLS Vì một số lý do đặc biệt, một người dùng có thể được cấp những quyền đặc biệt trong OLS để thực hiện một số tác vụ chuyên biệt hoặc truy xuất đến dữ liệu nằm ngoài giới hạn truy xuất được quy định trong tập xác thực quyền của người dùng đó. Các quyền đặc biệt được OLS định nghĩa gồm có 2 nhóm: quyền truy xuất đặc biệt (Special Access Privilege), quyền đặc biệt trên row label (Special Row Label Privilege). Quyền truy xuất đặc biệt: READ: cho phép người có quyền xem (SELECT) tất cả các dữ liệu do chính sách này bảo vệ, ngay cả khi người này không được gán bất cứ tập xác thực quyền nào. FULL: cho phép người có quyền viết và xem tất cả các dữ liệu do chính sách này bảo vệ. COMPACCESS: quyền COMPACCESS cho phép người dùng truy xuất dữ liệu dựa trên các compartment của nhãn dữ liệu, không quan tâm đến các group mà nhãn dữ liệu đó đang chứa. Nếu nhãn dữ liệu đó không chứa compartment, việc truy xuất được xác định dựa trên các group như bình thường. Nếu dữ liệu đó có chứa các compartment và người dùng có quyền truy xuất (đọc/viêt) đến chúng thì việc xác thực các group sẽ được bỏ qua. Hai hình bên dưới lần lượt minh họa cho quy trình xác thực tác vụ đọc và tác vụ viết đối với người dùng có quyền COMPACCESS. Quy trình xác thực tác vụ đọc Quy trình xác thực tác vụ viết PROFILE_ACCESS: cho phép thay đổi các session label của bản thân người dùng đó và session privilege của người dùng khác. Đây là một quyền rất “mạnh”, vì người có quyền này có thể ngầm trở thành người có quyền FULL. Quyền đặc biệt trên row label: WRITE_UP: cho phép người dùng nâng level của một hàng dữ liệu nhưng không làm thay đổi các compartment và group của nó. Người dùng chỉ được nâng tối đa đến max_level của chính họ. WRITE_DOWN: cho phép người dùng hạ level của một hàng dữ liệu nhưng không làm thay đổi các compartment và group của nó. Người dùng chỉ được phép hạ tối đa xuống đến min_level của họ, không được hạ thấp hơn mức này. WRITE_ACROSS: cho phép người dùng thay đổi compartment và group của một hàng dữ liệu nhưng không thay đổi level của nó. Người dùng có thể thay đổi các compartment và group đó thành bất cứ compartment và group nào có định nghĩa trong chính sách. Thực hành (Ý nghĩa các tham số của các thủ tục trong phần thực hành đã được giải thích trong phần lý thuyết nên sẽ không nhắc lại trong phần này). Gán quyền người dùng theo các thành phần của nhãn Louise Doran là nhân viên thuộc phòng Sales nên ta sẽ gán các level, compartment và group phù hợp với phòng ban và cấp bậc của Louise. Để gán level cho người dùng, ta dùng thủ tục SA_USER_ADMIN.SET_LEVELS. CONN hr_sec/hrsec; BEGIN sa_user_admin.set_levels (policy_name => 'ACCESS_LOCATIONS', user_name => 'LDORAN', max_level => 'CONF', min_level => 'PUB', def_level => 'CONF', row_level => 'CONF'); END; / Gán compartment cho người dùng, ta dùng thủ tục SA_USER_ADMIN.SET_COMPARTMENTS. CONN hr_sec/hrsec; BEGIN sa_user_admin.set_compartments (policy_name => 'ACCESS_LOCATIONS', user_name => 'LDORAN', read_comps => 'SM,HR', write_comps => 'SM', def_comps => 'SM', row_comps => 'SM'); END; / Gán compartment cho người dùng, ta dùng thủ tục SA_USER_ADMIN.SET_GROUPS. CONN hr_sec/hrsec; BEGIN sa_user_admin.set_groups (policy_name => 'ACCESS_LOCATIONS', user_name => 'LDORAN', read_groups => 'UK,CA', write_groups => 'UK', def_groups => 'UK', row_groups => 'UK'); END; / Gán quyền người dùng theo các nhãn Karen Partner là trưởng phòng Sales. Ta sẽ gán các nhãn phù hợp với phòng ban và cấp bậc của Karen. CONN hr_sec/hrsec; BEGIN sa_user_admin.set_user_labels (policy_name => 'ACCESS_LOCATIONS', user_name => 'KPARTNER', max_read_label => 'SENS:SM,HR:UK,CA', max_write_label => 'SENS:SM:UK', min_write_label => 'CONF', def_label => 'SENS:SM,HR:UK', row_label => 'SENS:SM:UK'); END; / Gán các quyền đặc biệt Steven King là tổng giám đốc có toàn quyền trên cơ sở dữ liệu, nên ta cấp quyền FULL cho người dùng này. CONN hr_sec/hrsec; BEGIN sa_user_admin.set_user_privs (policy_name => 'ACCESS_LOCATIONS', user_name => 'SKING', PRIVILEGES => 'FULL'); END; / Neena Kochhar là giám đốc điều hành nên ta có thể cấp quyền READ để người này có thể xem toàn bộ dữ liệu. CONN hr_sec/hrsec; BEGIN sa_user_admin.set_user_privs (policy_name => 'ACCESS_LOCATIONS', user_name => 'NKOCHHAR', PRIVILEGES => 'READ'); END; / Lưu ý: tham số user_name trong các procedure vừa sử dụng ở phần B – Thực hành không nhất thiết phải là một user thật sự của hệ thống. Nó cũng có thể là role, tên của ứng dụng, Áp dụng chính sách OLS Lý thuyết Đối tượng được bảo vệ OLS cho phép ta gán các chính sách cho các đối tượng cần được bảo vệ theo 2 cấp độ: cấp schema và cấp bảng. Khi 1 bảng cần được bảo vệ bởi 1 chính sách nào đó, ta gán chính sách đó cho cụ thể bảng đó. Nếu muốn tất cả các bảng thuộc 1 schema đều được bảo vệ bởi 1 chính sách, ta gán chính sách đó cho schema đó. Lưu ý: Nếu 1 chính sách được gán cho 1 schema và đồng thời cũng được gán tường minh cho 1 bảng thuộc schema đó thì các tùy chọn, thao tác ở cấp độ bảng sẽ override các tùy chọn, thao tác ở cấp độ schema. Các thao tác quản trị việc gán chính sách cho table/schema Áp dụng chính sách (Apply): ta gán chính sách cho cụ thể một bảng/schema cần được bảo vệ. Loại bỏ chính sách (Remove): loại bỏ sự bảo vệ của 1 chính sách khỏi bảng/schema. Lưu ý là khi loại bỏ như vậy, cột chứa nhãn của chính sách đó vẫn còn trong table, trừ khi ta xóa cột đó một cách tường minh. Ta có thể Enable/Disable một chính sách đang được gán cho 1 schema/bảng nào đó trong một khoảng thời gian. Để thay đổi những thiết lập tùy chọn của một chính sách đối với 1 bảng thì trước hết ta phải remove chính sách đó ra rồi sau đó apply trở lại với những thay đổi trong tùy chọn. Các tùy chọn cho việc áp dụng chính sách Các tùy chọn này cho phép ta quy định một số ràng buộc trong việc áp dụng các chính sách: LABEL_DEFAULT : Sử dụng row label mặc định của người dùng hiện tại để làm nhãn cho hàng dữ liệu mới được insert vào trừ khi row label được chỉ định tường minh bởi người insert hoặc hàm gán nhãn. LABEL_UPDATE: bình thường, một người dùng khi update dữ liệu có thể thay đổi nhãn dữ liệu kèm theo. Tuy nhiên, nếu tham số này được bật lên, một người muốn thay đổi nhãn dữ liệu thì người đó phải có ít nhất một trong các quyền sau: WRITEUP, WRITEDOWN, and WRITEACROSS. CHECK_CONTROL: nếu tùy chọn này được thiết lập, mỗi khi dữ liệu được update/insert và nhãn dữ liệu bị thay đổi/tạo mới, OLS sẽ kiểm tra xem nhãn dữ liệu mới có vượt quá giới hạn quyền của người update/insert hay không để tránh xảy ra tình trạng một người sau khi update/insert dữ liệu đó thì không thể truy xuất lại dữ liệu đó. READ_CONTROL: áp dụng chính sách cho mọi câu truy vấn. Chỉ những hàng có xác nhận quyền mới có thể truy xuất bởi các thao tác SELECT, UPDATE và DELETE. WRITE_CONTROL: xác định khả năng INSERT, UPDATE, và DELETE dữ liệu tại 1 hàng. Nếu tùy chọn này được kích hoạt, người dùng phải được xác thực quyền đầy đủ trước khi thực hiện các lệnh INSERT, UPDATE, DELETE. INSERT_CONTROL: có tác dụng giống tùy chọn WRITE_CONTROL nhưng chỉ đối với loại câu lệnh INSERT. DELETE_CONTROL: có tác dụng giống tùy chọn WRITE_CONTROL nhưng chỉ đối với loại câu lệnh DELETE. UPDATE_CONTROL: có tác dụng giống tùy chọn WRITE_CONTROL nhưng chỉ đối với loại câu lệnh UPDATE. ALL_CONTROL: áp dụng mọi ràng buộc tùy chọn. NO_CONTROL: không áp dụng bất cứ ràng buộc nào của chính sách. Gán nhãn cho dữ liệu Có 3 cách để một hàng dữ liệu được gán nhãn chính sách: Gán tường minh nhãn cho từng dòng dữ liệu thông qua các lệnh INSERT (cho dữ liệu mới) và UPDATE (cho dữ liệu đang tồn tại). Thiết lập tùy chọn LABEL_DEFAULT. Viết một function dùng cho việc gán nhãn cho các hàng dữ liệu của 1 bảng tùy theo nội dung của dữ liệu. Function này sẽ tự động được gọi cho mọi lệnh INSERT và UPDATE và nó độc lập với việc xác nhận quyền của mọi user. Tuy nhiên trong phạm vi bài thực hành này chúng ta sẽ chỉ dùng cách 1 để gán nhãn dữ liệu cho chính sách. Thực hành Áp dụng chính sách cho bảng Để gán chính sách cho các table ta dùng thủ tục SA_POLICY_ADMIN.APPLY_TABLE_POLICY 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'); END; / Cần nhớ một điều quan trọng là khi một table được bảo vệ bởi 1 chính sách, các hàng dữ liệu chưa được gán nhãn sẽ không thể được truy xuất. Do đó khi áp dụng một chính sách bảo vệ cho bảng có chứa sẵn dữ liệu, đầu tiên ta chọn tùy chọn ‘NO_CONTROL’ để chính sách tuy được gán cho bảng (cột OLS_COLUMN được thêm vào bảng) nhưng những ràng buộc của chính sách chưa áp dụng lên bảng. Ta đăng nhập vào tài khoản HR để xem sự thay đổi của bảng sau khi gán chính sách: CONN HR/HR; DESCRIBE locations; Name Null? Type --------------- ---------- ------ LOCATION_ID NOT NULL NUMBER(4) STREET_ADDRESS VARCHAR2(40) POSTAL_CODE VARCHAR2(12) CITY NOT NULL VARCHAR2(30) STATE_PROVINCE VARCHAR2(25) COUNTRY_ID CHAR(2) OLS_COLUMN NUMBER(10) Gán nhãn cho dữ liệu Để sec_admin có thể thiết lập nhãn cho các dòng dữ liệu ta cần gán quyền cho sec_admin: CONN hr/hr; GRANT select, insert, update ON locations TO sec_admin; Khi đã có đủ quyền ta gán nhãn cho các dòng dữ liệu. Đầu tiên ta gán nhãn CONF cho mọi dữ liệu trong bảng: CONN sec_admin/secadmin; UPDATE hr.locations SET ols_column = char_to_label ('ACCESS_LOCATIONS', 'CONF'); Tiếp theo ta cập nhật các nhãn của các dòng dữ liệu về các nước Mỹ, Anh, Canada: CONN sec_admin/secadmin; UPDATE 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'; Giả sử có một số địa chỉ là thông tin đặc biệt cần bảo mật, nên ta gán cho những dòng này nhãn có độ bảo mật cao hơn: CONN sec_admin/secadmin; 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 ; Lưu ý trong các lệnh trên ta có dùng thủ tục CHAR_TO_LABEL. Do giá trị các nhãn được lưu trong bảng thực chất là tag number. Cho nên ta phải dùng hàm này để chuyển từ dạng chuỗi ngắn của nhãn thành dạng số của nó. Tới đây thì ta đã thực hiện xong 5 bước trong quy trình hiện thực OLS. Do ở trên chúng ta đã thiết lập tùy chọn ‘NO_CONTROL’ cho việc áp dụng chính sách nên ở đây chúng ta cần remove chính sách khỏi bảng rồi add lại chính sách với tùy chọn mới để chính sách có thể được kích hoạt bảo vệ cho bảng. CONN 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 => 'READ_CONTROL,WRITE_CONTROL,CHECK_CONTROL'); END; / Bài tập Tạo ra các user: sales_manager, sales_north, sales_west, sales_east, sales_south. Cấp quyền để các user này kết nối vào CSDL. Gán user label cho các user vừa tạo.
File đính kèm:
- tai_lieu_thuc_hanh_bao_mat_he_thong_thong_tin_bai_thuc_hanh.docx