Filtrado de datos de tabla confidenciales mediante filtros de fila y máscaras de columna

Importante

Esta característica está en versión preliminar pública.

En este artículo se proporcionan instrucciones y ejemplos sobre cómo usar filtros de fila, máscaras de columna y tablas de asignación para filtrar datos confidenciales en las tablas.

¿Qué son los filtros de fila?

Los filtros de fila permiten aplicar un filtro a una tabla para que las consultas posteriores solo devuelvan filas para las que el predicado de filtro se evalúa como true. Un filtro de fila se implementa como una función SQL definida por el usuario (UDF).

Para crear un filtro de fila, escriba primero una UDF SQL para definir la directiva de filtro y, a continuación, aplíquela a una tabla con una instrucción ALTER TABLE. Como alternativa, puede especificar un filtro de fila para una tabla en la instrucción CREATE TABLE inicial. Cada tabla solo puede tener un filtro de fila. Un filtro de fila acepta cero o más parámetros de entrada donde cada parámetro de entrada se enlaza a una columna de la tabla correspondiente.

¿Cuál es la diferencia entre estos filtros y las vistas dinámicas?

La vista dinámica es una vista abstracta de solo lectura de una o varias tablas de origen. El usuario puede acceder a la vista dinámica sin tener acceso directamente a las tablas de origen. La creación de una vista dinámica define un nuevo nombre de tabla que no debe coincidir con el nombre de ninguna tabla de origen ni de ninguna otra tabla o vistas presentes en el mismo esquema.

Por otro lado, la asociación de un filtro de fila o una máscara de columna a una tabla de destino aplica la lógica correspondiente directamente a la propia tabla sin introducir nombres de tabla nuevos. Las consultas posteriores pueden continuar haciendo referencia directamente a la tabla de destino con su nombre original.

Tanto las vistas dinámicas como los filtros de fila y las máscaras de columna permiten aplicar lógica compleja a las tablas y procesar sus decisiones de filtrado en tiempo de ejecución de la consulta.

Use vistas dinámicas si necesita aplicar lógica de transformación como filtros y máscaras a tablas de solo lectura, y si es aceptable que los usuarios hagan referencia a las vistas dinámicas con nombres diferentes. Use filtros de fila y máscaras de columna si desea filtrar o calcular expresiones sobre datos específicos y, al mismo tiempo, proporcionar a los usuarios acceso a las tablas con sus nombres originales.

Sintaxis de filtro de fila

Para crear un filtro de fila y agregarlo a una tabla existente, use la sintaxis siguiente:

Cree el filtro de fila:

CREATE FUNCTION <function_name> (<parameter_name> <parameter_type>, ...)
RETURN {filter clause whose output must be a boolean};

Aplique el filtro de fila a una tabla:

ALTER TABLE <table_name> SET ROW FILTER <function_name> ON (<column_name>, ...);

Quite un filtro de fila de una tabla:

ALTER TABLE <table_name> DROP ROW FILTER;

Modifique un filtro de fila:

Run a DROP FUNCTION statement to drop the existing function, or use CREATE OR REPLACE FUNCTION to replace it.

Elimine un filtro de fila:

ALTER TABLE <table_name> DROP ROW FILTER;
DROP FUNCTION <function_name>;

Nota:

Debe realizar el comando ALTER TABLE ... DROP ROW FILTER antes de quitar la función o la tabla estará en un estado inaccesible.

Si la tabla deja de estar accesible de esta manera, modifique la tabla y quite la referencia de filtro de fila huérfana mediante ALTER TABLE <table_name> DROP ROW FILTER;.

Ejemplos de filtros de fila

Cree una función SQL definida por el usuario aplicada a los miembros del grupo admin en la región de US.

Con esta función, los miembros del grupo admin pueden acceder a todos los registros de la tabla. Si un usuario que no es administrador llama a la función, se produce un error en la condición RETURN_IF y se evalúa la expresión region='US'. Para ello, la tabla se filtra para mostrar solo los registros en la región de US.

CREATE FUNCTION us_filter(region STRING)
RETURN IF(IS_ACCOUNT_GROUP_MEMBER('admin'), true, region='US');

Aplique la función a una tabla como filtro de fila. Las consultas posteriores de la tabla sales devuelven un subconjunto de filas.

CREATE TABLE sales (region STRING, id INT);
ALTER TABLE sales SET ROW FILTER us_filter ON (region);

Deshabilite el filtro de fila. Las consultas de usuario futuras de la tabla sales devuelven todas las filas de la tabla.

ALTER TABLE sales DROP ROW FILTER;

Cree una tabla con la función aplicada como filtro de fila como parte de la instrucción CREATE TABLE. Las consultas futuras de la tabla sales devuelven un subconjunto de filas.

CREATE TABLE sales (region STRING, id INT)
WITH ROW FILTER us_filter ON (region);

¿Qué son las máscaras de columna?

