Troubleshoot: ocultar datos sin cambiar las aplicaciones

Debido a una nueva política de privacidad, uno de mis Clientes se estaba preparando para modificar sus aplicaciones de forma que se ocultaran algunos datos bajo condiciones específicas.

La información se registra en bases de datos distribuidas por todo el país y se consolidan periódicamente en una base de datos centralizada, la cual es consultada mediante una aplicación Web.

Entre las alternativas que estaban considerando se incluía el actualizar periódicamente las columnas para borrar sus contenidos, mientras se trabajaba en reconfigurar las rutinas de consolidación de datos para que finalmente se dejara de transferir esos datos en particular.

Ya estaban por empezar a trabajar en ello cuando afortunadamente me consultaron si había una mejor forma de lograr este objetivo, y quedaron complacidos cuando les dije que podía lograrse sin cambiar nada y en menos de 30 minutos!

Veamos cómo se logra esa magia gracias al column masking con Oracle VPD.

El problema

Mediante una aplicación Web se puede consultar la información de la base de datos centralizada, pero por temas legales se hace necesario ocultar ciertos datos para determinadas filas.

Para respetar el Acuerdo de Confidencialidad reemplazaremos el escenario real por uno en el que tomaremos como base la siguiente consulta, hecha a las tablas del esquema SH, que viene como parte de los ejemplos de Oracle.

Lo que se necesita es ocultar los datos de la venta: TIME_ID, QUANTITY_SOLD y AMOUNT_SOLD, pero solo si el producto corresponde a la categoría Golf, que para nuestro resultado viene a ser la tercera fila.

SELECT prod_name 
  FROM sh.products 
 WHERE prod_category = 'Golf';

PROD_NAME
-------------------------------------
Right-Handed Graphite Shaft Iron Set
Lithium Electric Golf Caddy           <-----

La solución

Oracle Virtual Private Database es una funcionalidad que permite limitar el acceso a nivel de fila y también de columna.

Cuando se tiene acceso a una tabla configurada con VPD, se crea un WHERE dinámico para identificar las filas a las que se les debe aplicar o no restricciones, usando para ello una función que retorna la condición a evaluar.

Entonces, el primer paso es crear esta función, tal como vemos a continuación:

CREATE OR REPLACE FUNCTION sh.vpd_condition (
  object_schema IN VARCHAR2, 
  object_name   IN VARCHAR2)
RETURN VARCHAR2 AS
  condition VARCHAR2 (100);
BEGIN
  condition := 'prod_id NOT IN ( SELECT prod_id FROM sh.products WHERE prod_category = ''Golf'' )';
  RETURN (condition);
END vpd_condition;
/

En la línea 7 vemos cómo se genera la condición, que en pocas palabras se traduce en: mostrar los datos sin restricciones si el código de producto no está en la lista de productos de la categoría Golf.

El siguiente paso es crear la política que asocia la tabla con la función, mediante un llamado a DBMS_RLS.ADD_POLICY.

BEGIN
  DBMS_RLS.ADD_POLICY (
    object_schema         => 'SH',
    object_name           => 'SALES',
    policy_name           => 'HIDE_COLUMNS',
    function_schema       => 'SH',
    policy_function       => 'VPD_CONDITION',
    policy_type           => DBMS_RLS.SHARED_STATIC,
    sec_relevant_cols     => 'QUANTITY_SOLD,AMOUNT_SOLD,TIME_ID',
    sec_relevant_cols_opt => DBMS_RLS.ALL_ROWS);
END;
/

En la línea 9 vemos como se listan las columnas que nos interesa ocultar.

No hay más que hacer, ya tenemos todo listo, así que procedamos a repetir la consulta para ver qué pasa.

¡Excelente! Ahora ya no es posible ver los datos de las columnas restringidas, pero solo para las filas que tienen un producto de la categoría Golf, para todos los demás casos son plenamente visibles.

Con este resultado dimos el caso por cerrado y mi Cliente quedó plenamente satisfecho: en pocos minutos su problema estaba resuelto, y no tuvo que hacer ningún cambio en sus aplicaciones!

Para complementar lo aquí expuesto, les recomiendo la lectura de la nota:

414230.1How To Restrict The Access To Specific Columns Without Creating Views

Posts Recientes

Register ACFS file system fails
Aprenda cómo registrar un filesystem ACFS luego de migrar el Disk Group que lo contiene a un nuevo Cluster Oracle.
Setting incremental statistics for partitioned tables
Si implementaste estadísticas incrementales en versiones previas a Oracle 12.2, puede que no estés aprovechando todas sus ventajas. ¡Aprende a hacerlo!
if there is an unusable index when analyze is executed, expect ORA-1502
Sobre cómo un error causado por ejecutar analyze a una tabla con indices unusable es resuelto con expresiones regulares y dbms_stats.
We need to add new disks to Disk Group
¿Estás por añadir, remover o reemplazar discos en ASM? Puede que no estés haciéndolo de la forma más eficiente. Aprende cómo.
Case sensitive comparison
Sabias que AutoUpgrade falla si los nombres de los servidores no están en minúsculas y estás trabajando con una base de datos RAC One Node.
OEM shows incorrect value for used space
Qué hacer cuando Oracle reporta un valor incorrecto para el espacio usado en Fast Recovery Area.

¿Necesitas Ayuda?

Completa estos datos y estaré en contacto a la brevedad.