Un vistazo a Lockdown Profile en 12.2

Por Jorge Zorrilla
Publicado en Mayo 2018

Revisado por Francisco Riccio



Introducción


La versión de base de datos Oracle 12c nos presentó una nueva arquitectura llamada Multitenant e introdujo nuevos roles a nivel de administración como CDB DBA y PDB DBA. Con el rol PDB DBA se le puede asignar la tarea de administración de una base de datos PDB a un usuario específico como un DBA junior mientras que la administración centralizada de toda la arquitectura Multitenant recae sobre DBAs más expertos mediante el rol CDB DBA.

Esta separación de tareas resulta bastante adecuada si la arquitectura cuenta con un gran número de base de datos PDBs. Sin embargo, el CDB DBA puede perder el control sobre operaciones y funcionalidades disponibles dentro de un PDB que pueden llegar a afectar el comportamiento global de la Instancia Multitenant.  Por ejemplo, un PDB DBA o usuarios con el privilegio “ALTER SYSTEM” pueden modificar cualquier tipo de parámetros dentro de la base de datos PDB.  No se puede restringir que parámetros se pueden cambiar y que parámetros no, inclusive el rango de valores que se le puede asignar a un parámetro dentro de la base de datos.

Oracle 12.2 introduce una nueva funcionalidad llamada Lockdown Profile que permite a los CDB DBAs poder habilitar o deshabilitar operaciones, funcionalidades y opciones de bases de datos dentro de un contendor PDB.  Puede ser muy útil para asignar la administración de un PDB a un PDB DBA sin comprometer la seguridad y los recursos de otros PDBs en la misma instancia.

En este artículo quiero explicar el uso de Lockdown Profile y las diferentes opciones que se pueden utilizar con esta funcionalidad.




Creación de Lockdown Profiles


Lockdown Profiles solo pueden ser creados en una base de datos CDB y desde el contenedor ROOT.


SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT

SQL> create lockdown profile HIGH_PROFILE;

Lockdown Profile created.



Si se intenta crear en una base de datos Non-CDB o en un PDB, se muestra el siguiente error:


SQL> create lockdown profile HIGH_PROFILE;
create lockdown profile HIGH_PROFILE
                        *
ERROR at line 1:
ORA-65090: operation only allowed in a container database


No se puede definir ninguna restricción durante la creación del Lockdown Profile.  Para poder agregar restricciones es necesario utilizar el comando ALTER LOCKDOWN PROFILE





Definición de restricciones


En un Lockdown Profile es posible definir 3 tipos de restricciones.

  • Restricción de opciones
  • Restricción de funcionalidades
  • Restricción de sentencias

En los 3 tipos se puede utilizar las opciones ENABLE o DISABLE para habilitar o deshabilitar restricciones.  También podemos utilizar las opciones ALL o EXCEPT para poder incluir o excluir un grupo de funcionalidades en lugar de definirlo de manera individual.
Veamos cada una a detalle.


Restricción de opciones

En la versión 12.2 solo existen dos opciones que se pueden habilitar o deshabilitar dentro de un Lockdown Profile.

  • DATABASE QUEUING
  • PARTITIONING

Creamos un nuevo Lockdown Profile.


SQL> create lockdown profile option_profile;

Lockdown Profile created.



Podemos habilitar o deshabilitar las opciones de diferentes maneras


SQL> alter lockdown profile option_profile enable OPTION ALL;

SQL> alter lockdown profile option_profile enable OPTION = ('PARTITIONING');




SQL> alter lockdown profile option_profile disable OPTION = ('DATABASE QUEUING');

SQL> alter lockdown profile option_profile disable OPTION ALL except = ('DATABASE QUEUING');



Para nuestro ejemplo vamos a deshabilitar la opción PARTITIONING


SQL> alter lockdown profile option_profile disable OPTION = ('PARTITIONING');

Lockdown Profile altered.



Restricción de funcionalidades

