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

时间:2023-12-14 11:09:56

今天将一个发送数据库监控邮件的procedure 从10g 迁移到11g,不工作了。处理记录如下:

在Oracle11g中,Oracle在安全方面有了很多的改进,而在网络权限控制方面,也有一个新的概念提出来,叫做ACL(Access Control List), 这是一种细粒度的权限控制。在ACL之前,我们对于有一些程序包,例如UTL_MAIL, UTL_SMTP等这些包,你可以利用这些包连接到外部的主机,而默认情况下,这些包都是都是赋予了public角色,所以可能会导致利用这些PL/SQL程序包的恶意工具,所以Oracle提出了一个新的概念来解决这个问题,那就是ACL。

简单的说oracle对网络的访问需要授权。

具体的操作使用sys  as  sysdba  进行操作

1. 创建ACL控制XML

BEGIN
DBMS_NETWORK_ACL_ADMIN.CREATE_ACL (
acl => 'email_server_permissions.xml',
description => 'Enables network permissions for the e-mail server',
principal => 'CENTER_ADMIN',   --需要访问oracle 的用户
is_grant => TRUE,
privilege => 'connect');
commit;
END;

2.使用 DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL 将此 ACL 与邮件服务器相关联, 即需要访问的网络

BEGIN
DBMS_NETWORK_ACL_ADMIN.assign_acl (
acl => 'email_server_permissions.xml',
host => 'smtp.163.com', ---SMTP服务器地址
lower_port => 25,
upper_port => NULL);
COMMIT;
END;

3. 增加 host 权限

BEGIN

DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(acl => 'email_server_permissions.xml', host => 'www.baidu.com');

END;

4.UNASSIGN_ACL存储过程允许你手动删除访问控制列表,它使用的参数与ASSIGN_ACL存储过程相同,使用NULL参数作为通配符。
DBMS_NETWORK_ACL_ADMIN.UNASSIGN_ACL(host => 'www.baidu.com');
5.删除上面的控制列表
DBMS_NETWORK_ACL_ADMIN.drop_acl ( acl => 'email_server_permissions.xml');
6. 查询创建的ACL信息
SELECT host, lower_port, upper_port, acl,
     DECODE(
         DBMS_NETWORK_ACL_ADMIN.CHECK_PRIVILEGE_ACLID(aclid, 'HR', 'connect'),
            1, 'GRANTED', 0, 'DENIED', NULL) privilege
     FROM dba_network_acls