Поделиться через


Фильтрация конфиденциальных данных таблицы с помощью фильтров строк и маски столбцов

В этой статье приведены рекомендации и примеры использования фильтров строк, маски столбцов и таблиц сопоставления для фильтрации конфиденциальных данных в таблицах. Для этих функций требуется каталог Unity.

Что такое фильтры строк?

Фильтры строк позволяют применять фильтр к таблице, чтобы запросы возвращали только строки, соответствующие критериям фильтра. Вы реализуете фильтр строк как определяемую пользователем функцию SQL (UDF). Пользовательские функции Python и Scala также поддерживаются, но только в том случае, если они упаковываются в определяемые пользователем функции SQL.

Что такое маски столбцов?

Маски столбцов позволяют применять функцию маскирования к столбцу таблицы. Функция маскирования оценивается во время выполнения запроса, заменив каждую ссылку целевого столбца результатами функции маскирования. В большинстве случаев маски столбцов определяют, следует ли возвращать исходное значение столбца или редактировать его на основе удостоверения вызывающего пользователя. Маски столбцов — это выражения, написанные как определяемые пользователем SQL, или как python или Scala UDFs, которые упаковываются в определяемые пользователем SQL файлы.

К каждому столбцу таблицы может применяться только одна функция маскирования. Функция маскирования принимает незамеченное значение столбца в качестве входных данных и возвращает маскированное значение в качестве результата. Возвращаемое значение функции маскирования должно быть таким же типом, что и столбец, маскирующийся. Функция маскирования также может принимать дополнительные столбцы в качестве входных параметров и использовать их в логике маскирования.

Какова разница между этими фильтрами и динамическими представлениями?

Динамические представления, фильтры строк и маски столбцов позволяют применять сложную логику к таблицам и обрабатывать решения по фильтрации во время выполнения запроса.

Динамическое представление — это абстрактное, доступное только для чтения представление одной или нескольких исходных таблиц. Пользователь может получить доступ к динамическому представлению без доступа к исходным таблицам напрямую. Создание динамического представления определяет новое имя таблицы, которое не должно соответствовать имени исходных таблиц или других таблиц и представлений, присутствующих в той же схеме.

С другой стороны, связывание фильтра строк или маски столбцов с целевой таблицей применяет соответствующую логику непосредственно к самой таблице, не вводя новые имена таблиц. Последующие запросы могут продолжать ссылаться непосредственно на целевую таблицу с помощью исходного имени.

Используйте динамические представления, если необходимо применить логику преобразования, например фильтры и маски для таблиц, доступных только для чтения, и если это допустимо для пользователей, чтобы ссылаться на динамические представления с использованием разных имен. Если вы хотите фильтровать данные при совместном использовании разностного общего доступа, необходимо использовать динамические представления. Используйте фильтры строк и маски столбцов, если вы хотите фильтровать или вычислять выражения по определенным данным, но по-прежнему предоставлять пользователям доступ к таблицам с помощью их исходных имен.

Подготовка к работе

Чтобы добавить фильтры строк и маски столбцов в таблицы, необходимо:

Кроме того, необходимо выполнить следующие требования:

  • Чтобы назначить функцию, добавляющую фильтры строк или маски столбцов в таблицу, необходимо иметь EXECUTE привилегии для функции, USE SCHEMA схемы и USE CATALOG родительского каталога.
  • При добавлении фильтров или маск при создании новой таблицы необходимо иметь CREATE TABLE привилегии в схеме.
  • Если вы добавляете фильтры или маски в существующую таблицу, вы должны быть владельцем таблицы или иметь MODIFY SELECT права и привилегии в таблице.

Чтобы получить доступ к таблице с фильтрами строк или масками столбцов, вычислительный ресурс должен соответствовать одному из следующих требований:

  • Хранилище SQL.

  • Режим общего доступа в Databricks Runtime 12.2 LTS или более поздней версии.

  • Режим доступа одного пользователя в Databricks Runtime 15.4 LTS или более поздней версии.

    Фильтры строк или маски столбцов нельзя считывать с помощью вычислений одного пользователя в Databricks Runtime 15.3 или ниже.

    Чтобы воспользоваться преимуществами фильтрации данных, предоставляемых в Databricks Runtime 15.4 LTS и более поздних версиях, необходимо также убедиться, что рабочая область включена для бессерверных вычислений, так как функции фильтрации данных, поддерживающие фильтры строк и маски столбцов, выполняются на бессерверных вычислениях. Поэтому вы можете взимать плату за бессерверные вычислительные ресурсы при использовании отдельных пользователей вычислений для чтения таблиц, использующих фильтры строк или маски столбцов. Подробные инструкции по управлению доступом для отдельных пользователей.

