ORA-24247: 网络访问被访问控制列表 (ACL) 拒绝

概述

在迁移公司一个项目时,迁移完成后,在接口列表中发现出现“ORA-24247: 网络访问被访问控制列表 (ACL) 拒绝”的错误。

image

原因

Oracle 11g加入了一个访问控制列表(ACL)用来控制网络访问,在访问外部网络地址前需要进行配置。

Oracle允许使用几个PL/SQL API(UTL_TCP, UTL_SMTP, UTL_MAIL, UTL_HTTP和 UTL_INADDR)访问外部网络服务,这些API都使用TCP协议。

命令介绍

1. 查询网络访问控制列表ACL

Select * From  dba_network_acls

2. 查询访问控制权限列表

Select * From  dba_network_acl_privileges

3. 查询数据库中的用户,用户大小写敏感

Select username From dba_users Where username Like '%ITS%'

4. 分配ACL权限

begin
  dbms_network_acl_admin.create_acl (       -- 创建访问控制文件(ACL)
    acl         => 'utl_http.xml',          -- 文件名称
    description => 'HTTP Access',           -- 描述
    principal   => 'ITS',                   -- 授权或者取消授权账号,大小写敏感
    is_grant    => TRUE,                    -- 授权还是取消授权
    privilege   => 'connect',               -- 授权或者取消授权的权限列表
    start_date  => null,                    -- 起始日期
    end_date    => null                     -- 结束日期
  );

  dbms_network_acl_admin.add_privilege (    -- 添加访问权限列表项
    acl        => 'utl_http.xml',           -- 刚才创建的acl名称
    principal  => 'ITS',                    -- 授权或取消授权用户
    is_grant   => TRUE,                     -- 与上同
    privilege  => 'resolve',                -- 权限列表
    start_date => null,
    end_date   => null
  );

  dbms_network_acl_admin.assign_acl (       -- 该段命令意思是允许访问acl名为utl_http.xml下授权的用户,使用oracle网络访问包,所允许访问的目的主机,及其端口范围。
    acl        => 'utl_http.xml',
    host       => '100.1.2.1',              -- ip地址或者域名,填写http://localhost:9000/hello与http://localhost:9000/是会报host无效的
                                            -- 且建议使用ip地址或者使用域名,若用localhost,当oracle不是安装在本机上的情况下,会出现问题
    lower_port => 9000,                     -- 允许访问的起始端口号
    upper_port => Null                      -- 允许访问的截止端口号
  );
  commit;
end;

begin
  dbms_network_acl_admin.assign_acl (       -- 可以授权多个主机,或者多个主机的多个端口
    acl        => 'utl_http.xml',
    host       => '10.100.49.138',
    lower_port => 80,
    upper_port => NUll
  );
  commit;
end;

5.  移除ACL授权(与授权一一对应)

begin
  dbms_network_acl_admin.unassign_acl(

    acl        => 'utl_http.xml',
    host       => '100.1.2.1',

    lower_port => 9000,
    upper_port => Null
  );
  dbms_network_acl_admin.delete_privilege(
    'utl_http.xml', 'ITS', NULL, 'resolve'
  );
  dbms_network_acl_admin.drop_acl(
    'utl_http.xml'
  );
end;

解决方法

通过查询老数据库的ACL授权,在新数据库添加相应的ACL授权,业务系统恢复正常。

借鉴资料

oracle 11g之ACL拙见

Oracle 11g ACL访问控制(11g的新玩意)

oracle的ACL

Oracle创建和删除ACL(网络访问控制列表 )

Oracle ORA-24247: 网络访问被访问控制列表 (ACL) 拒绝

Oracle11g Http请求报错 ORA-24247: 网络访问被访问控制列表 (ACL) 拒绝 ORA-29273:HTTP 请求失败

二〇二〇年七月六日 09:18:05

THE END