Oracle Database Vault --设计由 Vault保护的安全应用程序角色

[复制链接]
查看11 | 回复7 | 2008-2-13 12:43:03 | 显示全部楼层 |阅读模式
通常的安全应用程序角色是由某一特定过程启用角色,而“Vault保护”指的是为这一角色指定一规则集,如果规则集取值为真则可以启用角色。 
在这个案例中,要求只有来某些特定的用户来至某一特定的IP地址的联接才允许启用应用程序角色。
 
  定义由Vault保护的安全应用程序角色的步骤为:
(1)定义规则集和规则;
(2)定义角色,并指定规则集;
(3)为角色授权;
(4)在应用中执行SQL命令启用应用程序角色。
 
第一步:创建几个测试用户

Log in to SQL*Plus as the Database Vault Account Manager,比如dvsys

conn dvsys/dvsys

create user test_a identified by test_a;

create user test_b identified by test_b;

create user test_c identified by test_c;

conn /as sydba

grant create session to test_a,test_b,test_c;
 
第二步:定义规则集

begin

DVSYS.DBMS_MACADM.CREATE_RULE_SET(

rule_set_name => 'Can Modify HR.DEPT',

description => 'Rule set to control who can modify dept in the HR.DEPT table',

enabled => 'Y',

eval_options => 1,

audit_options => 0,

fail_options => 1,

fail_message => 'Restricted Command',

fail_code => -20001,

handler_options => 0,

handler => null);

commit;

end;

/
第三步:定义2个rule并添加到第二步中定义的Rule Set中

begin

DVSYS.DBMS_MACADM.CREATE_RULE(

rule_name => 'Check IP Address',

rule_expr => 'DVF.F$CLIENT_IP = ''192.168.100.10''');

DVSYS.DBMS_MACADM.CREATE_RULE(

rule_name => 'Check Session User',

rule_expr => 'DVF.F$SESSION_USER IN (''TEST_A'', ''TEST_B'')');

commit;

end;

/

将这两个rule添加到Rule Set:Can Modify HR.DEPT

begin

DVSYS.DBMS_MACADM.ADD_RULE_TO_RULE_SET(

rule_set_name => 'Can Modify HR.DEPT',

rule_name => 'Check Session User',

rule_order => 1);

DVSYS.DBMS_MACADM.ADD_RULE_TO_RULE_SET(

rule_set_name => 'Can Modify HR.DEPT',

rule_name => 'Check IP Address',

rule_order => 2);

end;

/

回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层
第四步:定义一个Vault保护的安全应用程序角色



 



 

上面的过程,也可以在SQL*Plus中通过如下的脚本来完成:

begin

DVSYS.DBMS_MACADM.CREATE_ROLE(

role_name => 'DEPT_MGMT',

rule_set_name => 'Can Modify HR.DEPT',

enabled => 'Y');

commit;

end;

/

相反的,删除操作也可以通过如下的命令完成:

exec DVSYS.DBMS_MACADM.delete_role(role_name => 'DEPT_MGMT');

commit;

drop role dept_mgmt;

上面的动作完成后,通过下面的一些视图可以进行一些验证:


SQL> select * from DBA_DV_ROLE where role='DEPT_MGMT';


ROLERULE_NAME
ENABLED

----------- ---------------------- -------

DEPT_MGMT Can Modify HR.DEPT Y



SQL> select * from dba_roles where role='DEPT_MGMT';


ROLE PASSWORD_REQUIRED

-------------- -----------------

DEPT_MGMTYES



SQL> select * from role_role_privs where role='DEPT_MGMT';


ROLEGRANTED_ROLEADMIN_OPTION

--------- ----------------- ------------



SQL> select * from role_sys_privs where role='DEPT_MGMT';


ROLE PRIVILEGEADMIN_OPTION

---------- ---------------- ------------



SQL> select * from role_tab_privs where role='DEPT_MGMT';


ROLEOWNERTABLE_NAME COLUMN_NAME PRIVILEGEGRANTABLE

--------- ---------- -------------- --------------- ------------ ---------


SQL>


回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层
第五步:给角色授权

创建角色后,可对此角色授权,如执行某一程序包的执行权限,某些管理权限等。这些权限只能在角色启用时才能利用。

SQL> conn hr/hr

已连接。

SQL> select *from dept;

DEPTNO NAME

---------- --------------------------------

1000 总经理

1001 市场部

1002 财务部

1003 人力资源部

SQL> grant select on dept to dept_mgmt;

授权成功。

SQL>
 

在程序中执行如下语句启用Vault保护的安全应用程序角色:

  execute DVSYS.DBMS_MACSEC_ROLES.SET_ROLE('DEPT_MGMT');

第六步:测试

在上面的规则里面,我们定义了test_a、test_b可以从192.168.100.1使用角色DEPT_MGMT.那么我先看看从本地(127.0.0.1)上行不?

SQL> conn test_a/test_a@ora10g

已连接。

SQL> select DVF.F$CLIENT_IP,USER from dual;

F$CLIENT_IPUSER

-------------- ------

127.0.0.1TEST_A

SQL> select * from hr.dept;

select * from hr.dept

*

第 1 行出现错误:

ORA-00942: 表或视图不存在

SQL> EXEC DVSYS.DBMS_MACSEC_ROLES.SET_ROLE('DEPT_MGMT')

BEGIN DVSYS.DBMS_MACSEC_ROLES.SET_ROLE('DEPT_MGMT'); END;

*

第 1 行出现错误:

ORA-47306: -20001: Restricted Command

ORA-06512: 在 "DVSYS.DBMS_MACUTL", line 38

ORA-06512: 在 "DVSYS.DBMS_MACUTL", line 389