Las máscaras de columna permiten aplicar una función de enmascaramiento a una columna de tabla. La función de enmascaramiento se evalúa en tiempo de ejecución de la consulta mediante la sustitución de cada referencia de la columna de destino por los resultados de la función de enmascaramiento. En la mayoría de los casos de uso, las máscaras de columna determinan si se debe devolver el valor original de la columna o censurar en función de la identidad del usuario que realiza la invocación. Las máscaras de columna son expresiones escritas como UDF SQL.

Opcionalmente, cada columna de tabla puede tener aplicada una función de enmascaramiento. La función de enmascaramiento toma el valor sin máscara de la columna como entrada y devuelve el valor enmascarado como resultado. El valor devuelto de la función de enmascaramiento debe ser del mismo tipo que la columna que se enmascara. La función de enmascaramiento también puede tomar columnas adicionales como parámetros de entrada y usarlas en su lógica de enmascaramiento.

Para aplicar máscaras de columna, cree una función y aplíquela a una columna de tabla mediante una instrucción ALTER TABLE. Como alternativa, puede aplicar la función de enmascaramiento al crear la tabla.

Sintaxis de máscara de columna

Dentro de la cláusula MASK, puede usar cualquiera de las funciones en tiempo de ejecución integradas de Azure Databricks o llamar a otras funciones definidas por el usuario. Entre los casos de uso comunes se incluye la inspección de la identidad del usuario que realiza la invocación y ejecuta la función mediante current_user( ) o de los grupos de los que es miembro mediante is_account_group_member( ).

Cree una máscara de columna:

CREATE FUNCTION <function_name> (<parameter_name> <parameter_type>, ...)
RETURN {expression with the same type as the first parameter};

Aplique una máscara de columna a una columna de una tabla existente:

ALTER TABLE <table_name> ALTER COLUMN <col_name> SET MASK <mask_func_name> [USING COLUMNS <additional_columns>];

Quite una máscara de columna de una columna de una tabla:

ALTER TABLE <table_name> ALTER COLUMN <column where mask is applied> DROP MASK;

Modifique una máscara de columna:

DROP la función existente o use CREATE OR REPLACE TABLE.

Elimine una máscara de columna:

ALTER TABLE <table_name> ALTER COLUMN <column where mask is applied> DROP MASK;
DROP FUNCTION <function_name>;

Nota:

Debe realizar el comando ALTER TABLE antes de quitar la función o la tabla estará en un estado inaccesible.

Si la tabla deja de estar accesible de esta manera, modifique la tabla y quite la referencia de máscara huérfana mediante ALTER TABLE <table_name> ALTER COLUMN <column where mask is applied> DROP MASK;.

Ejemplos de máscaras de columna

En este ejemplo, creará una función definida por el usuario que enmascara la columna ssn para que solo los usuarios que sean miembros del grupo HumanResourceDept puedan ver los valores de esa columna.

CREATE FUNCTION ssn_mask(ssn STRING)
  RETURN CASE WHEN is_member('HumanResourceDept') THEN ssn ELSE '***-**-****' END;

Aplique la nueva función a una tabla como máscara de columna. Puede agregar la máscara de columna al crear la tabla o después.

--Create the `users` table and apply the column mask in a single step:

CREATE TABLE users (
  name STRING,
  ssn STRING MASK ssn_mask);
--Create the `users` table and apply the column mask after:

CREATE TABLE users
  (name STRING, ssn STRING);

ALTER TABLE users ALTER COLUMN ssn SET MASK ssn_mask;

Ahora, las consultas a esa tabla devuelven valores de columna ssn con máscara cuando el usuario que realiza la consulta no es miembro del grupoHumanResourceDept:

SELECT * FROM users;
  James  ***-**-****

Para deshabilitar la máscara de columna para que las consultas devuelvan los valores originales de la columnassn:

ALTER TABLE users ALTER COLUMN ssn DROP MASK;

Uso de tablas de asignación para crear una lista de control de acceso

Para lograr la seguridad de nivel de fila, considere la posibilidad de definir una tabla de asignación (o una lista de control de acceso). Cada tabla de asignación es una tabla de asignación completa que codifica las filas de datos de la tabla original a las que pueden tener acceso determinados usuarios o grupos. Las tablas de asignación son útiles porque ofrecen una integración sencilla con las tablas de hechos a través de combinaciones directas.

Esta metodología resulta beneficiosa para abordar muchos casos de uso con requisitos personalizados. Algunos ejemplos son:

  • Imposición de restricciones basadas en el usuario que ha iniciado la sesión a la vez que se admiten diferentes reglas para grupos de usuarios específicos.
  • Creación de jerarquías intrincadas, como estructuras organizativas, que requieren diversos conjuntos de reglas.
  • Replicación de modelos de seguridad complejos de sistemas de origen externos.

Al adoptar tablas de asignación de esta manera, puede abordar eficazmente estos complicados escenarios y garantizar implementaciones de seguridad de nivel de fila y columna sólidas.

Ejemplos de tablas de asignación

Uso de una tabla de asignación para comprobar si el usuario actual está en una lista:

