Data Masking con DBMS_REDACT en oracle

Hola a todos,
Hoy vamos a contar una opción que nos ofrece Oracle para enmascarar los datos sensibles, si no se quieren mostrar a la hora de hacer consultas sobre esos datos, para usuarios que no tengan permiso para verlos.
Es una característica muy util cuando se hacen refrescos de la BBDD en PROD a los entornos anteriores de pruebas.
Hasta hace relativamente poco tiempo, si se querían enmascarar los datos sensibles en un entorno de desarrollo había que hacer una cantidad grande de updates, a veces en tablas muy grandes, que consumían mucho tiempo y recursos.

Esto se puede realizar por medio del paquete DBMS_REDACT, configurando políticas de acceso a las columnas sensibles según la necesidad concreta.

Paquete DBMS_REDACT

Para las pruebas que se van a realizar para ver los datos enmascarados se utilizará la tabla EMPLOYEES del esquema de ejemplo de la BBDD HR.

Para realizar el enmascaramiento de los datos se utiliza el paquete de Pl/Sql DBMS_REDACT, cuya documentación se puede consultar aquí. El enmascaramiento se realiza por medio de políticas, utilizando el procedure ADD_POLICY. Esta forma de enmascaramiento de los datos nos ofrece una de las grandes ventajas de este método, los datos originales guardados en las tablas no se tocan, siguen estando los datos originales.

Utilizando el paquete DBMS_REDACT se pueden enmascarar datos de los siguientes tipos de datos:
– Tipos LOB
– Tipos Number
– Tipos Varchar
– Tipos Date

Añadir una política. DBMS_REDACT.ADD_POLICY

Para añadir una política de enmascaramiento se utiliza el procedure ADD_POLICY.
La sintaxis general de este procedimiento es la siguiente:

DBMS_REDACT.ADD_POLICY (
   object_schema                IN    VARCHAR2 := NULL,
   object_name                  IN    VARCHAR2,
   policy_name                  IN    VARCHAR2,
   column_name                  IN    VARCHAR2 := NULL,
   function_type                IN    BINARY_INTEGER := DBMS_REDACT.FULL,
   function_parameters          IN    VARCHAR2 := NULL,
   expression                   IN    VARCHAR2,
   enable                       IN    BOOLEAN := TRUE,
   regexp_pattern               IN    VARCHAR2 := NULL,
   regexp_replace_string        IN    VARCHAR2 := NULL,
   regexp_position              IN    BINARY_INTEGER := 1,
   regexp_occurrence            IN    BINARY_INTEGER := 0,
   regexp_match_parameter       IN    VARCHAR2 := NULL,
   policy_description           IN    VARCHAR2 := NULL,
   column_description           IN    VARCHAR2 := NULL);

Las posibilidades son infinitas. Es muy interesante las flexibilidad que ofrece el uso de patrones con regexp, que trataremos más adelante, ya que no es un concepto simple.

Para escoger el tipo de enmascaramiento se utiliza el parámetro function_type, y hay varios tipos de enmascaramiento:
– DBMS_REDACT.NONE – No hay ningún enmascaramiento.
– DBMS_REDACT.FULL – Se enmascara a valores fijos. Es el modo por defecto.
– DBMS_REDACT.RANDOM – Se enmascara con valores aleatorios.
– DBMS_REDACT.PARTIAL – Se enmascara una parte de la columna.
– DBMS_REDACT.REGEXP – Se utilizan patrones o expresiones regulares para el enmascaramiento de las columnas.

La forma simple de uso de este procedimiento es muy sencilla. Se va a ejecutar un ejemplo para enmascarar el salario de los empleados, columna SALARY en la tabla EMPLOYEES.

Añadir una política. DBMS_REDACT.FULL

La forma simple de uso de este procedimiento es muy sencilla. Se va a ejecutar un ejemplo para enmascarar el salario de los empleados, columna SALARY en la tabla EMPLOYEES.

