[ 2021-01-19 ]

Oracle 21c: Common Mandatory Profiles

Oracle Database 21c incorpora la posibilidad de forzar restricciones en cuanto a la longitud y composición de las contraseña en las PDBs. Esto se puede realizar, creando un perfil mandatorio (“mandatory profile”) en el CDB raíz y aplicándolo luego a una, varias o todas las PDBs.

El perfil mandatorio, es un nuevo tipo de perfil genérico donde sólo pueden ser configurados los parámetros password_verify_function y password_grace_time para determinar la longitud de la contraseña. 
Para crearlo se utiliza la sentencia:

SQL> create mandatory profile ...

Este perfil agrega una verificación de longitud mínima de contraseña a los perfiles locales que están asociados con los usuarios de las PDBs por medio de una función de validación.

Definido en el contenedor raíz (CDB $ ROOT),  actúa como un perfil de usuario que está permanentemente activo. Los límites definidos en este, se aplican de manera adicional a los límites existentes del perfil que tenga asignado el usuario. Esto crea un efecto de unión ya que la función de verificación de complejidad de la contraseña del perfil mandatorio se ejecutará antes que la propia función (si es que la hubiera) del perfil asignado a la cuenta de usuario.

Esto quiere decir que la longitud de la contraseña definida en el perfil mandatorio tendrá prioridad sobre cualquier longitud de contraseña definida en otro perfil asociado al usuario.

Al poder ser creado o modificado solamente desde el CDB $ ROOT, un administrador de PDB no puede eliminar el requisito de complejidad de contraseña impuesto por el perfil mandatorio  facilitando de esta manera que los usuarios puedan establecer contraseñas más cortas e inseguras.

Para usar este tipo de perfiles, debemos primero crear (o modificar) una función de verificación de contraseña, definiendo allí las restricciones en cuanto a longitud y composición, ejecutar luego la sentencia CREATE MANDATORY PROFILE indicando la función de validación que generamos, en el parámetro PASSWORD_VERIFY_FUNCTION, y por ultimo configurar el parámetro de inicio MANDATORY_USER_PROFILE en la raíz del CDB para aplicarlo a las PDBs sobre las cuales queremos forzar la verificación.

Las tareas básicas necesarias que debemos realizar para implementar esta funcionalidad son:

  •  Establecer una función de  validación de contraseña.
  •  Crear un perfil mandatorio utilizando la función.
  •  Asignar el perfil mandatorio a una, varias o todas las PDBs.

Veamos un ejemplo de cómo hacerlo:

Creación o modificación de una función de complejidad de contraseña.

Creamos una función de verificación de contraseña con las restricciones que queremos implementar.
Ej.: pdb_mandatory_verify_function_01 donde validamos una longitud mínima de 10 caracteres.


SQL> create or replace function pdb_mandatory_verify_function_01
 ( username     varchar2,
   password     varchar2,
   old_password varchar2)
 return boolean IS
begin
   -- mandatory verify function will always be evaluated regardless of the
   -- password verify function that is associated to a particular profile/user
   -- requires the minimum password length to be 10 characters
   if not ora_complexity_check(password, chars => 10) then
      return(false);
   end if;
   return(true);
end;
/   
Function created.

En este caso utilizamos la función ora_complexity_check dentro de la función de verificación, podemos evaluar también otras condiciones de complejidad de la contraseña como cantidad de  mayúsculas, minúsculas, dígitos y  caracteres especiales. Esta función es llamada originalmente por la función ora12c_strong_verify_function y su definición la podemos encontrar en {ORACLE_HOME} /rdbms/admin/catpvf.sql.

Ejemplo:
ora_complexity_check (password, chars => 9, upper => 2, lower => 2, digit => 2, special => 2)

Creación de un profile mandatorio:

Para crear un perfil mandatorio genérico en el contenedor raíz,  es necesario especificar la palabra clave MANDATORY en la sentencia CREATE PROFILE.

SQL> CREATE MANDATORY PROFILE c##mandatory_profile_01 LIMIT PASSWORD_VERIFY_FUNCTION pdb_mandatory_verify_function_01 CONTAINER=ALL;

A diferencia de la creación de un profile tradicional, en este caso solamente podemos utilizar y  establecer los parámetros  password_verify_function y password_grace_time para definir los límites de este perfil.

Con el parámetro PASSWORD_VERIFY_FUNCTION indicamos la función de verificación.

El parámetro alternativo PASSWORD_GRACE_TIME, en este caso permite especificar un período de gracia para las cuentas de usuario que infrinjan los requisitos obligatorios de complejidad de contraseñas, y cuyas contraseñas deben ser necesariamente modificadas. Por ejemplo, en los esquemas importados utilizando datapump,  Oracle comprueba el cumplimiento de la restricciones de contraseña impuestas con el perfil mandatorio y si no cumple con ellas se fuerza a cambiarla posteriormente. Si la contraseña no es cambiada dentro del período de gracia, se rechazarán posteriormente más conexiones.

El valor predeterminado de password_verify_function es nulo y el de password_grace_time es 0.

SQL> SELECT resource_name, limit, mandatory FROM cdb_profiles
     WHERE profile='C##MANDATORY_PROFILE_01' AND resource_type='PASSWORD';
 