USE CATALOG main;

Cree una nueva tabla de asignación:

DROP TABLE IF EXISTS valid_users;

CREATE TABLE valid_users(username string);
INSERT INTO valid_users
VALUES
  ('fred@databricks.com'),
  ('barney@databricks.com');

Cree un nuevo filtro:

Nota:

Todos los filtros se ejecutan con derechos del definidor, excepto las funciones que comprueban el contexto de usuario (por ejemplo, las funciones CURRENT_USER y IS_MEMBER) que se ejecutan como invocador.

En este ejemplo, la función comprueba si el usuario actual está en la tabla valid_users. Si se encuentra el usuario, la función devuelve true.

DROP FUNCTION IF EXISTS row_filter;

CREATE FUNCTION row_filter()
  RETURN EXISTS(
    SELECT 1 FROM valid_users v
    WHERE v.username = CURRENT_USER()
);

En el ejemplo siguiente se aplica el filtro de fila durante la creación de la tabla. También puede agregar el filtro más adelante mediante una instrucción ALTER TABLE. Al aplicarse a una tabla entera, use la sintaxis ON (). Para una fila específica, use ON (row);.

DROP TABLE IF EXISTS data_table;

CREATE TABLE data_table
  (x INT, y INT, z INT)
  WITH ROW FILTER row_filter ON ();

INSERT INTO data_table VALUES
  (1, 2, 3),
  (4, 5, 6),
  (7, 8, 9);

Seleccione datos de una tabla. Esta operación solo devolverá datos si el usuario está en la tabla valid_users.

SELECT * FROM data_table;

Cree una tabla de asignación que incluya cuentas que siempre deberían tener acceso para ver todas las filas de la tabla, independientemente de los valores de columna:

CREATE TABLE valid_accounts(account string);
INSERT INTO valid_accounts
VALUES
  ('admin'),
  ('cstaff');

Ahora cree una UDF SQL que devuelva true si los valores de todas las columnas de la fila son inferiores a cinco, o si el usuario que realiza la invocación es miembro de la tabla de asignación anterior.

CREATE FUNCTION row_filter_small_values (x INT, y INT, z INT)
  RETURN (x < 5 AND y < 5 AND z < 5)
  OR EXISTS(
    SELECT 1 FROM valid_accounts v
    WHERE IS_ACCOUNT_GROUP_MEMBER(v.account));

Por último, aplique la UDF SQL a la tabla como filtro de fila:

ALTER TABLE data_table SET ROW FILTER row_filter_small_values ON (x, y, z);

Compatibilidad

  • Se admiten cuadernos de Databricks SQL y Databricks para cargas de trabajo de SQL.
  • Se admiten los comandos de DML de usuarios con privilegios MODIFY. Los filtros y las máscaras se aplican a los datos leídos por las instrucciones UPDATE y DELETE y no se aplican a los datos que se escriben (incluidos los datos insertados mediante INSERT).
  • Formatos compatibles: Delta y Parquet. Parquet solo se admite para tablas administradas o externas.
  • Se admiten vistas en tablas con máscaras de columna o filtros de fila.
  • Las fuentes de distribución de datos modificados de Delta Lake se admiten siempre que el esquema sea compatible con los filtros de fila y las máscaras de columna que se pueden aplicar a la tabla de destino.
  • Se admiten tablas externas.

Limitaciones

  • Las versiones de Databricks Runtime inferiores a 12.2 LTS no admiten filtros de fila ni máscaras de columna. Estos entornos de ejecución provocan un error seguro, lo que significa que si intenta acceder a tablas de versiones no admitidas de dichos entornos de ejecución, no se devolverán datos.
  • Las tablas de streaming y vistas materializadas de Delta Live Tables no admiten filtros de fila ni máscaras de columna.
  • Las UDF de Python y Scala no se admiten como funciones de filtro de fila o máscara de columna directamente. Sin embargo, es posible hacer referencia a estas en UDF SQL siempre que sus definiciones se almacenen permanentemente en el catálogo (es decir, que no sean temporales para la sesión).
  • Delta Sharing no funciona con máscaras de columna ni seguridad de nivel de fila.
  • Viaje en el tiempo no funciona con máscaras de columna ni seguridad de nivel de fila.
  • El muestreo de tabla no funciona con máscaras de columna ni seguridad de nivel de fila.
  • El acceso basado en rutas de acceso a archivos en tablas con directivas no se admite actualmente.
  • Las directivas de filtro de fila o máscara de columna con dependencias circulares con respecto a las directivas originales no se admiten.
  • MERGE y los clones superficiales no se admiten.

Limitación de clústeres de usuario único

No agregue filtros de fila ni máscaras de columna a ninguna tabla a la que acceda desde clústeres de usuario único. Esto suele hacerse en el contexto de trabajos de Azure Databricks. Durante la versión preliminar pública, no podrá acceder a la tabla desde un clúster de usuario único una vez que se haya aplicado un filtro o una máscara.