Con la salida de Oracle 11g se ha incluido en la base de datos un sistema para controlar el acceso a recursos de red que, por defecto, bloquea cualquier intento de conexión al exterior. Esto nos obliga a crear una serie de listas, o ACLs, para controlar y permitir el acceso a los recursos de red que sean necesarios en nuestros desarrollos.
El paquete DBMS_NETWORK_ACL_ADMIN nos proporciona todos los procesos necesarios para crear y gestionar estas listas. En el siguiente ejemplo se muestran los pasos que debemos seguir para habilitar a dos usuarios el acceso a una URL concreta:
- Nombre de la lista ACL: network_access_test.xml
- Usuarios con permisos de conexión: TEST_USER y TEST_USER_2
- URL de acceso: *.yahooapis.com
-- Create ACL
BEGIN
DBMS_NETWORK_ACL_ADMIN.CREATE_ACL (
acl => 'network_access_test.xml',
description => 'Network access test',
principal => 'TEST_USER', -- Must be in upper case
is_grant => TRUE,
privilege => 'connect',
start_date => NULL,
end_date => NULL);
END;
/
-- Creates the second role privilege
BEGIN
DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE (
acl => 'network_access_test.xml',
principal => 'TEST_USER_2',
is_grant => TRUE,
privilege => 'connect',
position => NULL,
start_date => NULL,
end_date => NULL);
END;
/
-- Creates the first target host
BEGIN
DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL (
acl => 'network_access_test.xml',
host => '*.yahooapis.com',
lower_port => NULL,
upper_port => NULL);
END;
/
Para asegurarnos de que hemos activado el acceso correcto podemos consultar las siguientes vistas:
-- List ACLs
select *
from RESOURCE_VIEW
where any_path like '/sys/acls/%';
-- List ACL privileges
select *
from DBA_NETWORK_ACL_PRIVILEGES;
-- List URLs
select *
from DBA_NETWORK_ACLS;
Por último vamos a mostrar cómo eliminar usuarios, conexiones y la ACL completa que hemos creado:
-- Delete users / roles from ACL
BEGIN
DBMS_NETWORK_ACL_ADMIN.DELETE_PRIVILEGE (
acl => 'network_access_test.xml',
principal => 'TEST_USER',
is_grant => TRUE,
privilege => 'connect');
END;
/
-- Delete URLs
BEGIN
DBMS_NETWORK_ACL_ADMIN.UNASSIGN_ACL (
acl => 'network_access_test.xml',
host => '*.yahooapis.com',
lower_port => NULL,
upper_port => NULL);
END;
/
-- Drop ACL
BEGIN
DBMS_NETWORK_ACL_ADMIN.DROP_ACL (
acl => 'network_access_test.xml');
END;
/
En este ejemplo se ha creado una ACL básica que permite acceso completo a una URL. Pero las ACL permiten controlar aspectos como los puertos a los que se tiene acceso, definición de subredes o establecer la ventana temporal en la que estará activo el acceso para cada usuario.
Para profundizar en estos aspectos se puede consultar el siguiente enlace:
http://download.oracle.com/docs/cd/B28359_01/network.111/b28531/authorization.htm#DBSEG40012