Lockdown Profile te permite habilitar o deshabilitar algunas funcionalidades de manera individual o agrupadas en paquetes. Entre los paquetes más importantes están:

  • NETWORK_ACCESS
  • OS_ACCESS
  • COMMON_SCHEMA_ACCESS

Cada paquete contiene un grupo de funcionalidades como: UTL_HTTP, UTL_TCP, FILE_TRANSFER, UTL_FILE, COMMON_USER_LOCAL_SCHEMA_ACCESS, entre otros.  La lista completa de funcionalidades se puede revisar en la documentación oficial.

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/ALTER-LOCKDOWN-PROFILE.html


Creamos un nuevo Lockdown Profile


SQL> create lockdown profile feature_profile;

Lockdown Profile created.



Podemos habilitar o deshabilitar las funcionalidades por paquete.


SQL> alter lockdown profile feature_profile enable FEATURE = ('NETWORK_ACCESS');

SQL> alter lockdown profile feature_profile disable FEATURE = ('OS_ACCESS');



Podemos habilitar o deshabilitar las funcionalidades de manera individual.


SQL> alter lockdown profile feature_profile enable FEATURE = ('UTL_HTTP', 'UTL_SMTP');

SQL> alter lockdown profile feature_profile disable FEATURE ALL except = 
('FILE_TRANSFER','COMMON_USER_LOCAL_SCHEMA_ACCESS','UTL_HTTP');



Para nuestro ejemplo solo vamos a deshabilitar la funcionalidad UTL_FILE


SQL> alter lockdown profile feature_profile disable FEATURE = ('UTL_FILE');

Lockdown Profile altered.



Restricción de Sentencias

Con la opción restricción de sentencias es posible habilitar o deshabilitar las siguientes sentencias.

  • ALTER DATABASE
  • ALTER PLUGGABLE DATABASE
  • ALTER SESSION
  • ALTER SYSTEM

Como se puede observar lo que se restringe es la definición de acciones y parámetros a nivel de sesión o sistema y modificación de características de la base de datos.

Creamos un nuevo Lockdown Profile


SQL> create lockdown profile statement_profile;

Lockdown Profile created.



Es posible habilitar o deshabilitar completamente las sentencias dentro de un PDB.


SQL> alter lockdown profile statement_profile disable STATEMENT = ('ALTER SYSTEM');

SQL> alter lockdown profile statement_profile enable STATEMENT ALL except = ('ALTER DATABASE');



Podemos realizar restricciones más detalladas con las opciones: CLAUSE, OPTION y VALUE.
Por ejemplo, podemos restringir el uso de sentencias como ALTER SYSTEM SUSPEND o ALTER SYSTEM RESUME.


SQL> alter lockdown profile statement_profile disable STATEMENT = ('ALTER SYSTEM') 
CLAUSE = ('SUSPEND', 'RESUME');



Podemos restringir el uso de FLUSH sobre el Shared Pool.


SQL> alter lockdown profile statement_profile disable STATEMENT = ('ALTER SYSTEM') 
CLAUSE = ('FLUSH SHARED_POOL');



Podemos restringir la modificación de parámetros específicos.


SQL> alter lockdown profile statement_profile disable STATEMENT = ('ALTER SYSTEM') 
CLAUSE = ('SET') OPTION = ('OPTIMIZER_MODE', 'CURSOR_SHARING');

SQL> alter lockdown profile statement_profile disable STATEMENT = ('ALTER SESSION') 
CLAUSE = ('SET') OPTION = ('nls_date_format');



También es posible restringir parámetros en un rango de valores con las opciones MINVALUE Y MAXVAULE.


SQL>  alter lockdown profile statement_profile disable STATEMENT = ('ALTER SYSTEM') 
CLAUSE = ('SET') OPTION = ('PARALLEL_MAX_SERVERS') MINVALUE= '20' MAXVALUE = '100';