SQL> begin
  2    dbms_redact.add_policy(
  3      object_schema => 'HR',
  4      object_name   => 'EMPLOYEES',
  5      column_name   => 'SALARY',
  6      policy_name   => 'policy_salary_full',
  7      function_type => dbms_redact.full,
  8      expression    => '1=1'
  9    );
 10  end;
 11  /

PL/SQL procedure successfully completed.

Hay dos vistas del diccionario de datos donde se puede revisar las políticas que hay creadas en la BBDD y el tipo de enmascaramiento que utilizan.

SQL> select OBJECT_OWNER,OBJECT_NAME,POLICY_NAME,EXPRESSION,ENABLE from redaction_policies;

OBJECT_OWNER                   OBJECT_NAME                    POLICY_NAME                                        EXPRESSION                     ENABLE
------------------------------ ------------------------------ -------------------------------------------------- ------------------------------ ------
HR                             EMPLOYEES                      policy_salary_full                                 1=1                            YES

1 fila seleccionada.

SQL>
SQL> select OBJECT_OWNER,OBJECT_NAME,POLICY_NAME,EXPRESSION,ENABLE from redaction_policies;

OBJECT_OWNER                   OBJECT_NAME                    POLICY_NAME                                        EXPRESSION                     ENABLE
------------------------------ ------------------------------ -------------------------------------------------- ------------------------------ ------
HR                             EMPLOYEES                      policy_salary_full                                 1=1                            YES

1 fila seleccionada.

Si se ejecuta la consulta para ver como realiza el enmascaramiento

El salario de los empleados se representa con un 0, un valor fijo sin importar cual sea el valor de la columna.

Con un usuario con permisos de DBA se ignora el enmascaramiento de la columna. Si se intenta ejecutar el mismo ejemplo con el usuario SYSTEM se ven los datos reales sin enmascarar.

Añadir una política. DBMS_REDACT.RANDOM

Si se establece un enmascaramiento Random se establecen valores aleatorios para la columna enmascarada.

SQL> begin
  2    dbms_redact.add_policy(
  3      object_schema => 'HR',
  4      object_name   => 'EMPLOYEES',
  5      column_name   => 'SALARY',
  6      policy_name   => 'policy_salary_random',
  7      function_type => dbms_redact.random,
  8      expression    => '1=1'
  9    );
 10  end;
 11  /

Procedimiento PL/SQL terminado correctamente.

Si se ejecuta el mismo ejemplo

Añadir una política. DBMS_REDACT.PARTIAL

Si se ejecuta el enmascaramiento de tipo PARTIAL, hay que establecer la condición de sustitución en la columna.

SQL> begin
  2    dbms_redact.add_policy(
  3      object_schema => 'HR',
  4      object_name   => 'EMPLOYEES',
  5      column_name   => 'SALARY',
  6      policy_name   => 'policy_salary_partial',
  7      function_type => dbms_redact.partial,
  8  function_parameters  => '7,1,5',
  9      expression    => '1=1'
 10    );
 11  end;
 12  /

Procedimiento PL/SQL terminado correctamente.

En este caso el parámetro function_parameters es el que establece la condición de sustitución. En el caso del ejemplo, los valores ‘7,1,5’ indican que se va a sustituir por 7, desde la posición 1, 5 posiciones. Si tiene menos de 5 dígitos el salario se sustituyen todos los valores, pero si el salario tiene más de 5 dígitos solo se sustituyen los 5 primeros y los siguientes conservan el valor original.

Con esto hemos mostrado una parte básica del enmascaramiento de datos, pero permite muchas posibilidades a la hora de mostrar los datos enmascarados.

Esperamos que os haya resultado de utilidad. No dudéis en poneros en contacto con nosotros en caso de necesitar ayuda en la gestión de vuestras bases de datos. Échale un vistazo a nuestros servicios de soporte y mantenimiento Oracle.

¿Aún no conoces Query Performance? Descubre cómo puede ayudarte en tu entorno Oracle. Más información en su página de LinkedIn.

Sígue a GPS en LinkedIn

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *