Enmascarar datos al mostrar en una consulta en Oracle

Hola a todos,
Hoy vamos a mostrar cómo se puede implementar en Oracle una politica para anonimización de los datos para que no se muestren los datos sensibles o confidenciales según quien y desde donde se hagan las consultas a la BBDD. Por ejemplo, ciertos datos sensibles, como datos médicos, datos financieros, de salario, etc, puede ser necesario que se muestren en una aplicación destinada al uso, pero que no se muestren si se accede desde una aplicación cliente como SQL Developer o Toad. Para ello es necesario enmascarar datos. Os lo contamos.

Paquete DBMS_REDACT

Para realizar la anonimización en Oracle se crean políticas de anonimización, por medio del paquete DBMS_REDACT, que se puede encontrar en la documentación de Oracle.
Estas políticas de anonimización no afectan al dato almacenado en la BBDD, sino solamente a lo que se muestra en respuesta a una SELECT.

Los datos se pueden mostrar de diferentes maneras, esto se elige al establecer la política. Las formas principales son las siguientes:

Hay varios procedimientos que se utilizan para declarar las políticas de enmascaramiento de los datos, pero los principales son:

ADD_POLICY - Se crea una nueva política para un objeto
ALTER_POLICY - Se modifica la politica, por ejemplo, añadiendo nuevas columnas
DROP_POLICY - Se borra la política

Tanto al declarar una política nueva como al añadir columnas a una política existente, hay que especificar cómo se quieren mostrar los datos, con una de las formas especificadas anteriormente, y el alcance de enmascaramiento de los datos, es decir quien puede acceder a los datos sin enmascarar y quien a los datos enmascarados.

Enmascaramiento de datos con ADD_POLICY

La sintaxis básica del procedimiento ADD_POLICY es la siguiente:

BEGIN
DBMS_REDACT.ADD_POLICY(object_schema => 'ADMINDB', object_name => 'EMPLOYEES', column_name => 'EDNI', policy_name => 'P_EMPLOYEES', function_type => DBMS_REDACT.PARTIAL, expression => '1=1');
END;
/

Donde los primeros parámetros indican el propietario y nombre del objeto al que se va a aplicar la política, la columna y el nombre de la política.
Pero hay dos parámetros interesantes que hay que revisar.
function_type – Indica cómo se van a enmascarar los datos para mostrarlos. Algunos de los valores aceptados son:

NONE – No se oculta nada
FULL – Se muestra un valor fijo
PARTIAL – Se muestra una parte del dato
RANDOM – Se muestran caracteres aleatorios

expression – Especifica a quien se va a aplicar la política. La política se aplica al usuario que ejecuta la consulta a la BBDD, según su SYS_CONTEXT, es decir, según su contexto en la BBDD. Hay varios contextos que se pueden utilizar:

(SYS_CONTEXT(‘USERENV’,’IP_ADDRESS’)!=’192.168.56.112′) — Para aplicar la política por IP

(SYS_CONTEXT(‘USERENV’,’CURRENT_SCHEMA’)!=’192.168.56.112′) — Para aplicar la política por esquemas

(SYS_CONTEXT(‘USERENV’,’MODULE’)!=’192.168.56.112′) — Para aplicar la política por programa

Para saber el SYS_CONTEXT actual en nuestra sesión, se puede ejecutar la query:

select SYS_CONTEXT('USERENV','MODULE') from dual;

Si se quiere aplicar la política a todo el mundo, el valor de expression debe ser:

1=1

Ejemplo para enmascarar datos en Oracle

Vamos a ver un ejemplo con una tabla con datos de empleados llamada EMPLOYEES del usuario ADMINDB, y las consultas de acceso a los datos se ejecutan desde un usuario ADMINCONS.

Enmascarar datos en Oracle

Se aplica políticas de enmascaramiento a las columnas EDNI, EPHONE y EEMAIL, con parámetro RANDOM para lo que se muestre y para todo el mundo.

BEGIN
DBMS_REDACT.ADD_POLICY(object_schema => 'ADMINDB', object_name => 'EMPLOYEES', column_name => 'EDNI', policy_name => 'P_EMPLOYEES', function_type => DBMS_REDACT.RANDOM, expression => '1=1');
END;
/

Procedimiento PL/SQL terminado correctamente.

BEGIN
DBMS_REDACT.ALTER_POLICY(object_schema => 'ADMINDB', object_name => 'EMPLOYEES', column_name => 'EPHONE', policy_name => 'P_EMPLOYEES', function_type => DBMS_REDACT.RANDOM, expression => '1=1');
END;
/

Procedimiento PL/SQL terminado correctamente.

BEGIN
DBMS_REDACT.ALTER_POLICY(object_schema => 'ADMINDB', object_name => 'EMPLOYEES', column_name => 'EEMAIL', policy_name => 'P_EMPLOYEES', function_type => DBMS_REDACT.RANDOM, expression => '1=1');
END;
/

Procedimiento PL/SQL terminado correctamente.

Una vez aplicada la política, el resultado de la query con el usuario ADMINCONS es:

Esperamos que os haya sido de utilidad, si necesitáis ayuda sobre vuestras BBDD o comprobar cómo se encuentran vuestros entornos, no dudéis en contactar con nosotros. Consulta nuestros servicios de tuning Oracle.

Un saludo.

Equipo de base de datos

Si quieres estar al día de todas nuestras publicaciones, regístrate en nuestra newsletter. Con un solo email al mes estarás informado.

¿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