Compartir vía


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

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. Estas características requieren Unity Catalog.

¿Qué son los filtros de fila?

Los filtros de filas le permiten aplicar un filtro a una tabla para que las consultas devuelvan solo las filas que cumplan los criterios del filtro. Se implementa un filtro de filas como una función SQL definida por el usuario (UDF). También se admiten UDF de Python y Scala, pero solo cuando se encapsulan en UDF de SQL.

¿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 de SQL o como UDF de Python o Scala que se encapsulan en UDF de SQL.

Cada columna de tabla solo puede tener una función de enmascaramiento aplicada. 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.

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

Las vistas dinámicas, 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 consultas.

Una vista dinámica es una vista abstracta de solo lectura de una o varias tablas de origen. El usuario puede acceder a una 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 seguir haciendo referencia directamente a la tabla de destino con su nombre original.

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. Si quiere filtrar los datos cuando los comparta usando Delta Sharing, deberá usar vistas dinámicas. 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.

Antes de empezar

Para agregar filtros de fila y máscaras de columna a tablas, debe tener:

También debe cumplir los siguientes requisitos:

  • Para asignar una función que agrega filtros de fila o máscaras de columna a una tabla, debe tener el privilegio EXECUTE en la función, USE SCHEMA en el esquema y USE CATALOG en el catálogo primario.
  • Si va a agregar filtros o máscaras al crear una tabla nueva, también debe tener el privilegio CREATE TABLE en el esquema.
  • Si va a agregar filtros o máscaras a una tabla existente, debe ser el propietario de la tabla o tener los privilegios MODIFY y SELECT en la tabla.

Para acceder a una tabla que tenga filtros de filas o máscaras de columnas, su recurso de proceso debe cumplir uno de estos requisitos:

  • Un almacén de SQL.

  • Modo de acceso compartido en Databricks Runtime 12.2 LTS o posterior.

  • Modo de acceso de usuario único en Databricks Runtime 15.4 LTS o superior.

    No se pueden leer filtros de fila ni máscaras de columna mediante el proceso de usuario único en Databricks Runtime 15.3 o inferior.

    Para aprovechar el filtrado de datos proporcionado en Databricks Runtime 15.4 LTS y versiones posteriores, también debe comprobar que el área de trabajo está habilitada para el proceso sin servidor, porque la funcionalidad de filtrado de datos que admite filtros de fila y máscaras de columna se ejecuta en un proceso sin servidor. Por lo tanto, es posible que se le cobre por los recursos de proceso sin servidor cuando se usa un proceso de usuario único para leer tablas que usan filtros de fila o máscaras de columna. Consulte Control de acceso específico sobre el proceso de un solo usuario.

Aplicar un filtro de fila

Para crear un filtro de filas, escriba una función (UDF) para definir la directiva del filtro y después aplíquela a una tabla. 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.

Puede aplicar un filtro de filas usando el Explorador de catálogos o comandos SQL. Las instrucciones del Explorador de catálogos suponen que ya ha creado una función y que está registrada en Unity Catalog. Las instrucciones SQL incluyen ejemplos de creación de una función de filtro de filas y su aplicación a una tabla.

Explorador de catálogo

  1. En el área de trabajo de Azure Databricks, haga clic en Icono de catálogo Catálogo.
  2. Navegue o busque la tabla que quiere filtrar.
  3. En la pestaña Información general, haga clic en Filtro de fila: agregar filtro.
  4. En el cuadro de diálogo Agregar filtro de filas, seleccione el catálogo y el esquema que contienen la función de filtro y, después, seleccione la función.
  5. En el cuadro de diálogo expandido, visualice la definición de la función y seleccione las columnas de la tabla que coincidan con las columnas incluidas en la instrucción de la función.
  6. Haga clic en Agregar.

Para eliminar el filtro de la tabla, haga clic en Filtro de fila fx y haga clic en Eliminar.

SQL

Para crear un filtro de filas y después agregarlo a una tabla existente, use CREATE FUNCTION y aplique la función usando ALTER TABLE. También puede aplicar una función al crear una tabla usando CREATE TABLE.

  1. Cree el filtro de fila:

    CREATE FUNCTION <function_name> (<parameter_name> <parameter_type>, ...)
    RETURN {filter clause whose output must be a boolean};
    
  2. Aplique el filtro de filas a una tabla usando un nombre de columna:

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

Ejemplos de sintaxis adicionales:

  • Aplique el filtro de fila a una tabla mediante una constante literal que coincida con un parámetro de función:

    ALTER TABLE <table_name> SET ROW FILTER <function_name> ON (<constant_literal>, ...);
    
  • 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 ejecutar el comando ALTER TABLE ... DROP ROW FILTER antes de anular la función. Si no lo hace, la tabla quedará 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;.

