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.1 | How To Restrict The Access To Specific Columns Without Creating Views |
Posts Recientes