Применение фильтра строк

Чтобы создать фильтр строк, необходимо написать функцию (UDF), чтобы определить политику фильтра, а затем применить ее к таблице. Каждая таблица может иметь только один фильтр строк. Фильтр строк принимает ноль или несколько входных параметров, в которых каждый входной параметр привязывается к одному столбцу соответствующей таблицы.

Вы можете применить фильтр строк с помощью обозревателя каталогов или команд SQL. Инструкции обозревателя каталогов предполагают, что вы уже создали функцию и что она зарегистрирована в каталоге Unity. Инструкции SQL включают примеры создания функции фильтрации строк и применения ее к таблице.

Обозреватель каталогов

  1. В рабочей области Azure Databricks щелкните Значок каталога "Каталог".
  2. Просмотрите или найдите таблицу, которую требуется отфильтровать.
  3. На вкладке "Обзор" нажмите кнопку " Фильтр строк": "Добавить фильтр".
  4. В диалоговом окне "Добавление фильтра строк" выберите каталог и схему, содержащую функцию фильтра, а затем выберите функцию.
  5. В развернутом диалоговом окне просмотрите определение функции и выберите столбцы таблицы, соответствующие столбцам, включенным в инструкцию функции.
  6. Нажмите кнопку Добавить.

Чтобы удалить фильтр из таблицы, щелкните фильтр строк fx и нажмите кнопку "Удалить".

SQL

Чтобы создать фильтр строк, а затем добавить его в существующую таблицу, используйте CREATE FUNCTION и примените функцию с помощью ALTER TABLE. Вы также можете применить функцию при создании таблицы с помощью CREATE TABLE.

  1. Создайте фильтр строк:

    CREATE FUNCTION <function_name> (<parameter_name> <parameter_type>, ...)
    RETURN {filter clause whose output must be a boolean};
    
  2. Примените фильтр строк к таблице с помощью имени столбца:

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

Дополнительные примеры синтаксиса:

  • Примените фильтр строк к таблице с помощью константного литерала, соответствующего параметру функции:

    ALTER TABLE <table_name> SET ROW FILTER <function_name> ON (<constant_literal>, ...);
    
  • Удалите фильтр строк из таблицы:

    ALTER TABLE <table_name> DROP ROW FILTER;
    
  • Изменение фильтра строк:

    Run a DROP FUNCTION statement to drop the existing function, or use CREATE OR REPLACE FUNCTION to replace it.
    
  • Удаление фильтра строк:

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

    Примечание.

    Перед удалением функции необходимо выполнить ALTER TABLE ... DROP ROW FILTER команду. Если вы этого не сделали, таблица будет находиться в недоступном состоянии.

    Если таблица становится недоступной таким образом, измените таблицу и удалите ссылку на фильтр строк потерянных строк с помощью ALTER TABLE <table_name> DROP ROW FILTER;.

См. также предложение ROW FILTER.

Примеры фильтров строк

В этом примере создается определяемая пользователем функция SQL, которая применяется к членам группы admin в регионе US.

Когда эта примерная функция применяется к sales таблице, члены admin группы могут получить доступ ко всем записям в таблице. Если функция вызывается неадминистратором, RETURN_IF условие завершается ошибкой, и region='US' выражение вычисляется, отфильтровав таблицу только для отображения записей в регионе US .

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

Примените функцию к таблице в качестве фильтра строк. Последующие запросы из sales таблицы возвращают подмножество строк.

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

Отключите фильтр строк. Затем будущие запросы пользователей из sales таблицы возвращают все строки в таблице.

ALTER TABLE sales DROP ROW FILTER;

Создайте таблицу с функцией, применяемой в качестве фильтра строк в рамках инструкции CREATE TABLE . Последующие запросы из sales таблицы возвращают подмножество строк.

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

Применение маски столбца

Чтобы применить маску столбца, создайте функцию (UDF) и примените ее к столбцу таблицы.

Маску столбца можно применить с помощью обозревателя каталогов или команд SQL. Инструкции обозревателя каталогов предполагают, что вы уже создали функцию и что она зарегистрирована в каталоге Unity. Инструкции SQL содержат примеры создания функции маски столбца и применения ее к столбцу таблицы.