Consulte también la Cláusula ROW FILTER.

Ejemplos de filtros de fila

Este ejemplo crea una función SQL definida por el usuario que se aplica a los miembros del grupo admin en la región US.

Cuando se aplica esta función de ejemplo a la tabla sales, 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 filas 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);

Aplicación de una máscara de columna

Para aplicar una máscara de columna, cree una función (UDF) y aplíquela a una columna de tabla.

Puede aplicar una máscara de columna mediante el Explorador de catálogos o comandos SQL. Las instrucciones del Explorador de catálogos suponen que ya ha creado una función y que está registrada en Unity Catalog. Las instrucciones SQL incluyen ejemplos de creación de una función de máscara de columna y su aplicación a una columna de la tabla.

Explorador de catálogo

  1. En el área de trabajo de Azure Databricks, haga clic en Icono de catálogo Catálogo.
  2. Navegue o busque la tabla.
  3. En la pestaña Información general, busque la fila a la que quiere aplicar la máscara de columna y haga clic en el icono de edición icono EditarMáscara.
  4. En el cuadro de diálogo Agregar máscara de columna, seleccione el catálogo y el esquema que contienen la función de filtro y, después, seleccione la función.
  5. En el cuadro de diálogo expandido, vea la definición de la función. Si la función incluye parámetros además de la columna que se enmascara, seleccione las columnas de tabla a las que desea convertir esos parámetros de función adicionales.
  6. Haga clic en Agregar.

Para eliminar la máscara de columna de la tabla, haga clic en Máscara de columna fx en la fila de la tabla y haga clic en Eliminar.

SQL

Para crear una máscara de columna y agregarla a una columna de tabla existente, use CREATE FUNCTION y aplique la función de enmascaramiento usando ALTER TABLE. También puede aplicar una función al crear una tabla usando CREATE TABLE.

Use SET MASK para aplicar la función de enmascaramiento. 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 la obtención de los grupos de los que es miembro mediante is_account_group_member( ). Para más detalles, consulte Cláusula de máscara de columna y Funciones incorporadas.

  1. Cree una máscara de columna:

    CREATE FUNCTION <function_name> (<parameter_name> <parameter_type>, ...)
    RETURN {expression with the same type as the first parameter};
    
  2. Aplique la 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>;
    

Ejemplos de sintaxis adicionales:

  • Aplique la máscara de columna a una columna de una tabla existente mediante una constante literal que coincida con un parámetro de función:

    ALTER TABLE <table_name> ALTER COLUMN <col_name> SET MASK <mask_func_name> USING COLUMNS (<constant_name>, ...);
    
  • 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;
    
  • Modificar 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 valid_users tabla. 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 y limitaciones

Los filtros de fila y las máscaras de columna no se admiten con toda la funcionalidad de Azure Databricks ni en todos los recursos de proceso. En esta sección se enumeran las funcionalidades admitidas y limitaciones.

Características y formatos admitidos

Esta lista de funcionalidades admitidas no es exhaustiva. Algunos elementos se muestran porque no se admitieron durante la Versión preliminar pública.

  • Se admiten cuadernos de Databricks SQL y Databricks para cargas de trabajo de SQL.

  • Se admiten comandos DML por parte de los usuarios con privilegios de MODIFY. Los filtros y las máscaras se aplican a los datos que se leen mediante las instrucciones UPDATE y DELETE y no se aplican a los datos que se escriben (incluido INSERT).

  • Formatos de datos admitidos:

    • Delta y Parquet para tablas administradas y externas.
    • Otros múltiples formatos de datos para tablas externas registradas en Unity Catalog usando Federación de Lakehouse.
  • Los parámetros de directiva pueden incluir expresiones constantes (cadenas, numéricas, intervalos, booleanos, valores nulos).

  • Las UDF de SQL, Python y Scala son compatibles como funciones de filtro de filas o máscara de columnas, siempre que estén registradas en Unity Catalog. Las UDF de Python y Scala deben encapsularse en una UDF de SQL.

  • Puede crear vistas en tablas que hacen referencia a máscaras de columna o filtros de fila, pero no puede agregar máscaras de columna ni filtros de fila a una vista.

  • 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 aplican a la tabla de destino.

  • Se admiten tablas externas.

  • Se admite el muestreo de tablas.

  • Las instrucciones MERGE son compatibles cuando las tablas de origen, las de destino o ambas usan filtros de filas y máscaras de columnas. Esto incluye tablas con funciones de filtro de filas que contienen subconsultas simples, pero existen limitaciones, que se describen en la sección siguiente.

  • Databricks SQL vistas materializadas y Databricks SQL tablas de streaming admiten filtros de fila y máscaras de columna (versión preliminar pública):

    • Puede agregar filtros de fila y máscaras de columna a una vista materializada de Databricks SQL o una tabla de streaming. Esto debe realizarse mediante declaración cuando se define la vista materializada o la tabla de streaming. Consulte CREATE MATERIALIZED VIEW (CREAR VISTA MATERIALIZADA) o CREATE STREAMING TABLE (CREAR TABLA DE STREAMING).
    • Puede definir vistas materializadas de Databricks SQL o tablas de streaming en tablas que incluyen filtros de fila y máscaras de columna.
  • Las vistas materializadas y las tablas de streaming declaradas y publicadas en Delta Live Tables admiten filtros de fila o máscaras de columna (versión preliminar pública):

    • Puede agregar filtros de fila y máscaras de columna a una vista materializada de Delta Live Tables o una tabla de streaming.
    • Puede definir vistas materializadas de Delta Live Tables o tablas de streaming en tablas que incluyen filtros de fila y máscaras de columna.

    Vea Publicación de tablas con filtros de fila y máscaras de columna.