ORA-06512: 在 "DVSYS.DBMS_MACSEC", line 232

ORA-06512: 在 "DVSYS.ROLE_IS_ENABLED", line 4

ORA-06512: 在 "DVSYS.DBMS_MACSEC_ROLES", line 24

ORA-06512: 在 line 1

SQL>



再到192.168.100.10这个server上看看:

[oracle@rac01] /oracle> sqlplus /nolog

SQL> conn test_a/test_a@ora10g

Connected.

SQL> EXEC DVSYS.DBMS_MACSEC_ROLES.SET_ROLE('DEPT_MGMT');

PL/SQL procedure successfully completed.

SQL> select * from hr.dept;

DEPTNO NAME

---------- -----------------

1000 总经理

1001 市场部

1002 财务部

1003 人力资源部

SQL>

SQL> conn test_b/test_b@ora10g

Connected.

SQL> select * from hr.dept;

select * from hr.dept

*

ERROR at line 1:

ORA-00942: table or view does not exist

SQL> EXEC DVSYS.DBMS_MACSEC_ROLES.SET_ROLE('DEPT_MGMT');

PL/SQL procedure successfully completed.

SQL> select * from hr.dept;

DEPTNO NAME

---------- -------------------

1000 总经理

1001 市场部

1002 财务部

1003 人力资源部

SQL>

SQL> conn test_c/test_c@ora10g

Connected.

SQL> select * from hr.dept;

select * from hr.dept

*

ERROR at line 1:

ORA-00942: table or view does not exist

SQL> EXEC DVSYS.DBMS_MACSEC_ROLES.SET_ROLE('DEPT_MGMT');

BEGIN DVSYS.DBMS_MACSEC_ROLES.SET_ROLE('DEPT_MGMT'); END;

*

ERROR at line 1:

ORA-47306: -20001: Restricted Command

ORA-06512: at "DVSYS.DBMS_MACUTL", line 38

ORA-06512: at "DVSYS.DBMS_MACUTL", line 389

ORA-06512: at "DVSYS.DBMS_MACSEC", line 232

ORA-06512: at "DVSYS.ROLE_IS_ENABLED", line 4

ORA-06512: at "DVSYS.DBMS_MACSEC_ROLES", line 24

ORA-06512: at line 1

SQL>

OK,预期的效果达到了。
回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层
需要注意的问题 

通过SQL TRACE可以看到:

EXEC DVSYS.DBMS_MACSEC_ROLES.SET_ROLE('DEPT_MGMT');

的动作相当于set role dept_mgmt;

......


PARSING IN CURSOR #37 len=18 dep=1 uid=91 oct=55 lid=91 tim=17768350043 hv=4271525539 ad='6b901964'

set role DEPT_MGMT

END OF STMT

PARSE #37:c=0,e=222,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=1,tim=17768350040

=====================

PARSING IN CURSOR #36 len=190 dep=2 uid=0 oct=3 lid=0 tim=17768350730 hv=2195418186 ad='69dca984'

这样就存在一个问题,当起用了DEPT_MGMT这个角色的同时,也禁用了所有其他的角色。下面通过一个简单的例子来看一下:
 

先给test_a用户授予一个DBA角色:

SQL> conn /as sysdba

已连接。

SQL> grant dba to test_a;

授权成功。

SQL>



用test_a连接到数据库上:

SQL> conn test_a/test_a@ora10g

Connected.

SQL> select * from session_roles;

ROLE

------------------------------

DV_PUBLIC

DBA

SELECT_CATALOG_ROLE

HS_ADMIN_ROLE

EXECUTE_CATALOG_ROLE

DELETE_CATALOG_ROLE

EXP_FULL_DATABASE

IMP_FULL_DATABASE

GATHER_SYSTEM_STATISTICS

SCHEDULER_ADMIN

WM_ADMIN_ROLE

JAVA_ADMIN

JAVA_DEPLOY

XDBADMIN

XDBWEBSERVICES

OLAP_DBA

16 rows selected.

这个时候,test_a是可以直接访问任何表的,因为具有DBA角色嘛。

SQL> select * from hr.dept;

DEPTNO NAME

---------- -------------------

1000 总经理

1001 市场部

1002 财务部

1003 人力资源部

SQL>

SQL> select * from hr.emp;

EMPNOEMPNAME
SALDEPTNO

---------- ------------------- ---- ----------

1000 Mr.President

1001 Mr.Market 5000 1000

1002 Ms.Finance
6000 1000

1003 Ms.Hr
3000 1000

1101 Ms.Wang
2000 1001

1102 Ms.Li
2500 1001

1103 Mr.Zhang
5000 1002

7 rows selected.

--激活Vault 保护的角色:DEPT_MGMT

SQL> EXEC DVSYS.DBMS_MACSEC_ROLES.SET_ROLE('DEPT_MGMT');

PL/SQL procedure successfully completed.

SQL> select * from session_roles;

ROLE

------------------------

DEPT_MGMT

SQL> select * from hr.dept;

DEPTNO NAME

---------- --------------------------------

1000 总经理

1001 市场部

1002 财务部

1003 人力资源部

SQL> select * from hr.emp;

select * from hr.emp

*

ERROR at line 1:

ORA-00942: table or view does not exist

SQL>
回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层
相关信息:
http://www.itpub.net/thread-1107287-1-2.html
http://www.itpub.net/thread-1106817-1-3.html
http://www.itpub.net/thread-1105880-1-4.html
http://tomszrp.itpub.net/post/11835/476396
回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层
mark 以后学习
回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层
今天才学习了。


回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层
恩,MARK一下,楼主太厉害了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行