Обозреватель каталогов

  1. В рабочей области Azure Databricks щелкните Значок каталога "Каталог".
  2. Просмотрите или найдите таблицу.
  3. На вкладке "Обзор" найдите строку, к которой нужно применить маску столбца, и щелкните Значок значок редактирования маски.
  4. В диалоговом окне "Добавление маски столбца" выберите каталог и схему, содержащую функцию фильтра, а затем выберите функцию.
  5. В развернутом диалоговом окне просмотрите определение функции. Если функция содержит все параметры в дополнение к столбцу, который маскируется, выберите столбцы таблицы, к которым требуется привести эти дополнительные параметры функции.
  6. Нажмите кнопку Добавить.

Чтобы удалить маску столбца из таблицы, щелкните маску fx Column в строке таблицы и нажмите кнопку "Удалить".

SQL

Чтобы создать маску столбца и добавить ее в существующий столбец таблицы, используйте CREATE FUNCTION и примените функцию маскирования с помощью ALTER TABLE. Вы также можете применить функцию при создании таблицы с помощью CREATE TABLE.

Используется для SET MASK применения функции маскирования. MASK В предложении можно использовать любые встроенные функции среды выполнения Azure Databricks или вызывать другие пользовательские функции. Распространенные варианты использования включают проверку удостоверения вызывающего пользователя, выполняющего функцию, с помощью current_user( ) или получения групп, которые они являются членами.is_account_group_member( ) Дополнительные сведения см. в предложении "Маска столбцов" и встроенных функциях.

  1. Создайте маску столбца:

    CREATE FUNCTION <function_name> (<parameter_name> <parameter_type>, ...)
    RETURN {expression with the same type as the first parameter};
    
  2. Примените маску столбца к столбцу в существующей таблице:

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

Дополнительные примеры синтаксиса:

  • Примените маску столбца к столбцу в существующей таблице, используя константный литерал, соответствующий параметру функции:

    ALTER TABLE <table_name> ALTER COLUMN <col_name> SET MASK <mask_func_name> USING COLUMNS (<constant_name>, ...);
    
  • Удалите маску столбца из столбца в таблице:

    ALTER TABLE <table_name> ALTER COLUMN <column where mask is applied> DROP MASK;
    
  • Измените маску столбца: DROP существующую функцию или использовать CREATE OR REPLACE TABLE.

  • Удаление маски столбца:

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

    Примечание.

    Перед удалением функции необходимо выполнить ALTER TABLE команду, или таблица будет находиться в недоступном состоянии.

    Если таблица становится недоступной таким образом, измените таблицу и удалите ссылку на потерянные маски с помощью ALTER TABLE <table_name> ALTER COLUMN <column where mask is applied> DROP MASK;.

Примеры маски столбцов

В этом примере создается определяемая пользователем функция, которая маскирует ssn столбец, чтобы только пользователи, являющиеся членами HumanResourceDept группы, могли просматривать значения в этом столбце.

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

Примените новую функцию к таблице в качестве маски столбца. Маску столбца можно добавить при создании таблицы или после нее.

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

Запросы к этой таблице теперь возвращают маскированные ssn значения столбцов, если запрашивающий пользователь не является членом HumanResourceDept группы:

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

Чтобы отключить маску столбца, чтобы запросы возвращали исходные значения в столбце ssn :

ALTER TABLE users ALTER COLUMN ssn DROP MASK;

Создание списка управления доступом с помощью таблиц сопоставления

Чтобы обеспечить безопасность на уровне строк, рекомендуется определить таблицу сопоставления (или список управления доступом). Каждая таблица сопоставления — это полная таблица сопоставления, которая кодирует строки данных в исходной таблице, доступные определенным пользователям или группам. Таблицы сопоставления полезны, так как они предлагают простую интеграцию с таблицами фактов с помощью прямых соединений.

Эта методология оказывается полезной в решении многих вариантов использования с пользовательскими требованиями. Вот некоторые примеры.

  • Применение ограничений на основе пользователя, вошедшего в систему, при использовании различных правил для определенных групп пользователей.
  • Создание сложных иерархий, таких как организационные структуры, требующее различных наборов правил.
  • Репликация сложных моделей безопасности из внешних исходных систем.