SQL> alter lockdown profile statement_profile disable STATEMENT = ('ALTER SYSTEM') 
CLAUSE = ('SET') OPTION = ('CPU_COUNT') MINVALUE = '2' MAXVALUE = '4';



Para nuestro ejemplo vamos a deshabilitar la modificación de todos los parámetros a excepción de OPTIMIZER_MODE y CURSOR_SHARING


SQL> alter lockdown profile statement_profile enable STATEMENT = ('ALTER SYSTEM') 
CLAUSE = ('SET') OPTION = ('OPTIMIZER_MODE','CURSOR_SHARING');

Lockdown Profile altered.





Activación de Lockdown Profile


Una vez que tenemos definido las restricciones en diferentes Lockdown Profiles, procedemos a activarlas en cada uno de los PDBs existentes.  Para ello es necesario definir el parámetro PDB_LOCKDOWN

Utilizamos los 3 Lockdown Profile que hemos definido y realizaremos las respectivas pruebas para poder observar su comportamiento.



Activamos la restricción de opciones

Con la opción PARTITIONING deshabilitada, probamos crear una tabla particionada.


SQL> alter session set container=PDB1;

Session altered.

SQL> alter system set pdb_lockdown='OPTION_PROFILE';

System altered.




SQL> CREATE TABLE hr.ORDERS_TAB
 (
 order_id NUMBER(12),
 order_date DATE CONSTRAINT order_date_nn NOT NULL,
 order_mode VARCHAR2(8),
 customer_id NUMBER(6) CONSTRAINT order_cust_id_nn NOT NULL,
 order_status NUMBER(2),
 order_total NUMBER(8,2),
 sales_rep_id NUMBER(6),
 promotion_id NUMBER(6),
 CONSTRAINT order_mode_lov CHECK (order_mode in  ('direct','online')),
 CONSTRAINT order_total_min CHECK (order_total >= 0)
)
INDEXING OFF
 PARTITION BY RANGE (ORDER_DATE)
 (PARTITION ord_p1 VALUES LESS THAN (TO_DATE('01-MAR-2014','DD-MON-YYYY')) INDEXING ON,
  PARTITION ord_p2 VALUES LESS THAN (TO_DATE('01-JUL-2014','DD-MON-YYYY')) INDEXING OFF,
  PARTITION ord_p3 VALUES LESS THAN (TO_DATE('01-OCT-2014','DD-MON-YYYY')) INDEXING ON
/

CREATE TABLE hr.ORDERS_TAB
*
ERROR at line 1:
ORA-00439: feature not enabled: Partitioning




Activamos la restricción de funcionalidades

Observamos que activando la restricción para utilizar UTL_FILE no es posible utilizar la función FOPEN de dicho paquete.


SQL> alter session set container=PDB1;

Session altered.

SQL> alter system set pdb_lockdown='FEATURE_PROFILE';

System altered.

SQL> create directory LEE_DIR as '/home/oracle';

Directory created.



El error se presenta a pesar que se ha creado el directorio LEE_DIR. Este error se debe a la restricción por funcionalidad activada.


SQL> DECLARE
 v_farch  UTL_FILE.FILE_TYPE;
 v_line varchar2(300);
 BEGIN
  v_farch := UTL_FILE.FOPEN('LEE_DIR','MUNDO.txt','R');
  LOOP
    BEGIN
      UTL_FILE.GET_LINE(v_farch, v_line);
      DBMS_OUTPUT.PUT_LINE(v_line);
    EXCEPTION WHEN NO_DATA_FOUND THEN exit;
    END;
  END LOOP;
  UTL_FILE.FCLOSE(v_farch);
 END;
 / 
DECLARE
*
ERROR at line 1:
ORA-29280: invalid directory path
ORA-06512: at "SYS.UTL_FILE", line 41
ORA-06512: at "SYS.UTL_FILE", line 478
ORA-06512: at line 5




Activamos la restricción de sentencias

Al activar la restricción de sentencias podemos observar que no es posible modificar ningún parámetro dentro del PDB a excepción de OPTIMIZER_MODE y CURSOR_SHARING.


SQL> alter session set container=PDB1;

Session altered. 

SQL> alter system set pdb_lockdown='STATEMENT_PROFILE';

System altered.




SQL>  alter system set parallel_max_servers=40;
 alter system set parallel_max_servers=40
*
ERROR at line 1:
ORA-01031: insufficient privileges


SQL> alter system set parallel_degree_policy=AUTO;
alter system set parallel_degree_policy=AUTO
*
ERROR at line 1:
ORA-01031: insufficient privileges


SQL> alter system set optimizer_mode= first_rows;

System altered.

SQL> alter system set cursor_sharing = FORCE;

System altered.



Inclusive el mismo usuario SYS dentro de la base de datos PDB forma parte de la restricción.


SQL> connect sys@PDB1 as sysdba
Enter password:
Connected.

SQL> alter system set pdb_lockdown='FEATURE_PROFILE';
alter system set pdb_lockdown='FEATURE_PROFILE'
*
ERROR at line 1:
ORA-01031: insufficient privileges



Si deseamos desactivar las restricciones, simplemente definimos el parámetro PDB_LOCKDOWN en nulo.


SQL> alter system set pdb_lockdown='';

System altered.





Revisión de Lockdown Profile


Una vez creado los Lockdown Profiles, es posible revisar la configuración de cada uno consultando la vista DBA_LOCKDOWN_PROFILES desde el contenedor ROOT.


SQL> SELECT profile_name, rule_type, rule, clause, clause_option, option_value, status
FROM   dba_lockdown_profiles
where profile_name like '%PROFILE%'
ORDER BY 1;

PROFILE_NAME         RULE_TYPE            RULE                 CLAUSE     CLAUSE_OPTION        
-------------------- -------------------- -------------------- ---------- -------------------- 
FEATURE_PROFILE      FEATURE              UTL_FILE
HIGH_PROFILE                                                                                                       
OPTION_PROFILE       OPTION               ALL
OPTION_PROFILE       OPTION               DATABASE QUEUING
STATEMENT_PROFILE    STATEMENT            ALTER SYSTEM         SET        OPTIMIZER_MODE
STATEMENT_PROFILE    STATEMENT            ALTER SYSTEM         SET        CURSOR_SHARING
STATEMENT_PROFILE    STATEMENT            ALTER SYSTEM
STATEMENT_PROFILE    STATEMENT            ALTER SYSTEM         SET

OPTION_VALUE         STATUS
-------------------- -------
                     DISABLE
                     EMPTY
                     DISABLE
                     ENABLE
                     ENABLE
                     ENABLE
                     DISABLE
                     DISABLE
                     
                     




Conclusión


Lockdown Profile es una funcionalidad muy poderosa que permite restringir a usuarios realizar solo las operaciones necesarias según el rol que poseen. Nos permite manejar de manera granular la seguridad sobre las diferentes bases de datos PDBs desde el contenedor ROOT.  Sin embargo, es importante tener bien claro las restricciones que se van a definir en cada Lockdown Profile ya que se puede llegar a restringir más de lo que se tiene planificado.



Ing. Jorge Zorrilla. Es un especialista IT en tecnologías Oracle e instructor de cursos oficiales de certificación Oracle. Con más de 9 años de experiencia en soluciones con tecnología Oracle como Alta Disponibilidad, Continuidad de negocios y Modernización de la infraestructura. Fue uno de los primeros especialistas en Latinoamérica con la certificación OCP Oracle12c y Oracle Maximum Availability 12c. 
En la actualidad Jorge Zorrilla se dedica a mantener relaciones estratégicas con sus clientes en Perú mediante su empresa IDB consulting.

Este artículo ha sido revisado por el equipo de productos Oracle y se encuentra en cumplimiento de las normas y prácticas para el uso de los productos Oracle.