Compartir a través de


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. 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.
  • Para agregar filtros o máscaras al crear una tabla nueva, también debe tener el privilegio CREATE TABLE en el esquema.
  • Para agregar filtros o máscaras modificando una tabla existente, también debe ser el propietario de la tabla o tener el privilegio MODIFY en la tabla.

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

  • Un clúster en modo de acceso compartido en Databricks Runtime 12.2 LTS o superior, o un almacén SQL.

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:

  • 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:

  • 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 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);

Características y formatos admitidos

  • 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.
  • 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.

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

  • 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.
    • Puede definir vistas materializadas de Databricks SQL o tablas de streaming en tablas que incluyen filtros de fila y máscaras de columna.

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 vistas materializadas y las tablas de streaming declaradas en Delta Live Tables no admiten filtros de fila ni máscaras de columna.
  • 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.
  • 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.
  • SHOW CREATE TABLE en vistas materializadas y tablas de streaming no muestra información de filtro de fila ni máscara de columna.

Limitación de proceso 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 flujos de trabajo (trabajos). 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.