Благодаря внедрению таблиц сопоставления таким образом можно эффективно решать эти сложные сценарии и обеспечивать надежные реализации безопасности на уровне строк и на уровне столбцов.

Примеры сопоставления таблиц

Используйте таблицу сопоставления, чтобы проверить, находится ли текущий пользователь в списке:

USE CATALOG main;

Создайте новую таблицу сопоставления:

DROP TABLE IF EXISTS valid_users;

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

Создайте новый фильтр:

Примечание.

Все фильтры выполняются с правами определителя, за исключением функций, которые проверяют контекст пользователя (например, CURRENT_USER и IS_MEMBER функции), которые выполняются в качестве вызывающего объекта.

В этом примере функция проверяет, находится ли текущий пользователь в valid_users таблице. Если пользователь найден, функция возвращает значение true.

DROP FUNCTION IF EXISTS row_filter;

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

В приведенном ниже примере применяется фильтр строк во время создания таблицы. Кроме того, можно добавить фильтр позже с помощью инструкции ALTER TABLE . При применении ON () ко всей таблице используйте синтаксис. Для определенного использования 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);

Выберите данные из таблицы. Это должно возвращать только данные, если пользователь находится в valid_users таблице.

SELECT * FROM data_table;

Создайте таблицу сопоставления, содержащую учетные записи, которые всегда должны иметь доступ для просмотра всех строк в таблице независимо от значений столбцов:

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

Теперь создайте UDF SQL, возвращающий true значения всех столбцов в строке меньше пяти, или если вызывающий пользователь является членом приведенной выше таблицы сопоставления.

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

Наконец, примените UDF SQL к таблице в качестве фильтра строк:

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

Поддержка и ограничения

Фильтры строк и маски столбцов не поддерживаются всеми функциями Azure Databricks или всеми вычислительными ресурсами. В этом разделе перечислены поддерживаемые функции и ограничения.

Поддерживаемые функции и форматы

Этот список поддерживаемых функций не является исчерпывающим. Некоторые элементы перечислены, так как они не поддерживаются во время общедоступной предварительной версии.

  • Поддерживаются записные книжки Databricks SQL и Databricks для рабочих нагрузок SQL.

  • Поддерживаются команды DML пользователями с MODIFY привилегиями. Фильтры и маски применяются к данным, которые считываются UPDATE и DELETE не применяются к данным, записанным (включая INSERT).

  • Поддерживаемые форматы данных:

    • Delta и Parquet для управляемых и внешних таблиц.
    • Несколько других форматов данных для внешних таблиц, зарегистрированных в каталоге Unity с помощью Федерации Lakehouse.
  • Параметры политики могут включать константные выражения (строки, числовые, интервалы, логические значения, null).

  • Sql, Python и Scala UDFs поддерживаются как функции фильтрации строк или маски столбцов, если они зарегистрированы в каталоге Unity. Пользовательские функции Python и Scala должны быть упакованы в UDF SQL.

  • Можно создавать представления в таблицах, ссылающихся на маски столбцов или фильтры строк, но нельзя добавлять маски столбцов или фильтры строк в представление.

  • Каналы данных изменений Delta Lake поддерживаются, если схема совместима с фильтрами строк и масками столбцов, которые применяются к целевой таблице.

  • Поддерживаются внешние таблицы.

  • Поддерживается выборка таблицы.

  • MERGE операторы поддерживаются, если исходные таблицы, целевые таблицы или оба используют фильтры строк и маски столбцов. К ним относятся таблицы с функциями фильтра строк, которые содержат простые вложенные запросы, но есть ограничения, перечисленные в следующем разделе.

  • Материализованные представления Databricks SQL и таблицы потоковой передачи Databricks SQL поддерживают фильтры строк и маски столбцов (общедоступная предварительная версия):

    • Фильтры строк и маски столбцов можно добавить в материализованное представление или таблицу потоковой передачи Databricks SQL. Это необходимо сделать декларативно при определении материализованного представления или потоковой таблицы. См. статью CREATE MATERIALIZED VIEW или CREATE STREAMING TABLE.
    • Вы можете определить материализованные представления Databricks SQL или потоковые таблицы в таблицах, включающих фильтры строк и маски столбцов.
  • Материализованные представления и потоковые таблицы, объявленные и опубликованные в Delta Live Tables, поддерживают фильтры строк или маски столбцов (общедоступная предварительная версия):

    • Фильтры строк и маски столбцов можно добавить в материализованное представление или потоковую таблицу Delta Live Table.
    • Можно определить материализованные представления разностных динамических таблиц или потоковую передачу таблиц в таблицах, включающих фильтры строк и маски столбцов.

    См. статью "Публикация таблиц" с фильтрами строк и масками столбцов.

