policy_[9]_[1412579]_1_and_4 - ATBMHTTT-2017/lab01-1412579-1412564-1412551 GitHub Wiki
Mỗi dự án trong công ty có các mức độ nhạy cảm được đánh dấu bao gồm “Thông thường”, “Giới hạn”, “Bí mật”, “Bí mật cao”. Mỗi dự án có thể thuộc quyền quản lý của tổng công ty hoặc của 1 trong 3 chi nhánh “Tp.Hồ Chí Minh”, “Hà Nội”, “Đà Nẵng”. Mỗi dự án có thể liên quan đến các phòng ban: “Nhân sự”, “Kế toán”, “Kế hoạch” (OLS).
Tạo các thành phần policy.
Trưởng phòng được phép đọc dữ liệu dự án của tất cả phòng ban nhưng chỉ được phép ghi dữ liệu dự án thuộc phòng của mình. (1412579)
-
Cài đặt OLS và unlock user lbacsys, sau đó em phân quyền cần thiết cho user tangliang để cài đặt bài tập này.
-
Với OLS, từ yêu cầu của thầy em đã xác định chúng ta cần phải tạo ra 4 cấp level dữ liệu, với value tăng theo mức độ bí mật của nhãn.
EXEC SA_COMPONENTS.CREATE_LEVEL('OLS_DuAn', 4000, 'BMC', 'Bí mật cao');
EXEC SA_COMPONENTS.CREATE_LEVEL('OLS_DuAn', 3000, 'BM', 'Bí mật');
EXEC SA_COMPONENTS.CREATE_LEVEL('OLS_DuAn', 2000, 'GH', 'Giới hạn');
EXEC SA_COMPONENTS.CREATE_LEVEL('OLS_DuAn', 1000, 'TT', 'Thông thường');
- Tiếp theo đó là tạo những compartment dựa theo các phòng ban được đề bài cung cấp
EXEC SA_COMPONENTS.CREATE_COMPARTMENT('OLS_DuAn', 3000, 'NS', 'Nhân sự');
EXEC SA_COMPONENTS.CREATE_COMPARTMENT('OLS_DuAn', 2000, 'KT', 'Kế toán');
`EXEC SA_COMPONENTS.CREATE_COMPARTMENT('OLS_DuAn', 1000, 'KH', 'Kế hoạch');
- Với group, em chọn Tổng công ty (TCT) là cha và tất cả những chi nhánh khác là nhánh con của TCT, trong bài gồm 7 chi nhánh con và một chi nhánh cha. Vì phần em làm không liên quan tới chi nhánh Hà Nội, nên em không thể chi nhánh Hà Nội là cha các thằng con lại, tuy nhiên nếu làm phần policy_9_4 thì buộc chúng ta phải thay đổi để chi nhánh Hà nội có thể truy xuất những chi nhánh con của nó.
EXEC SA_COMPONENTS.CREATE_GROUP('OLS_DuAn', 1, 'TCT', 'Tổng công ty', NULL);
...
EXEC SA_COMPONENTS.CREATE_GROUP('OLS_DuAn', 8, 'DN', 'Đà Nẵng', 'TCT');
- Với những dữ kiện từ câu 4 trong phần policy_9, em xác định cần tạo những label hợp lý, ở đây em cho tất cả những thông tin dự án ở mức Giới Hạn, vì rất nhiều chi nhánh nên em chỉ rút gọn lại một số code demo
EXEC SA_LABEL_ADMIN.CREATE_LABEL('OLS_DuAn', 210, 'GH:NS:HCM');
...
EXEC SA_LABEL_ADMIN.CREATE_LABEL('OLS_DuAn', 150, 'GH:NS:HK');
- Xong tất cả các phần liên quan tới tạo policy, đến phần thao tác để hoàn thành câu hỏi 'Trưởng phòng được phép...', em gán nhãn cho các phòng thuộc các chi nhánh theo những nhãn mà em đã tạo trước đó.
update tangliang.DUAN set OLS_Col_DuAn = CHAR_TO_LABEL('OLS_DuAn', 'GH:NS:HCM') where phongChuTri = 2;
- Tất nhiên không thể thiếu đó chính là việc gán level cho user trưởng phòng của các phòng để trưởng phòng có thể sử dụng policy này hợp lý, cũng như gán các quyền select và update trên bảng để user trưởng phòng có thể thực hiện truy vấn.
EXEC SA_USER_ADMIN.SET_LEVELS ('OLS_DuAn', '10002', 'BM', 'GH', 'BM', 'BM');
grant select, update, insert on duan to "10001";
- Gán compartment cho user trưởng phòng để xác định trưởng phòng được đọc và ghi phòng ban theo yêu cầu của đề bài.
EXEC SA_USER_ADMIN.SET_COMPARTMENTS(policy_name => 'OLS_DuAn',user_name => '10002',read_comps => 'NS,KT,KH',write_comps => 'NS',def_comps => 'NS',row_comps => 'NS');
- Gán group cho các trưởng phòng để xác định trưởng phòng có thể đọc và ghi những chi nhánh nào theo yêu cầu của đề bài.
exec sa_user_admin.set_groups(policy_name => 'OLS_DuAn',user_name => '10002',read_groups => 'HCM,HN,DN,VT,DNG,SEO,HK',write_groups => 'HCM',def_groups => 'HCM',row_groups => 'HCM');
- Cuối cùng hoàn thành và test, em đã test thành công với OLS em tạo ra. Để kiểm tra thì em có sử dụng các câu lệnh dưới đây.
select SA_SESSION.MIN_LEVEL('OLS_DuAn') from dual;
select SA_SESSION.MAX_LEVEL('OLS_DuAn') from dual;
select SA_SESSION.COMP_READ('OLS_DuAn') from dual;
select SA_SESSION.COMP_WRITE('OLS_DuAn') from dual;
select SA_SESSION.GROUP_READ('OLS_DuAn') from dual;
select SA_SESSION.GROUP_WRITE('OLS_DuAn') from dual;
select SA_SESSION.LABEL('OLS_DuAn') from dual;
select SA_SESSION.ROW_LABEL('OLS_DuAn') from dual;
select SA_SESSION.SA_USER_NAME('OLS_DuAn') from dual;