ORACLE数据库内可以通过调用内置的一些包对外部发起TCP通讯,比如UTL_HTTP/UTL_SMTP/UTL_TCP/UTL_INADDR等,但是为了保证安全,ORACLE数据库有ACL(Access Control List 访问控制列表)的配置,只有进行过对应正确的配置,才能成功向外发起TCP通讯;如果配置不对,在访问的时候肯能会报错“ORA-24247 网络访问被访问控制列表 (ACL) 拒绝”。
上图为通常情况下,使用dbms_network_acl_admin包配置ACL规则的步骤,其实在这个包还可以配置wallet证书,不需要在PL/SQL代码中再去指定wallet路径了。另外还可以配置ACE访问控制条目,但不在本篇的讨论范围内,也就不说了。
在配置前,先查询一下两个视图
select * from dba_network_acls; Select * From dba_network_acl_privileges ;
dba_network_acls为assign_acl维护进去的
dba_network_acl_privileges为create_acl和add_privilege维护进去的
如果dba_network_acl_privileges中有可用的记录,那么我们可以跳过create_acl这一步,直接使用存在的xml文件来新增权限;如果没有,那么我们就先创建一个acl
begin dbms_network_acl_admin.create_acl( acl => 'utl_http.xml', -- 自定义文件名称 description => 'HTTP Access', -- 自定义描述 principal => 'DBUSER', -- 要配置的数据库账号,大小写敏感 is_grant => TRUE, -- 授权还是取消授权 privilege => 'connect', -- 连接权限 start_date => null, -- 起始日期,不维护则为不限制,下同 end_date => null -- 结束日期 ); end; /
begin dbms_network_acl_admin.add_privilege( acl => 'utl_http.xml', -- 刚才创建的acl名称 principal => 'DBUSER', -- 与上同 is_grant => TRUE, -- 与上同 privilege => 'resolve', -- resolve权限 start_date => null, end_date => null); end; /
begin dbms_network_acl_admin.assign_acl( acl => 'utl_http.xml', host => 'openo2o.jd.com', lower_port => null, -- 允许访问的起始端口号 upper_port => Null -- 允许访问的截止端口号 ); commit; end; /
配置完成后,查询一下前面说的两个视图,可以找到刚刚维护的规则信息。
如果以后要对已维护的ACL新增用户,单独执行第二步即可;
如果是要对已维护的ACL增加要访问的网址,单独执行第三步即可;
如果是要不同的用户允许访问不同的网址,则要再另外创建ACL了
即,一个ACL规则配置的就是 多个用户访问多个网址
想了解更多,请参考oracle官方文档
https://docs.oracle.com/en/database/oracle/oracle-database/21/arpls/DBMS_NETWORK_ACL_ADMIN.html