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