Consideraciones sobre el rendimiento

Los filtros de fila y las máscaras de columna proporcionan garantías sobre la visibilidad de los datos asegurándose de que ningún usuario pueda ver el contenido de los valores de las tablas base antes de las operaciones de filtrar y enmascarar. Están diseñados para funcionar bien en respuesta a las consultas en casos de uso más comunes. En aplicaciones menos frecuentes, donde el motor de consultas debe elegir entre optimizar el rendimiento de las consultas y proteger contra la pérdida de información de los valores filtrados o enmascarados, siempre tomará la decisión segura a expensas de algún impacto en el rendimiento de las consultas. Para minimizar este impacto en el rendimiento, aplique los siguientes principios:

  • Usar funciones de directiva sencillas: las funciones de directiva con menos expresiones normalmente funcionarán mejor que las expresiones más complejas. Evite usar tablas de asignación y subconsultas de expresiones en favor de funciones CASE simples.
  • Reduzca el número de argumentos de función: Azure Databricks no puede optimizar las referencias de columna a la tabla de origen resultante de argumentos de función de directiva, aunque estas columnas no se usen en la consulta. Use funciones de directiva con menos argumentos, ya que las consultas de estas tablas suelen funcionar mejor.
  • Evite agregar filtros de fila con demasiadas combinaciones AND: dado que cada tabla solo admite agregar como máximo un filtro de fila, un enfoque común es combinar varias funciones de directiva deseadas con AND. Sin embargo, para cada conjunción, las posibilidades de que los conjuntos incluyan componentes mencionados en otra parte de esta tabla que podrían afectar al rendimiento aumentan (como el uso de tablas de asignación). Use menos conjuntos para mejorar el rendimiento.
  • Use expresiones deterministas que no puedan producir errores en las directivas de tabla y las consultas de estas tablas: algunas expresiones pueden producir errores si las entradas proporcionadas no son válidas, como la división ANSI. En tales casos, el compilador de SQL no debe presionar hacia abajo operaciones con esas expresiones (como filtros) demasiado lejos en el plan de consulta, para evitar la posibilidad de errores como "división por cero" que muestren información sobre los valores antes de filtrar o enmascarar operaciones. Use expresiones que son deterministas y nunca produzcan errores, como try_divide en este ejemplo.
  • Ejecute consultas de prueba en la tabla para medir el rendimiento: cree consultas realistas que representen la carga de trabajo que espera para la tabla con filtros de fila o máscaras de columna y mida el rendimiento. Realice pequeñas modificaciones en las funciones de directiva y observe sus efectos hasta alcanzar un buen equilibrio entre el rendimiento y la expresividad de la lógica de filtrado y enmascaramiento.

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.
  • Delta Sharing no funciona con máscaras de columna ni seguridad de nivel de fila.
  • No se pueden aplicar máscaras de columna o seguridad de nivel de fila a una vista.
  • Viaje en el tiempo no funciona con máscaras de columna ni seguridad de nivel de fila.
  • No se admite el acceso basado en rutas de acceso a archivos de tablas con directivas.
  • Las directivas de filtro de fila o máscara de columna con dependencias circulares con respecto a las directivas originales no se admiten.
  • No se admiten clones profundos y superficiales.
  • Las instrucciones MERGE no son compatibles con tablas con directivas de filtro de filas que contengan anidaciones, agregaciones, ventanas, límites o funciones no deterministas.
  • No se admiten las API de Delta Lake.

Limitación de proceso de usuario único

No se puede acceder a una tabla que tenga filtros de fila o máscaras de columna desde un único recurso de proceso de usuario en Databricks Runtime 15.3 o inferior. Puede usar el modo de acceso de usuario único en Databricks Runtime 15.4 LTS o superior, si el área de trabajo está habilitada para el proceso sin servidor. Para obtener más información, consulte Control de acceso específico sobre el proceso de un solo usuario.