La
versión de base de datos Oracle 12c nos presentó una nueva arquitectura llamada
Multitenant. Gracias a esta nueva
arquitectura se 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
especifico 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 o 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 definir una a
una.
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 AQUI.
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 mas 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 OPTION_VALUE STATUS
--------------------
-------------------- -------------------- ---------- --------------------
-------------------- -------
FEATURE_PROFILE FEATURE UTL_FILE
DISABLE
HIGH_PROFILE
EMPTY
OPTION_PROFILE OPTION ALL
DISABLE
OPTION_PROFILE OPTION DATABASE QUEUING
ENABLE
STATEMENT_PROFILE STATEMENT ALTER SYSTEM SET OPTIMIZER_MODE ENABLE
STATEMENT_PROFILE STATEMENT ALTER SYSTEM SET CURSOR_SHARING ENABLE
STATEMENT_PROFILE STATEMENT ALTER SYSTEM
DISABLE
STATEMENT_PROFILE STATEMENT ALTER SYSTEM SET
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 mas de lo que se tiene planificado.
Espero les pueda servir
No hay comentarios.:
Publicar un comentario