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
