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


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

Внимание

Эта функция предоставляется в режиме общедоступной предварительной версии.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Хранилище 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> 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 <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);

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

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

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

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

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

  • Поддерживаются представления таблиц с масками столбцов или фильтрами строк.

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

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

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

    • Фильтры строк и маски столбцов можно добавить в представление databricks SQL Materialized или потоковую таблицу.
    • Вы можете определить представления Databricks SQL Materialized или потоковые таблицы в таблицах, включающих фильтры строк и маски столбцов.

Ограничения

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

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

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