RESOURCE_NAME                  LIMIT                          MAN 
------------------------------ ------------------------------ ---
PASSWORD_VERIFY_FUNCTION       FROM ROOT                      YES
FAILED_LOGIN_ATTEMPTS                                         YES
PASSWORD_LIFE_TIME                                            YES
PASSWORD_REUSE_TIME                                           YES
PASSWORD_REUSE_MAX                                            YES
PASSWORD_LOCK_TIME                                            YES
PASSWORD_GRACE_TIME                                           YES
INACTIVE_ACCOUNT_TIME                                         YES
PASSWORD_ROLLOVER_TIME                                        YES
PASSWORD_VERIFY_FUNCTION       PDB_MANDATORY_VERIFY_FUNCTION  YES
FAILED_LOGIN_ATTEMPTS                                         YES
PASSWORD_LIFE_TIME                                            YES
PASSWORD_REUSE_TIME                                           YES
PASSWORD_REUSE_MAX                                            YES
PASSWORD_LOCK_TIME                                            YES
PASSWORD_GRACE_TIME                                           YES
INACTIVE_ACCOUNT_TIME                                         YES
PASSWORD_ROLLOVER_TIME                                        YES

18 rows selected.

Configuración del parámetro MANDATORY_USER_PROFILE

Utilizando el parámetro de inicio MANDATORY_USER_PROFILE podemos definir si utilizaremos o no un perfil mandatorio y cual será.

El valor de este parámetro se puede establecer a nivel root del CDB o para algunas PDBs en particular.

Cuando se establece en el CDB $ ROOT, el perfil de usuario mandatorio especificado se aplica al CDB y a todos los PDBs que contiene.

Cuando se establece a nivel PDB, el perfil de usuario obligatorio especificado se aplica sólo a esa PDB y anula la restricción impuesta por el perfil mandatorio definido en el CDB$ROOT (si es que lo hubiera).

Sólo los usuarios “comunes”, con el privilegio ALTER SYSTEM o SYSDBA granteado “commonly”, pueden establecer el valor de parámetro MANDATORY_USER_PROFILE en la raíz del CDB o en una PDB. Esto evita que los administradores locales de PDBs puedan eludir cualquier restricción que se aplique en el CDB$ROOT.

SQL> show con_name;
 
CON_NAME
------------------------------
CDB$ROOT
 
SQL> alter system set mandatory_user_profile=C##MANDATORY_PROFILE_01;
 
System altered.
 
SQL> SHOW PARAMETER mandatory_user_profile
 
NAME                              TYPE      VALUE
--------------------------------- --------- -----------------------
mandatory_user_profile            string    C##MANDATORY_PROFILE_01

Está previsto que la función de verificación de contraseña del “mandatory profile” se aplique utilizando el parámetro MANDATORY_USER_PROFILE desde el CDB$ROOT, esto implica que la restricción siempre es obtenida y ejecutada desde la raiz y por consecuencia se aplica a todas las PDBs en la base de datos contenedor.
En el caso de querer hacerlo en una PDB en particular, debemos indicar y posicionarnos en el contenedor correspondiente:

SQL> alter session set container=PDB1;
SQL> show con_name;
 
CON_NAME
------------------------------
PDB1
 
SQL> alter system set mandatory_user_profile= C##MANDATORY_PROFILE_01;
 
System altered.

Podríamos también generar diferentes “mandatory profiles” con distintas restricciones para utilizar en diferentes PDBs o grupo de ellas.

Algunas restricciones a tener en cuenta:

Sólo los usuarios comunes a los que se les ha otorgado el privilegio de sistema ALTER PROFILE de manera “commonly” pueden modificar o eliminar el perfil obligatorio, y siempre haciéndolo desde la raíz del CDB.

Solo un usuario común al que se le haya otorgado el privilegio ALTER SYSTEM o que tenga el privilegio administrativo SYSDBA puede modificar MANDTORY_USER_PROFILE en el archivo init.ora.

Realizamos una pequeña prueba:

Creamos un nuevo usuario en la PDB que tenga asignado el perfil mandatorio:

 
SQL> CONNECT system@PDB1
 
Enter password: *********
 
Connected.
 
 
SQL> CREATE USER sdalessandro IDENTIFIED BY oracle;
 
CREATE USER sdalessandro IDENTIFIED BY oracle
 
*
 
ERROR at line 1:
 
ORA-28219: password verification failed for mandatory profile
 
ORA-20000: password length less than 10 characters

Al utilizar una contraseña menor a 10 caracteres, devuelve el error de longitud.

Probamos con una contraseña  que cumpla la validación:

SQL> CREATE USER sdalessandro IDENTIFIED BY oracle12345;
 
User created.
 
En este caso, con una contraseña mayor o igual a 10 caracteres, no hay incovenientes para crear al usuario.

Conclusión
Esta nueva característica, resulta una herramienta más que interesante para fortalecer la implementación de mejoras en cuanto seguridad y “compliance” en ambientes multitenant.
Personalmente, creo que centralizar aspectos críticos de seguridad en la raíz del CDB permite reducir bastante la superficie ante eventuales ataques, además de minimizar los posibles puntos de falla, error y control.

1 comentario:

  1. Harrah's Cherokee Casino - Smarter
    Harrah's Cherokee Casino 강원도 출장마사지 features 청주 출장마사지 deluxe accommodations, fine dining, a wide 포항 출장안마 variety of entertainment attractions and shopping. In 김해 출장마사지 addition 성남 출장샵 to an Address: 777 Casino Drive

    ResponderEliminar