Secure Application Roles--安全角色

本文介绍了一个利用Oracle数据库安全角色机制来实现基于IP地址的身份验证方案。通过创建特定的角色和过程,仅允许来自预设IP地址的用户访问敏感数据,从而增强系统的安全性。
转自:http://blog.chinaunix.net/uid-14504139-id-3908100.html
安全应用角色

1.可以解决其他客户端程序越权访问数据的问题。
2.比隐藏密码机制更好。
3.使用SYS_CONTEXT机制和VPD效果一样。
4.启用角色时通过包,而不是通过密码。

1.建立一个名为secure_user的应用用户,只有create session权限或其他权限,但不具有查询ldy用户下表的权限。
create user secure_user identified by oracle;
grant create session to secure_user;
 
2.创建1个安全角色,此时认证使用的过程包不需要已经存在。赋予对ldy.emp表的查询权限。
CREATE ROLE secure_role IDENTIFIED USING ldy.auth_role;
grant select on ldy.emp to secure_role;
 
3.创建权限信息表。如果权限比较简单,也可以不使用权限信息表,直接在验证包里写验证信息。
目的是为了限制应用用户从指定IP连接上来才具有安全角色权限。
表结构如下
create table ldy.AUTH_ROLES
(
USERNAME varchar2(50),
ROLE varchar2(50),
IP_ADDRESS  varchar2(50),
ENABLED  number
);
表内容如下:
insert into ldy.auth_roles values ('SECURE_USER','SECURE_ROLE','192.168.161.37',1);
 
4.创建验证的包和包体
需要包含AUTHID CURRENT_USER子句:
create or replace procedure ldy.auth_role
AUTHID CURRENT_USER
as
cursor vc is
SELECT role
FROM ldy.AUTH_ROLES
WHERE username = upper(sys_context('userenv','current_user'))
AND ip_address = upper(sys_context('userenv','ip_address'))
AND enabled=1;
v_role ldy.auth_roles.role%TYPE;
begin
open vc;
loop
 fetch vc into v_role;
  IF vc%ROWCOUNT = 0 THEN
    raise_application_error(-20123,'This IP has Invalid Privilege',false);
  END IF;
 exit when vc%notfound;
 dbms_session.set_role(v_role);
end loop;
exception
  when others then
  dbms_output.put_line(dbms_utility.format_error_stack);
END;
/
 
5.分配这个包的执行权限,权限表的查询权限以及角色给应用用户。注权限分配表的权限给了应用用户,应用用户可以知道哪些IP具有权限,如果不使用权限分配表,写在存储过程中,应用用户也可以从all_sources视图中查询到存储过程的内容。

grant execute on ldy.auth_role to secure_user;
grant select on ldy.auth_roles to secure_user;
grant secure_role to secure_user;
ALTER USER secure_user DEFAULT ROLE ALL EXCEPT secure_role;
 
6.测试连接
从IP 192.168.161.37连接
$ sqlplus secure_user/oracle@cdct
 
SQL*Plus: Release 10.2.0.4.0 - Production on Wed Nov 21 09:44:18 2012
Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
 
SQL> exec ldy.auth_role;
 
PL/SQL procedure successfully completed.
 
SQL> select count(*) from ldy.emp;
 
  COUNT(*)
----------
     10356
 
从其他IP连接
$ sqlplus secure_user/oracle@cdct
 
SQL*Plus: Release 10.2.0.4.0 - Production on Wed Nov 21 09:44:18 2012
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
 
SQL> exec ldy.auth_role;
 
PL/SQL procedure successfully completed.
 
SQL> select count(*) from ldy.emp;
select count(*) from ldy.emp
                         *
ERROR at line 1:
ORA-00942: table or view does not exist
 
 
一个简单的例子:
create user secuser identified by oracle;
grant create session to secuser;
 
create role secrole identified using sec_proc;
grant select on test.load_tab1 to secrole;
 
create or replace procedure sec_proc
authid current_user
as
begin
if sys_context('userenv','ip_address')='192.168.72.11' then
dbms_session.set_role('secrole');
end if;
end;
/
 
grant execute on sec_proc to secuser;
grant secrole to secuser;
alter user secuser default role all except secrole;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值