ORA-24247: network access denied by access control list (ACL)
En la versión 11g tanto en la R1 como en la R2 de Oracle tenemos que tener en cuanto que para usar los paquetes UTL’s se necesitan unos permisos especiales. Estos permisos se llaman ACL’s.
En caso de que no tengamos definidos estos permisos podemos encontrarnos el siguiente error:
ORA-24247: network access denied by access control list (ACL)
Una de las situaciones donde nos podemos encontrar con este problema es en el envío de correos.
Como prueba, podemos ejecutar el siguiente código en el usuario con el que queramos enviar correos. Si no tenemos permisos nos dará el siguiente error.
DECLARE
v_mailsever_host VARCHAR2(30) := 'mail.xxxx.es';
v_mailsever_port PLS_INTEGER := 25;
l_mail_conn UTL_SMTP.CONNECTION;
BEGIN
l_mail_conn := UTL_SMTP.OPEN_CONNECTION( v_mailsever_host, v_mailsever_port);
END;
/
Error obtenido:
ORA-24247: network access denied by access control list (ACL)
ORA-06512: at "SYS.UTL_TCP", line 17
ORA-06512: at "SYS.UTL_TCP", line 246
ORA-06512: at "SYS.UTL_SMTP", line 115
ORA-06512: at "SYS.UTL_SMTP", line 138
ORA-06512: at line 6
¿Cómo podemos crear la ACL y dar permisos al usuario para poder enviar correos?
Pues bien, lo podemos hacer de la siguiente forma. Con el usuario SYS creamos la ACL
BEGIN
DBMS_NETWORK_ACL_ADMIN.create_acl (
acl => 'envio_correos.xml',
description => 'Envio de correos',
principal => 'USUARIO',
is_grant => TRUE,
privilege => 'connect',
start_date => SYSTIMESTAMP,
end_date => NULL);
COMMIT;
END;
/
Con esto hemos creado una lista para envio de correo y hemos dado permisos al usuario ‘USUARIO’ para poder usarla.
Ahora hay que definir el servidor de correo y puerto utilizado sobre la lista que anteriormente hemos creado
BEGIN
DBMS_NETWORK_ACL_ADMIN.assign_acl (
acl => 'envio_correos.xml',
host => 'mail.xxxxxx.es',
lower_port => 80,
upper_port => NULL);
END;
/
Si quisieramos añadir otro puerto, volveríamos a ejecutar el mismo código con otro puerto distinto
BEGIN
DBMS_NETWORK_ACL_ADMIN.assign_acl (
acl => 'envio_correos.xml',
host => 'mail.xxxxx.es',
lower_port => 25,
upper_port => NULL);
END;
/
Si quisieramos que otro usuario tuviera permisos para poder enviar correos, simplemente ejecutariamos este código con el usuario al que queramos dar permisos
BEGIN
DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(
acl => 'envio_correos.xml',
principal => 'USUARIO2',
is_grant => TRUE,
privilege => 'connect');
END;
/
En caso de que queramos ver qué permisos tenemos dados y qué listas hay creadas en nuestra base de datos, usaremos las siguiente consultas:
SELECT * from dba_network_acls;
SELECT * FROM dba_network_acl_privileges;