ACL Definición y Creación
Oracle permite el acceso a servicios de red externos utilizando varias APIs escritas en PL/SQL (UTL_TCP, UTL_SMTP, UTL_MAIL, UTL_HTTP y UTL_INADDR), todas ellas implementadas mediante el protocolo TCP para ello necesitamos un ACL.
Por su definición en inglés Access Control List (ACL) sirve para darle permisos a los usuarios para conectarse y por default vienen cerrados estos canales de comunicación. Por ejemplo si necesitamos conectarnos a un servidor LDAP tenemos que crear un permiso para decirle a la base de datos que permita esto, por seguridad vamos a tener todo bloqueado y de esta forma controlamos las conexiones.
El paquete DBMS_NETWORK_ACL_ADMIN
es el encargado de ejecutar dichos permisos y debe ser invocado con permisos de administrador o sysdba.
-- Ejecutar como sysdba DECLARE l_acl VARCHAR2(100) := 'nombredemiacl.xml'; l_desc VARCHAR2(100) := 'descripción del acl'; l_principal VARCHAR2(30) := 'USUARIO'; -- EN MAYÚSCULAS l_host VARCHAR2(100) := 'ldap.ejemplo.com'; --nombre del host BEGIN -- Crea el nuevo ACL -- Proveer privilegios de conexión dbms_network_acl_admin.create_acl(l_acl, l_desc, l_principal, TRUE, 'connect'); -- Permisos de resolución de DNS dbms_network_acl_admin.add_privilege(l_acl, l_principal, TRUE, 'resolve'); -- Pasamos lo parámetros nombre del acl y host dbms_network_acl_admin.assign_acl(l_acl, l_host); COMMIT; END;
Para verificar los ACLs creados
SELECT host, lower_port, upper_port, acl FROM dba_network_acls;
Los parámetros soportados son
DBMS_NETWORK_ACL_ADMIN.CREATE_ACL ( acl IN VARCHAR2, --nombre del acl description IN VARCHAR2, -- descripción principal IN VARCHAR2, -- usuario al que se le asignará is_grant IN BOOLEAN, -- TRUE o FALSE otorgar o revocar el permiso privilege IN VARCHAR2, -- el nombre del permiso start_date IN TIMESTAMP WITH TIMEZONE DEFAULT NULL, --fecha inicio end_date IN TIMESTAMP WITH TIMEZONE DEFAULT NULL ); --fecha termino del permiso
Si quieres hacer una prueba puedes ejecutar el siguiente bloque de código o ver el post donde creamos un ACL para habilitar la conexión
DECLARE l_url VARCHAR2(50) := 'ldap.forumsys.com:389'; l_http_request UTL_HTTP.req; l_http_response UTL_HTTP.resp; BEGIN -- Hacemos una petición l_http_request := UTL_HTTP.begin_request(l_url); l_http_response := UTL_HTTP.get_response(l_http_request); UTL_HTTP.end_response(l_http_response); END;
Ref. LDAP Test
Espero te sirva esta información, si es así, no olvides darle clic a los anuncios que aparecen en el blog.
Si tienes una duda o comentarios por favor házmelo saber, me ayudaría muchísimo para poder crear más entradas.
yo tengo un problema, cree un ACL le agregue los permisos pero al momento que se ejecuta un job con el user y el host da un error de ORA-24247: network access denied by access control list (ACL), he validado en muchos foros y en MOS pero sigo sin hallar como resolver el problema, la base es una versión 19c y este es el ACL creado:
begin
dbms_network_acl_admin.create_acl (
acl => ‘ejemplo.xml’,
description => ‘ACLforUSERejemplo’,
principal => ‘Ejemplo’,
is_grant => TRUE,
privilege => ‘connect’
);
dbms_network_acl_admin.add_privilege (
acl => ‘ejemplo.xml’,
principal => ‘ejemplo’,
is_grant => TRUE,
privilege => ‘connect’
);
dbms_network_acl_admin.assign_acl (
acl => ‘ejemplo.xml’,
host => ‘ejemplo’,
lower_port => 21,
upper_port => 21
);
commit;
end;
Agradeceria mucho si me apoyas ya que hasta un ACE cree pero nomas no queda el ACL o ya no se si es tema del lado del área de DEV aj ejecutar el job
Hola Quique, queria saber si al momento de crear una ACL puedo ingresar una URL completa en el host ejemplo: (https://ejemplo.com/ejemplo-ejemplo)
ya que al momento de tratar de crearlo me genera un error (ora-24244: invalid host or port for access control list (acl) )
Buenas tardes, Quique.
Antes que nada, agradecer tu predisposición siempre. Ya sea por este u otros medios, como YOUTUBE. A los de menos experiencia, como yo, nos es muy útil tus enseñanzas.
En esta instancia me encuentro en un particular caso para el que no he podido hallar respuesta. He configurado tal como lo has indicado en tu video, pero los correos no se envían, ya que se presenta el error: “ORA-29259: end-of-input reached”. Es una app sobre Apex 19.2.
Te agradecería alguna respuesta, si es que se te ha presentado el problema.
Saludos desde Argentina.-
Hola Paulo ¿Que versión de base de datos utilizas?
Cómo borro un role de Oracle apex de la tabla propia de apex.
I have local instance of oracle apex in my laptop and want to send email. the below entry from acl is not clear.
kindly explain which value should i enter if i want to use gmail to send email from oracle apex applications.
l_acl VARCHAR2(100) := ‘nombredemiacl.xml’;
l_desc VARCHAR2(100) := ‘descripción del acl’;
l_principal VARCHAR2(30) := ‘USUARIO’; — EN MAYÚSCULAS
l_host VARCHAR2(100) := ‘ldap.ejemplo.com’; –nombre del host
Hello getshyaam,
You can use this https://sendgrid.com/, it’s easier than gmail
this is the example
l_acl VARCHAR2(100) := ‘whateveryouwant.xml’;
l_desc VARCHAR2(100) := ‘YOUR DESCRIPTION’;
l_principal VARCHAR2(30) := ‘UPPERCASEUSER’;
l_host VARCHAR2(100) := ‘sendgrid.com’;
Regards
Enrique
Buenas Quique
Soy de Costa Rica
Gracias por tu aporte en este tema de Apex, a muchos que nos estamos iniciamos nos es de mucha ayuda.
Quiero implementar el uso de un webservice, en específico el del Banco Central de Costa Rica para consultar el tipo de cambio respecto al Dolar (http://indicadoreseconomicos.bccr.fi.cr/indicadoreseconomicos/WebServices/wsindicadoreseconomicos.asmx?op=ObtenerIndicadoresEconomicosXML)
En la BD de Apex yo creé un workspace y un usuario administrador, en este workspace es donde estoy tratando de implementar el WS.
Ya programé en un procedimiento almacenado en la BD lo que es invocar el ws, lo ejecuté pero me da error de que no existe un ACL en la BD.
Usé tu ejemplo de crear el ACL pero desde el SQL Workshop, que es lo que tengo para manipular la BD, ni siquiera reconoce el paquete dbms_network_acl_admin.
Cómo puedo hacer?
Cómo me conecto a ese workspace como sys?
Qué estaré haciendo mal?
gracias..
Hola Eric,
Si necesitas el usuario con privilegios de sys para poder crear un ACL y si la conexión es https necesitas agregar el certificado a un wallet.
Saludos
Enrique