| |
其中牵涉到几个名词,解释一下:
Policy:就是安全策略,一个安全策略是level,compartment,group,label的集合。 Level:等级,这是最基础的安全控制等级,必须设置。 Compartment:分隔(这不是官方翻译),提供第二级的安全控制,是可选的。 Group:组(这不是官方翻译),提供第三级的安全控制,是可选的。 Label:标签,最终体现到每一行上的安全标签,必须设置。只有用户被赋予的标签和此行上的标签相同或者等级更高的时候,该行才能够被用户存取。 1。创建策略:
EXEC sa_sysdba.create_policy('DOC_POLICY','DOC_LABEL');
2。创建敏感等级:
EXEC sa_components.create_level('DOC_POLICY', 1000, 'PUBLIC', 'Public Level'); EXEC sa_components.create_level('DOC_POLICY', 2000, 'INTERNAL', 'Internal Level'); 3。创建分隔:
EXEC sa_components.create_compartment('DOC_POLICY', 200, 'FIN', 'FINANCE'); EXEC sa_components.create_compartment('DOC_POLICY', 100, 'HR', 'HUMAN_RESOURCE');
4。创建分组:
EXEC sa_components.create_group('DOC_POLICY', 10, 'ALL', 'ALL_REGIONS'); EXEC sa_components.create_group('DOC_POLICY', 20, 'WEST','WEST_REGION', 'ALL'); EXEC sa_components.create_group('DOC_POLICY', 30, 'EAST', 'EAST_REGION', 'ALL'); ((级别:分隔:组) 组成标签)(就是对于某个部门某个区域的用户的数据(记录)分别分配一个不同的标记,也就是标签的数字号,对用户也分配同样的标记) 5。创建标签:
EXEC sa_label_admin.create_label('DOC_POLICY', '10000', 'PUBLIC', TRUE); EXEC sa_label_admin.create_label('DOC_POLICY', '20200','INTERNAL:HR:WEST', TRUE); EXEC sa_label_admin.create_label('DOC_POLICY', '20400','INTERNAL:FIN:EAST', TRUE); EXEC sa_label_admin.create_label('DOC_POLICY', '30900','INTERNAL:HR,FIN:ALL', TRUE); 7。向用户分配标签:
EXEC sa_user_admin.set_user_labels - ( policy_name => 'DOC_POLICY' - , user_name => 'TEST' - , max_read_label => 'INTERNAL:HR,FIN:ALL' - , max_write_label => 'INTERNAL:HR,FIN:ALL' - , min_write_label => 'PUBLIC' - , def_label => 'INTERNAL:HR,FIN:ALL' - , row_label => 'PUBLIC'); EXEC sa_user_admin.set_user_labels - ( policy_name => 'DOC_POLICY' - , user_name => 'HR' - , max_read_label => 'INTERNAL:HR:WEST' - , max_write_label => 'INTERNAL:HR:WEST' - , min_write_label => 'PUBLIC' - , def_label => 'INTERNAL:HR:WEST' - , row_label => 'PUBLIC'); EXEC sa_user_admin.set_user_labels - ( policy_name => 'DOC_POLICY' - , user_name => 'SCOTT' - , max_read_label => 'PUBLIC' - , max_write_label => 'PUBLIC' - , min_write_label => 'PUBLIC' - , def_label => 'PUBLIC' - , row_label => 'PUBLIC'); INSERT INTO ts.document VALUES(1, 'SHARE_WARE',CHAR_TO_LABEL('DOC_POLICY','PUBLIC')); INSERT INTO ts.document VALUES (2, 'WEST_PAYROLL', 20200); INSERT INTO ts.document VALUES (3, 'EAST_SALES', 20400); INSERT INTO ts.document VALUES (4, 'COMP_PAYROLL', 30900); 8。测试:
SQL> CONN test/test
已连接。
SQL> INSERT INTO TS.document VALUES 2 (1, 'SHARE_WARE',CHAR_TO_LABEL 3 ('DOC_POLICY','PUBLIC'));
已创建 1 行。
SQL> INSERT INTO TS.document VALUES 2 (2, 'WEST_PAYROLL', 20200);
已创建 1 行。
SQL> INSERT INTO TS.document VALUES 2 (3, 'EAST_SALES', 20400);
已创建 1 行。
SQL> INSERT INTO TS.document VALUES 2 (4, 'COMP_PAYROLL', 30900);
已创建 1 行。
SQL> SQL> commit;
提交完成。
SQL> SELECT docname, doc_label 2 FROM ts.document; DOCNAME DOC_LABEL SHARE_WARE 10000 WEST_PAYROLL 20200 EAST_SALES 20400 COMP_PAYROLL 30900 SQL> desc ts.document
名称 是否为空? 类型
DOCID NUMBER DOCNAME VARCHAR2(60) DOC_LABEL NUMBER(10) SQL> conn hr/hr
已连接。
SQL> SELECT docname, doc_label 2 FROM ts.document; DOCNAME DOC_LABEL SHARE_WARE 10000 WEST_PAYROLL 20200 SQL> conn hr/hr
已连接。
SQL> SQL> INSERT INTO TS.document VALUES 2 (1, 'SHARE_WARE',CHAR_TO_LABEL 3 ('DOC_POLICY','PUBLIC'));
已创建 1 行。
SQL> INSERT INTO TS.document VALUES 2 (2, 'WEST_PAYROLL', 20200);
已创建 1 行。
SQL> INSERT INTO TS.document VALUES 2 (3, 'EAST_SALES', 20400); INSERT INTO TS.document VALUES *
第 1 行出现错误:
ORA-12406: 未经策略 DOC_POLICY 授权的 SQL 语句 ORA-06512: 在 "LBACSYS.LBAC_STANDARD", line 20 ORA-06512: 在 "LBACSYS.LBAC$AI0_45004", line 1 ORA-04088: 触发器 'LBACSYS.LBAC$AI0_45004' 执行过程中出错 SQL> INSERT INTO TS.document VALUES 2 (4, 'COMP_PAYROLL', 30900); INSERT INTO TS.document VALUES *
第 1 行出现错误:
ORA-12406: 未经策略 DOC_POLICY 授权的 SQL 语句 ORA-06512: 在 "LBACSYS.LBAC_STANDARD", line 20 ORA-06512: 在 "LBACSYS.LBAC$AI0_45004", line 1 ORA-04088: 触发器 'LBACSYS.LBAC$AI0_45004' 执行过程中出错 SQL> conn scott/tiger
已连接。
SQL> INSERT INTO TS.document VALUES 2 (1, 'SHARE_WARE',CHAR_TO_LABEL 3 ('DOC_POLICY','PUBLIC'));
已创建 1 行。
SQL> INSERT INTO TS.document VALUES 2 (2, 'WEST_PAYROLL', 20200); INSERT INTO TS.document VALUES *
第 1 行出现错误:
ORA-12406: 未经策略 DOC_POLICY 授权的 SQL 语句 ORA-06512: 在 "LBACSYS.LBAC_STANDARD", line 20 ORA-06512: 在 "LBACSYS.LBAC$AI0_45004", line 1 ORA-04088: 触发器 'LBACSYS.LBAC$AI0_45004' 执行过程中出错 SQL> INSERT INTO TS.document VALUES 2 (3, 'EAST_SALES', 20400); INSERT INTO TS.document VALUES *
第 1 行出现错误:
ORA-12406: 未经策略 DOC_POLICY 授权的 SQL 语句 ORA-06512: 在 "LBACSYS.LBAC_STANDARD", line 20 ORA-06512: 在 "LBACSYS.LBAC$AI0_45004", line 1 ORA-04088: 触发器 'LBACSYS.LBAC$AI0_45004' 执行过程中出错 SQL> INSERT INTO TS.document VALUES 2 (4, 'COMP_PAYROLL', 30900); INSERT INTO TS.document VALUES *
第 1 行出现错误:
ORA-12406: 未经策略 DOC_POLICY 授权的 SQL 语句 ORA-06512: 在 "LBACSYS.LBAC_STANDARD", line 20 ORA-06512: 在 "LBACSYS.LBAC$AI0_45004", line 1 ORA-04088: 触发器 'LBACSYS.LBAC$AI0_45004' 执行过程中出错 SQL>
对于DML(insert,update,delete)操作呢?其实,Oracle是自动在表上添加了触发器,这一点我们可以在设置完label以后,通过dba_triggers视图验证,添加的是INSERT AFTER EACH ROW,UPDATE AFTER EACH ROW和DELETE BEFORE EACH ROW三个trigger
触发器 'LBACSYS.LBAC$AI0_45004'代码:
DECLARE v_allowed NUMBER; new_label LBAC_LABEL; BEGIN IF lbac_session.policy_disabled('DOC_POLICY') OR (lbac_standard.secure_context('LBAC$0_LAB', 'LBAC$BYPASS') = 2) THEN RETURN; END IF; IF :new.DOC_LABEL IS NULL OR (NOT lbac_utl.data_label(:new.DOC_LABEL)) THEN lbac_standard.raise_facility_error('TRUSTED', 'LBAC', 12406, 'DOC_POLICY'); END IF; IF bitand(nvl(lbac_standard.secure_context('LBAC$LABELS', :new.DOC_LABEL),0),3)=0 THEN lbac_standard.raise_facility_error('TRUSTED', 'LBAC', 12406, 'DOC_POLICY'); END IF; IF bitand(nvl(lbac_standard.secure_context('LBAC$LABELS',:new.DOC_LABEL),0),2)=2 THEN lbac_services.audit_privilege('DOC_POLICY',2,0,TRUE,'insert privilege used'); END IF; END;
|
|