原有系统运行在10g下面,有很多程序是使用utl_smtp, utl_http等包进行网络访问。最近升级到11gR2之后,wait4friend 遇到ORA-24247错误。错误信息如下
ORA-24247: network access denied by access control list (ACL)
这是Oracle11g的一个安全特性,所有使用网络访问的用户都需要特殊的赋权。解决办法也挺简单,只需要建立一个ACL控制,并且设置相应的权限即可。
-------------------------------------------------------------------
--drop
declare
v_acl varchar2(100):= 'fxkz_alert.xml';
begin
dbms_network_acl_admin.drop_acl (acl => v_acl);
commit;
end;
/
-------------------------------------------------------------------
-- 新建ACL并且设置地址
declare
v_user_name varchar2(30) := upper('test');
v_acl varchar2(100) := 'fxkz_alert.xml';
v_privilege varchar2(30) := lower('connect');
begin
-- 新建acl
dbms_network_acl_admin.create_acl(acl => v_acl,
description => '风险控制警报acl',
principal => v_user_name,
is_grant => true,
privilege => v_privilege,
start_date => null,
end_date => null);
-- 赋予指定地址和端口的权限
-- 这里使用通配符代替如下地址和端口
-- smtp.exmail.qq.com:25
-- 221.236.20.139:8100
dbms_network_acl_admin.assign_acl(acl => v_acl,
host => '*',
lower_port => 1,
upper_port => 10000);
commit;
end;
/
设置之后可以通过视图检查设置的结果
-------------------------------------------------------------------
-- 检查配置情况
select r.any_path from resource_view r where r.any_path like '/sys/acls/%.xml' order by 1;
select a.host, a.lower_port, a.upper_port,a.acl, a.aclid from dba_network_acls a where a.ACL='/sys/acls/fxkz_alert.xml';
select p.* from dba_network_acl_privileges p;
使用简单的代码也可以直接验证设置的用户权限是否生效
-----------------------------------------------------------------
-- 测试代码,必须使用被测试的用户执行
declare
v_conn utl_smtp.connection;
begin
v_conn := utl_smtp.open_connection('smtp.exmail.qq.com', 25);
end;
/
declare
v_http_url varchar2(300); --短信平台地址
v_http_req utl_http.req; --http请求对象
begin
v_http_url := 'http://221.236.20.139:8100/sendsms/sms.do';
v_http_req := utl_http.begin_request(v_http_url,
'post',
utl_http.http_version_1_1);
end;
/
如果设置之后,还需要加入其他的用户,也很简单
------------------------------------------------------------------
-- 加入额外的用户
begin
dbms_network_acl_admin.add_privilege(acl => 'fxkz_alert.xml',
principal => upper('bill_src'),
is_grant => true,
privilege => 'connect',
start_date => null,
end_date => null);
commit;
end;
/
本文参考了下列资料