今天在使用utl_smtp的package發送e-mail時,出現了ORA-24247: 存取控制清單 (ACL) 拒絕網路存取
UTL_MAIL、UTL_SMTP、UTL_HTTP、UTL_TCP 等Package允許DB Server使用外部網路的服務,當這些權限被授予許可時,是所有外部服務的主機都可以連線,這有有不安全的疑慮。
因此在Oracle 11g之後,加強了安全性,引入了存取控制清單(ACL),不僅可以控制誰可以使用這些package,還可以依據IP和Port來控制連線的權限。
步驟如下(需要使用system來操作):
依我目前的情形,我需要的是授予允許使用者對郵件主機192.168.1.111連線的ACL
新增一個新的ACL,記得把SCOTT換成需要使用服務的DB帳號,新的ACL取名為mail_services.xml:
DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(
acl => 'mail_services.xml',
description => 'MAIL ACL',
principal => 'SCOTT',
is_grant => true,
privilege => 'connect');
在ACL中新增一個權限,這個也可以獨立使用在已存在的ACL(mail_services.xml):
DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(
acl => 'mail_services.xml',
principal => 'SCOTT',
is_grant => true,
privilege => 'resolve');
將ACL與提供網路服務的IP連接,host的參數可以用「*」設定為不限:
DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(
acl => 'mail_services.xml',
host => '192.168.1.111');
重新再試一次mail的寄送,這次就成功了。