ORA-24247:network access denied by access control list (ACL) 的处理方法

本文介绍了在Oracle11g及以上版本中遇到ORA-24247问题的原因,即安全升级后需对DBMS_NETWORK_ACL_ADMIN包进行授权。文章详细步骤包括创建ACL、添加用户权限、分配主机访问权限以及提交操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ORA-24247 在11g及以上版本会碰到此问题。这是因为Oracle在安全方面做了升级,导致要对一些系统包的使用前需要先获得授权,而这个授权不是简简单单的通过grant就可以完成的。

下面举例说明问题的解决步骤和思路,需要用到的包为 DBMS_NETWORK_ACL_ADMIN,需要DBA权限去执行:
———————————————————————————————————————————
--首先,如果不存在访问控制文件,那么就创建一个
--如果已经有了,那么就忽略这一步,除非你想有序化进行管理,那么就重新创建一个
begin
 DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(acl         => 'Resolve_Access.xml',
                                    description => 'Resolve Access',
                                    principal   => 'LMSYS',
                                    is_grant    => true,
                                    privilege   => 'connect');
end;

--其次,为某个SCHEMA增加访问权限,权限分resolve和connect两种(必须全小写),需要根据具体使用的包来确定
--具体的,is_grant的说明说得很清楚了
/*
Network privilege to be granted or denied - 'connect | resolve' (case sensitive). A database user needs the connect privilege to an external network host computer if he or she is connecting using the UTL_TCP, UTL_HTTP, UTL_SMTP, and UTL_MAIL utility packages. To resolve a host name that was given a host IP address, or the IP address that was given a host name, with the UTL_INADDR package, grant the database user theresolve privilege.
*/
begin
 DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(acl       => 'Resolve_Access.xml',
                                       principal => 'SCOTT',
                                       is_grant  => true,
                                       privilege => 'resolve');
end; 

--由于发邮件时我指定的是IP,而不是hostname,所以第二步就不需要做了。

--第三步,授权从某主机上可以访问。host支持IP或主机名,并支持通配符*,指定主机名时要注意大小写是敏感的。
begin

DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(acl  => 'Resolve_Access.xml',
                                    host => '*');
end;

--最后一步,提交
commit;

https://www.cnblogs.com/ianxu/p/10417833.html

<think>好的,我现在需要帮用户解决Oracle存储过程中遇到的ORA-24247错误。这个错误提示是网络访问被访问控制列表(ACL)拒绝,所以首先我得回忆一下OracleACL权限管理机制。 根据用户提供的引用内容,特别是引用[1]、[2]、[3]提到的问题,错误发生在使用UTL_HTTP包发送请求或者执行某些网络操作时。这说明问题可能出在数据库用户没有相应的网络访问权限。Oracle 11g开始加强了安全性,必须通过ACL来授权用户访问外部网络。 接下来,我需要确定解决步骤。首先,用户需要检查当前的ACL配置,可以使用引用[4]和[5]中的SQL语句查询dba_network_acls视图,看看是否有相关的ACL条目存在。如果没有,就需要创建一个新的ACL。 然后,授权必要的权限。根据引用[3]和[4]提到的解决方法,可能需要使用DBMS_NETWORK_ACL_ADMIN包来创建ACL并分配权限。例如,使用CREATE_ACL来指定访问的主机、端口,再使用ASSIGN_ACLACL分配给用户。同时,用户可能需要被授予执行UTL_HTTP等包的权限,如引用[3]提到的授权语句。 需要注意的是,如果用户使用的是Oracle 11g,语法可能与旧版本不同,比如使用ADD_PRIVILEGE过程来添加权限。另外,执行这些操作需要DBA权限,所以用户可能需要联系数据库管理员或者有足够权限的账户来操作。 最后,测试配置是否生效,可以再次执行存储过程或发送请求,确认错误是否解决。如果问题依旧,可能需要检查ACL的配置是否正确,比如主机名是否准确,端口范围是否包含实际使用的端口,以及用户是否被正确授权。 总结步骤应该是:检查现有ACL、创建ACL、分配权限、授权用户使用相关包,然后测试。同时提醒用户注意权限管理的安全性,避免开放不必要的访问。</think>### ORA-24247 错误解决方案 #### 错误原因分析 ORA-24247 错误表示数据库用户尝试进行网络操作(如发送邮件、HTTP请求)时,被访问控制列表(ACL)拦截。Oracle 11g 开始引入 ACL 安全机制,需显式授权用户访问外部网络资源[^1][^2]。 --- #### 解决步骤(需DBA权限) 1. **检查现有ACL配置** ```sql SELECT host, lower_port, upper_port, acl FROM dba_network_acls; ``` 若结果为空或未覆盖目标地址,需新建ACL[^4][^5]。 2. **创建ACL并授权** ```sql BEGIN DBMS_NETWORK_ACL_ADMIN.CREATE_ACL( acl => 'http_access.xml', description => 'HTTP网络访问权限', principal => 'YOUR_USER', -- 替换为实际用户名 is_grant => TRUE, privilege => 'connect' ); END; / ``` 3. **分配ACL到目标主机** ```sql BEGIN DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL( acl => 'http_access.xml', host => '目标域名或IP', -- 如 'www.example.com' 或 '*' lower_port => 80, -- HTTP默认端口 upper_port => 80 ); END; / ``` 4. **授予UTL_HTTP执行权限** ```sql GRANT EXECUTE ON UTL_HTTP TO YOUR_USER; -- 替换为实际用户名 ``` --- #### 验证配置 ```sql SELECT * FROM USER_NETWORK_ACLS; SELECT * FROM USER_NETWORK_ACL_PRIVILEGES; ``` --- #### 扩展场景 - **多端口配置**:若需访问443端口: ```sql BEGIN DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE( acl => 'http_access.xml', principal => 'YOUR_USER', is_grant => TRUE, privilege => 'connect', position => NULL ); DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL( acl => 'http_access.xml', host => '目标地址', lower_port => 443, upper_port => 443 ); END; / ``` --- #### 注意事项 1. 使用通配符`*`时需谨慎,可能引发安全隐患 2. 修改ACL后建议重启相关服务 3. 邮件发送场景需同时配置SMTP端口权限(通常25/465)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值