Рекомендации по производительности

Фильтры строк и маски столбцов обеспечивают гарантии видимости данных, гарантируя, что пользователи не могут просматривать содержимое базовых таблиц до операций фильтрации и маскирования. Они хорошо работают в ответ на запросы в большинстве распространенных вариантов использования. В менее частых приложениях, где подсистема запросов должна выбирать между оптимизацией производительности запросов и защитой от утечки информации из отфильтрованных или маскированных значений, она всегда будет принимать безопасное решение за счет некоторого влияния на производительность запросов. Чтобы свести к минимуму это влияние на производительность, примените следующие принципы:

  • Используйте простые функции политики: функции политики с меньшим количеством выражений обычно выполняются лучше, чем более сложные выражения. Избегайте использования таблиц сопоставления и вложенных запросов выражений в пользу простых функций CASE.
  • Уменьшите количество аргументов функции: Azure Databricks не может оптимизировать ссылки на столбцы в исходную таблицу, полученную из аргументов функции политики, даже если эти столбцы не используются в запросе. Используйте функции политики с меньшим количеством аргументов, так как запросы из этих таблиц обычно выполняются лучше.
  • Избегайте добавления фильтров строк с слишком большим числом и конъюнктами. Так как каждая таблица поддерживает добавление только одного фильтра строк, распространенный подход заключается в сочетании нескольких нужных функций политики с AND. Однако для каждого конъюнкта вероятность того, что конъюнкты включают компоненты, упомянутые в других частях этой таблицы, которые могут повлиять на производительность (например, использование таблиц сопоставления). Используйте меньше конъюнктов для повышения производительности.
  • Используйте детерминированные выражения, которые не могут вызывать ошибки в политиках таблиц и запросах из этих таблиц: некоторые выражения могут вызывать ошибки, если предоставленные входные данные недопустимы, например деление ANSI. В таких случаях компилятор SQL не должен отправлять операции с этими выражениями (например, фильтрами) слишком далеко в плане запроса, чтобы избежать возможности ошибок, таких как "деление по нулю", которые показывают сведения о значениях до фильтрации и /или маскирования операций. Используйте выражения, детерминированные и никогда не вызывающие ошибки, например try_divide в этом примере.
  • Выполните тестовые запросы по таблице, чтобы оценить производительность: создайте реалистичные запросы, представляющие рабочую нагрузку, которую вы ожидаете для таблицы с фильтрами строк и (или) масками столбцов и измеряйте производительность. Внесите небольшие изменения в функции политики и следите за их последствиями, пока вы не достигнете хорошего баланса между производительностью и экспрессивностью логики фильтрации и маскирования.

Ограничения

  • Версии среды выполнения Databricks ниже 12.2 LTS не поддерживают фильтры строк или маски столбцов. Эти среды выполнения завершаются безопасно, то есть если вы пытаетесь получить доступ к таблицам из неподдерживаемых версий этих сред выполнения, данные не возвращаются.
  • Разностный общий доступ не работает с масками безопасности на уровне строк или столбцов.
  • К представлению нельзя применять маски безопасности на уровне строк или столбцов.
  • Перемещение по времени не работает с безопасностью на уровне строк или масками столбцов.
  • Доступ на основе пути к файлам в таблицах с политиками не поддерживается.
  • Политики фильтрации строк или маски столбцов с циклическими зависимостями обратно в исходные политики не поддерживаются.
  • Глубокие и мелкие клоны не поддерживаются.
  • MERGE операторы не поддерживают таблицы с политиками фильтров строк, содержащими вложенные, агрегаты, окна, ограничения или недетерминированные функции.
  • API Delta Lake не поддерживаются.

Ограничение вычислений одного пользователя

Невозможно получить доступ к таблице с фильтрами строк или масками столбцов из одного пользовательского вычислительного ресурса в Databricks Runtime 15.3 или ниже. Вы можете использовать режим доступа с одним пользователем в Databricks Runtime 15.4 LTS или более поздней версии, если рабочая область включена для бессерверных вычислений. Дополнительные сведения см. в разделе "Точное управление доступом" для вычислений одного пользователя.