- UID
- 12521
- 阅读权限
- 100
- 帖子
- 14310
- 精华贴数
- 57
- 技术排名
- 23
- 技术积分
- 51675
- 社区排名
- 579
- 社区积分
- 3819
- 注册时间
- 2002-5-26
- 精华贴数
- 57
- 技术积分
- 51675
- 社区积分
- 3819
- 注册时间
- 2002-5-26
- 论坛徽章:
- 70
|
发表于 2007-1-11 22:39:32
|显示全部楼层
步骤:
我们需要用到3个用户,一个是拥有DOCUMENTS表的KAMUS用户,一个是用于设置OLS策略的LBACSYS用户,另外一个是不受OLS策略制约的SYS用户(用来方便的插入和更新测试数据)。
1. 安装Oracle Label Security
在安装数据库软件的时候必须保证选择了Oracle Label Security组件,否则所有功能都无法使用。如果当时没有选择,可以重新运行Universal Installer进行安装。
LBACSYS用户可以利用$ORACLE_HOME/rdbms/admin/catols.sql创建。
SQL> CONN / AS SYSDBA;
SQL> @?/rdbms/admin/catols
在这个脚本的最后会自动关闭数据库,所以请不要在生产库上直接测试。
再次打开数据库,就可以使用LBACSYS用户登录了,默认密码就是lbacsys,如果投放在生产环境中,请立刻修改默认密码。
2. 创建安全策略
SQL> CONN lbacsys/lbacsys
SQL> EXEC sa_sysdba.create_policy('DOC_POLICY','DOC_LABEL');
第一个参数DOC_POLICY是策略的名称,第二个参数DOC_LABEL是即将添加到DOCUMENTS表中的用于存储标签的字段名,这个字段将在后面apply table policy的时候自动完成,所以不必预先添加。
可以从DBA_SA_POLICIES视图中查询安全策略的情况。
3. 定义Level
SQL> EXEC sa_components.create_level('DOC_POLICY', 1000,'PUBLIC', 'Public Level');
SQL> EXEC sa_components.create_level('DOC_POLICY', 2000,'INTERNAL', 'Internal Level');
第一个参数是上一步创建的安全策略的名字。第二个参数是Level的等级,数字越大表示权限越高,比如此处具有INTERNAL等级的就可以同时查看有PUBLIC等级的数据。第三个参数是Level的短名,随便定义。第四个参数是Level的长名,只是起到一个说明的作用,随便定义。
可以从DBA_SA_LEVELS视图中查询安全等级的情况。
4. 定义Compartment。
本步操作是可选项,仅仅使用上一步中的Level就已经可以控制数据的行级安全性了,但是如果要实现更加复杂的控制,就可能需要定义Compartment和下一步的Group。
SQL> EXEC sa_components.create_compartment('DOC_POLICY', 200,'FIN', 'FINANCE');
SQL> EXEC sa_components.create_compartment('DOC_POLICY', 100,'HR', 'HUMAN_R');
参数依次是安全策略名,Compartment数字,短名,长名,此处的Compartment数字不涉及到权限的高低,仅仅是一个标识符而已。
可以从DBA_SA_COMPARTMENTS视图中查询安全间隔的情况。
5. 定义Group。
SQL> EXEC sa_components.create_group('DOC_POLICY', 10,'ALL', 'ALL_REGIONS');
SQL> EXEC sa_components.create_group('DOC_POLICY', 20,'WEST', 'WEST_REGIONS');
SQL> EXEC sa_components.create_group('DOC_POLICY', 30,'EAST', 'EAST_REGIONS');
参数依次是安全策略名,Group数字,短名,长名,此处的Group数字不涉及到权限的高低,仅仅是一个标识符而已。
可以从DBA_SA_GROUPS视图中查询安全组的情况。
注意,create_group存储过程有第5个参数,是parent_name,通过这个参数可以实现几乎无限制的多层权限控制,本文就不再深入了。
6. 创建Label。
EXEC sa_label_admin.create_label('DOC_POLICY', '10000', 'PUBLIC', TRUE);
EXEC sa_label_admin.create_label('DOC_POLICY', '30000', 'INTERNAL:HR:WEST,EAST', TRUE);
EXEC sa_label_admin.create_label('DOC_POLICY', '35000', 'INTERNAL:HR:WEST', TRUE);
EXEC sa_label_admin.create_label('DOC_POLICY', '36000', 'INTERNAL:HR:EAST', TRUE);
EXEC sa_label_admin.create_label('DOC_POLICY', '40000', 'INTERNAL:FIN:WEST,EAST', TRUE);
EXEC sa_label_admin.create_label('DOC_POLICY', '45000', 'INTERNAL:FIN:WEST', TRUE);
EXEC sa_label_admin.create_label('DOC_POLICY', '46000', 'INTERNAL:FIN:EAST', TRUE);
EXEC sa_label_admin.create_label('DOC_POLICY', '50000', 'INTERNAL:FIN,HR:EAST,WEST', TRUE);
创建了上文提到的8个label。
参数依次是安全策略名,Label Tag,Label值,是否为data label。
其中Label Tag必须是不同于系统中任何策略number的数字。
Label值是最关键的地方,通过组合前面几步中定义的level,compartment,group来设置标签,各个级别之间用冒号(:)隔开,一个级别中的多个元素用逗号(,)隔开。
是否为data label是一个布尔值,只有为TRUE的时候,这个标签才可以用于控制表数据的安全性。
可以从DBA_SA_LABELS视图中查询安全标签的情况。
7. 将策略赋予表。。
SQL> EXEC sa_policy_admin.apply_table_policy -
> ( policy_name => 'DOC_POLICY' -
> , schema_name => 'KAMUS' -
> , table_name => 'DOCUMENTS' -
> , table_options => 'LABEL_DEFAULT, READ_CONTROL,WRITE_CONTROL,HIDE');
前三个参数表示我们将DOC_POLICY策略附加到KAMUS用户的DOCUMENTS表上,执行这步操作的时候,Oracle会自动将第二步中定义的列添加到表中,如果这步执行成功,我们立刻用KAMUS用户检索DOCUMENTS表,会发现一条记录都没有了,这说明Label Security已经起作用了。
第四个参数用于设定策略如何控制表的安全性。LABEL_DEFAULT表示如果以后一个用户新增数据的时候没有指定Label那么将会使用该用户的default session label(这个default值在下面一步的用户Label设定中定义),READ_CONTROL,WRITE_CONTROL表示对于表的读写操作都受到安全策略的制约,HIDE表示不在desc表结构的时候显示DOC_LABEL列名,如果想要显示就省略HIDE字样。
注意,一旦apply策略完成,那么要修改table_options的值,比如想把HIDE去掉,那么就必须先用sa_policy_admin.remove_table_policy函数删除policy定义,然后重新apply。
8. 将Label赋予用户。
使用sa_user_admin.set_user_labels存储过程来将label赋予用户,这个存储过程有不少参数,但是必须输入的只有policy_name,user_name,max_read_label三项,其它参数如果省略的话,都有默认值。
比如def_label参数(用户新增数据的时候没有指定Label时的默认Label)如果没有设定,那么默认为跟max_read_label相同。
我们通过给KAMUS用户赋予不同的Label,来完成测试的目的。每次用LBACSYS用户设置完KAMUS用户的label,KAMUS用户都必须重新登录一次,设置才会生效。
--如果一个用户被赋予了第一个标签,那么他只能读取DOCID=1的第一条记录。
SQL> EXEC sa_user_admin.set_user_labels(policy_name=> 'DOC_POLICY',user_name =>'KAMUS',max_read_label =>'PUBLIC');
SQL> conn kamus/kamus
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as kamus
SQL> select * from documents;
DOCID DOCNAME DOC_LABEL
---------- ---------------------------------------- -----------
1 SHARE_WARE 10000
--如果一个用户被赋予了第二个标签,那么他能读取1,2,3这三条记录。
SQL> EXEC sa_user_admin.set_user_labels(policy_name=> 'DOC_POLICY',user_name =>'KAMUS',max_read_label =>'INTERNAL:HR:EAST,WEST');
SQL> conn kamus/kamus
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as kamus
SQL> select * from documents;
DOCID DOCNAME
---------- ----------------------------------------
1 SHARE_WARE
2 INTERNAL_HR_WEST
3 INTERNAL_HR_EAST
--如果一个用户被赋予了第三个标签,那么他能读取1,2这两条记录。
SQL> EXEC sa_user_admin.set_user_labels(policy_name=> 'DOC_POLICY',user_name =>'KAMUS',max_read_label =>'INTERNAL:HR:WEST');
SQL> conn kamus/kamus
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as kamus
SQL> select * from documents;
DOCID DOCNAME
---------- ----------------------------------------
1 SHARE_WARE
2 INTERNAL_HR_WEST
--如果 …… 此处省略中间的测试,大同小异。
--如果一个用户被赋予了第八个标签,那么他能读取所有的5条记录。
SQL> EXEC sa_user_admin.set_user_labels(policy_name=> 'DOC_POLICY',user_name =>'KAMUS',max_read_label =>'INTERNAL:FIN,HR:EAST,WEST');
SQL> conn kamus/kamus
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as kamus
SQL> select * from documents;
DOCID DOCNAME
---------- ----------------------------------------
1 SHARE_WARE
2 INTERNAL_HR_WEST
3 INTERNAL_HR_EAST
4 INTERNAL_FIN_EAST
5 INTERNAL_FIN_WEST
至此,这个Oracle Label Security 的实验基本上是完成了,达到了我们预先计划的目标。 |
|