应用使用utl http访问web服务报错ORA- 24247解决

应用使用utl http访问网元的web服务查询信息报错如下:

应用使用utl http访问web服务报错ORA- 24247解决
应用使用utl http访问web服务报错ORA- 24247解决

查看报错原因:

$ oerr ora 24247
24247, 00000, "network access denied by access control list (ACL)"
// *Cause: No access control list (ACL) has been assigned to the target
// host or the privilege necessary to access the target host has not
// been granted to the user in the access control list.
// *Action: Ensure that an access control list (ACL) has been assigned to
// the target host and the privilege necessary to access the target
// host has been granted to the user.

Oracle的UTL_TCP、UTL_HTTP 和 UTL_SMTP程序包,支持数据库领域外的服务器之间的通信。例如,utl_tcp 用于在两台主机间建立 TCP/IP通信,而不是通过数据库链接。类似地,utl_http 用于从 Web 服务器发出 http 请求,utl_smtp 用于在主机间进行 SMTP邮件呼叫。

开发人员偶尔会使用这些强大的工具 — 例如,使用 utl_smtp 从数据库内发送邮件,使用 utl_http 提取可在 PL/SQL程序内处理的 Web 页面等等。然而,这些工具带来了巨大的安全风险。使用utl_tcp,数据库用户可以到达该主机可到达的任何其他计算机,甚至不会遇到系统提示。这曾是 Voyager蠕虫的惯用伎俩,该病毒一年前刚骚扰过 Oracle 用户社区。

为了消除这一风险,很多专家建议撤消“从公网执行”这些程序包的权限。但如果开发人员出于合理原因希望执行这些程序包,该怎么办?安全解决方案:
Oracle 数据库 11g有一个新的解决方案:您可以将执行权限程序包授予任何人,但要控制他们可以调用的资源。例如,utl_tcp 可限制为仅调用几个 IP地址,这种机制称为访问控制列表 (ACL)。如果主机在 ACL 中,用户可以在 utl_tcp 中使用;但是仅仅拥有对 utl_tcp的执行权限是不够的。因此,恶意进程不可能取代 utl_tcp 程序包和建立非法连接。

处理步骤:

1. 确认应用使用的数据库账号,需要访问的web地址和端口

应用使用utl http访问web服务报错ORA- 24247解决
应用使用utl http访问web服务报错ORA- 24247解决

2. 创建ACL

SQL> execute DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(ACL => 'utl_http.xml', DESCRIPTION => 'HTTP Access', PRINCIPAL => 'XXXXX', IS_GRANT => true, PRIVILEGE => 'connect', START_DATE => null, END_DATE => null);

PL/SQL procedure successfully completed.

3. 赋权resolve

SQL> execute DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(ACL => 'utl_http.xml', PRINCIPAL => 'XXXXX', IS_GRANT => true, PRIVILEGE => 'resolve', START_DATE => null, END_DATE => null);

PL/SQL procedure successfully completed.

4. 关联host和端口

SQL> execute DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(ACL => 'utl_http.xml', HOST => '136.22.22.22, LOWER_PORT => 8080, UPPER_PORT => 8090);

PL/SQL procedure successfully completed.

5. 检查设置

SQL> SELECT acl,
         principal,
         privilege,
         is_grant,
         TO_CHAR(start_date, 'DD-MON-YYYY') AS start_date,
         TO_CHAR(end_date, 'DD-MON-YYYY') AS end_date
    FROM dba_network_acl_privileges;

ACL PRINCIPAL PRIVILEGE IS_GRANT START_DATE END_DATE
------------------------- --------------- ----------------------- ---------- -------------- --------------
/sys/acls/utl_http.xml XXXXX resolve true
/sys/acls/utl_http.xml XXXXX connect true

SELECT host, lower_port, upper_port, acl FROM dba_network_acls;

HOST LOWER_PORT UPPER_PORT ACL
-------------------- ---------- ---------- ----------------------------------------
136.22.22.22 8080 8090 /sys/acls/utl_http.xml

6. 添加其他的web地址

execute DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(ACL => 'utl_http.xml', HOST => '136.22.22.22', LOWER_PORT => 8080, UPPER_PORT => 8090);
execute DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(ACL => 'utl_http.xml', HOST => '136.22.22.23', LOWER_PORT => 3001, UPPER_PORT => null);
execute DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(ACL => 'utl_http.xml', HOST => '136.22.22.24', LOWER_PORT => 3005, UPPER_PORT => null);

SQL> SELECT host, lower_port, upper_port, acl FROM dba_network_acls;

HOST LOWER_PORT UPPER_PORT ACL
-------------------- ---------- ---------- ----------------------------------------
136.22.22.22 8080 8090 /sys/acls/utl_http.xml
136.22.22.23 8080 8090 /sys/acls/utl_http.xml
136.22.22.24 3001 3001 /sys/acls/utl_http.xml
136.22.22.25 3005 3005 /sys/acls/utl_http.xml

7. 应用测试

联系应用人员检查测试,3个地址访问正常,24地址访问失败,是目标端防火墙限制导致,联系相关人员处理解决。

问题解决。

发表评论

登录后才能评论
服务中心
服务中心
联系客服
联系客服
投诉举报
返回顶部