viernes, 24 de julio de 2020

Oracle Apex 20.1: ORA-24247: network access denied by access control list (ACL)

Al tratar de utilizar un servicio REST en Oracle Apex 20.1 el siguiente mensaje puede aparecer:

ORA-24247: network access denied by access control list (ACL)



Este mensaje es normal es un ambiente recien creado de Apex, donde no se ha habilitado los servicios de red.

Los servicios de red nos permiten realizar las siguientes acciones:
  • Envío de correo saliente en Oracle Application Express.
  • Llamar a métodos desde el paquete APEX_MAIL.
  • Consumir servicios web de Oracle Application Express.
  • Realización de llamadas LDAP salientes desde Oracle Application Express.
  • Impresión de reportes en PDF.

Para solventar el mensaje anterior basta con ejecutar como usuario SYS de la Base de datos el siguiente script para brindar el acceso requerido:

BEGIN
    DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
        host => '*',
        ace => xs$ace_type(privilege_list => xs$name_list('connect'),
                           principal_name => 'APEX_200100',
                           principal_type => xs_acl.ptype_db));
END;
/


Del script anterior cabe recalcar los siguientes puntos:

  • El asterisco indica que se brinda acceso desde cualquier host. Puede ser reemplazado el valor por la palabra localhost para restringir el acceso solamente desde el servidor donde se encuentra instalada la Base de Datos.
  • En el principal_name se brinda acceso al usuario APEX_200100.
  • Este Script asumen que la versión de la Base de Datos siendo utilizada es 12c o superior.

NOTA: Si en caso se está utilizando una Base de Datos previa a la versión 12c se puede usar el siguiente script:

DECLARE
  ACL_PATH  VARCHAR2(4000);
BEGIN
   
  SELECT ACL INTO ACL_PATH FROM DBA_NETWORK_ACLS
   WHERE HOST = '*' AND LOWER_PORT IS NULL AND UPPER_PORT IS NULL;
 
  IF DBMS_NETWORK_ACL_ADMIN.CHECK_PRIVILEGE(ACL_PATH, 'APEX_200100',
     'connect') IS NULL THEN
      DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(ACL_PATH,
     'APEX_200100', TRUE, 'connect');
  END IF;
 
EXCEPTION
  
  WHEN NO_DATA_FOUND THEN
  DBMS_NETWORK_ACL_ADMIN.CREATE_ACL('power_users.xml',
    'ACL that lets power users to connect to everywhere',
    'APEX_200100', TRUE, 'connect');
  DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL('power_users.xml','*');
END;
/
COMMIT;


1 comentario: