Фильтрация конфиденциальных данных таблицы с помощью фильтров строк и маски столбцов
В этой статье приведены рекомендации и примеры использования фильтров строк, маски столбцов и таблиц сопоставления для фильтрации конфиденциальных данных в таблицах. Для этих функций требуется каталог Unity.
Что такое фильтры строк?
Фильтры строк позволяют применять фильтр к таблице, чтобы запросы возвращали только строки, соответствующие критериям фильтра. Вы реализуете фильтр строк как определяемую пользователем функцию SQL (UDF). Пользовательские функции Python и Scala также поддерживаются, но только в том случае, если они упаковываются в определяемые пользователем функции SQL.
Что такое маски столбцов?
Маски столбцов позволяют применять функцию маскирования к столбцу таблицы. Функция маскирования оценивается во время выполнения запроса, заменив каждую ссылку целевого столбца результатами функции маскирования. В большинстве случаев маски столбцов определяют, следует ли возвращать исходное значение столбца или редактировать его на основе удостоверения вызывающего пользователя. Маски столбцов — это выражения, написанные как SQL UDF, или как Python или Scala UDF, упакованные в SQL UDF.
К каждому столбцу таблицы может применяться только одна функция маскирования. Функция маскирования принимает незамеченное значение столбца в качестве входных данных и возвращает маскированное значение в качестве результата. Возвращаемое значение функции маскирования должно быть таким же типом, что и столбец, маскирующийся. Функция маскирования также может принимать дополнительные столбцы в качестве входных параметров и использовать их в логике маскирования.
Какова разница между этими фильтрами и динамическими представлениями?
Динамические представления, фильтры строк и маски столбцов позволяют применять сложную логику к таблицам и обрабатывать решения по фильтрации во время выполнения запроса.
Динамическое представление — это абстрактное, доступное только для чтения представление одной или нескольких исходных таблиц. Пользователь может получить доступ к динамическому представлению без прямого доступа к исходным таблицам. Создание динамического представления определяет новое имя таблицы, которое не должно соответствовать имени исходных таблиц или других таблиц и представлений, присутствующих в той же схеме.
С другой стороны, связывание фильтра строк или маски столбцов с целевой таблицей применяет соответствующую логику непосредственно к самой таблице, не вводя новые имена таблиц. Последующие запросы могут продолжать ссылаться непосредственно на целевую таблицу с помощью исходного имени.
Используйте динамические представления, если необходимо применить логику преобразования, например, фильтры и маски, для таблиц, доступных только для чтения, и если использование разных имен для динамических представлений приемлемо для пользователей. Если вы хотите фильтровать данные при использовании Delta Sharing, нужно использовать динамические представления. Используйте фильтры строк и маски столбцов, если вы хотите фильтровать или вычислять выражения по определенным данным, но по-прежнему предоставлять пользователям доступ к таблицам с помощью их исходных имен.
Подготовка к работе
Чтобы добавить фильтры строк и маски столбцов в таблицы, необходимо:
- Рабочая область, активированная для каталога Unity.
- Функция, зарегистрированная в каталоге Unity. Эта функция может быть UDF SQL или Python или Scala UDF, зарегистрированная в каталоге Unity, и упакована в UDF SQL. Дополнительные сведения см. в разделе Что такое определяемые пользователем функции (ОПФ)?, условие маски столбцов , и условие ROW FILTER.
Кроме того, необходимо выполнить следующие требования:
- Чтобы назначить функцию, добавляющую фильтры строк или маски столбцов в таблицу, необходимо иметь права
EXECUTE
для функции,USE SCHEMA
в схеме иUSE CATALOG
в родительском каталоге. - При добавлении фильтров или маск при создании новой таблицы необходимо иметь права
CREATE TABLE
на схеме. - Если вы добавляете в существующую таблицу фильтры или маски, вы должны быть владельцем таблицы.
Чтобы получить доступ к таблице с фильтрами строк или масками столбцов, вычислительный ресурс должен соответствовать одному из следующих требований:
Хранилище SQL.
Режим общего доступа в Databricks Runtime 12.2 LTS или более поздней версии.
Режим доступа одного пользователя в Databricks Runtime 15.4 LTS или более поздней версии.
Фильтры строк или маски столбцов нельзя считывать с помощью вычислений, настроенных с одним режимом доступа пользователей в Databricks Runtime 15.3 или ниже.
Чтобы воспользоваться преимуществами фильтрации данных, предоставляемых в Databricks Runtime 15.4 LTS и более поздних версиях, необходимо также убедиться, что рабочая область включена для бессерверных вычислений, так как функции фильтрации данных, поддерживающие фильтры строк и маски столбцов, выполняются на бессерверных вычислениях. Вы можете взимать плату за бессерверные вычислительные ресурсы при использовании вычислений, настроенных в качестве режима единого доступа пользователя, для чтения таблиц, использующих фильтры строк или маски столбцов. Подробные инструкции по управлению доступом для отдельных пользователей.
Применение фильтра строк
Чтобы создать фильтр строк, необходимо написать функцию (UDF), чтобы определить политику фильтра, а затем применить ее к таблице. Каждая таблица может иметь только один фильтр строк. Фильтр строк принимает ноль или несколько входных параметров, в которых каждый входной параметр привязывается к одному столбцу соответствующей таблицы.
Вы можете применить фильтр строк с помощью обозревателя каталогов или команд SQL. Инструкции обозревателя каталогов предполагают, что вы уже создали функцию и зарегистрировали ее в каталоге Unity. Инструкции SQL включают примеры создания функции фильтрации строк и применения ее к таблице.
Обозреватель каталогов
- В рабочей области Azure Databricks щелкните значок .
- Просмотрите или найдите таблицу, которую требуется отфильтровать.
- На вкладке "Обзор" нажмите кнопку " Фильтр строк": "Добавить фильтр".
- В диалоговом окне Добавление фильтра строк выберите каталог и схему, содержащую функцию фильтра, а затем выберите функцию.
- В развернутом диалоговом окне просмотрите определение функции и выберите столбцы таблицы, соответствующие столбцам, включенным в инструкцию функции.
- Нажмите кнопку Добавить.
Чтобы удалить фильтр из таблицы, щелкните фильтр строк fx и щелкните Удалить.
SQL
Чтобы создать фильтр строк, а затем добавить его в существующую таблицу, используйте CREATE FUNCTION
и примените функцию с помощью ALTER TABLE
. Вы также можете применить функцию при создании таблицы с помощью CREATE TABLE
.
Создайте фильтр строк:
CREATE FUNCTION <function_name> (<parameter_name> <parameter_type>, ...) RETURN {filter clause whose output must be a boolean};
Примените фильтр строк к таблице с помощью имени столбца:
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 содержат примеры создания функции маски столбца и применения ее к столбцу таблицы.
Обозреватель каталогов
- В рабочей области Azure Databricks щелкните значок .
- Просмотрите или найдите таблицу.
- На вкладке Обзор найдите строку, к которой нужно применить маску столбца, и щелкните значок значок "Маска изменить".
- В диалоговом окне Добавление маски столбца выберите каталог и схему, которые содержат функцию фильтрации, а затем выберите функцию.
- В развернутом диалоговом окне просмотрите определение функции. Если функция содержит все параметры в дополнение к маскировке столбца, выберите столбцы таблицы, в которых необходимо привести эти дополнительные параметры функции.
- Нажмите кнопку Добавить.
Чтобы удалить маску столбцов из таблицы, щелкните маску столбца fx в строке таблицы и щелкните Удалить.
SQL
Чтобы создать маску столбца и добавить ее в существующий столбец таблицы, используйте CREATE FUNCTION
и примените функцию маскирования с помощью ALTER TABLE
. Вы также можете применить функцию при создании таблицы с помощью CREATE TABLE
.
Используется для SET MASK
применения функции маскирования.
MASK
В предложении можно использовать любые встроенные функции среды выполнения Azure Databricks или вызывать другие пользовательские функции. Распространенные варианты использования включают проверку удостоверения вызывающего пользователя, выполняющего функцию, с помощью current_user( )
или получения групп, которые они являются членами.is_account_group_member( )
Дополнительные сведения см. в предложении маски столбцов и встроенных функций.
Создайте маску столбца:
CREATE FUNCTION <function_name> (<parameter_name> <parameter_type>, ...) RETURN {expression with the same type as the first parameter};
Примените маску столбца к столбцу в существующей таблице:
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
.
Параметры политики могут включать постоянные выражения (строки, числовые, интервалы, логические значения, нулевые значения).
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.
- Можно определить материализованные представления или потоковые таблицы Delta Live Tables на таблицах, которые включают фильтры строк и маски столбцов.
Рекомендации по производительности
Фильтры строк и маски столбцов управляют видимостью данных, гарантируя, что пользователи не могут просматривать содержимое базовых таблиц перед фильтрацией и маскированием операций. Они хорошо работают при ответах на запросы в обычных сценариях использования. В менее распространенных приложениях, где подсистема запросов должна выбирать между оптимизацией производительности запросов и защитой от утечки информации из отфильтрованных или маскированных значений, она всегда будет принимать безопасное решение за счет некоторого влияния на производительность запросов. Чтобы свести к минимуму это влияние на производительность, примените следующие рекомендации.
- Использовать простые функции политики: функции политики с меньшим количеством выражений часто выполняются лучше, чем более сложные выражения. Избегайте использования таблиц сопоставления и подзапросов, использующих выражения, в пользу простых операторов CASE.
- уменьшить число аргументов функции: Azure Databricks не может оптимизировать ссылки на столбцы в исходной таблице, полученной из аргументов функции политики, даже если эти столбцы не используются в запросе. Используйте функции политики с меньшим количеством аргументов, так как запросы из этих таблиц будут работать лучше.
-
Избегайте добавления фильтров строк с слишком многими конъюнктами И: Так как каждая таблица поддерживает добавление только одного фильтра строк, распространенный подход заключается в сочетании нескольких функций политики с
AND
. Однако для каждого конъюнкта вероятность того, что конъюнкты включают компоненты, упомянутые в других частях этой таблицы, которые могут повлиять на производительность (например, таблицы сопоставления). Используйте меньше конъюнктов для повышения производительности. -
Использовать детерминированные выражения, которые не могут вызывать ошибки в политиках таблиц и запросах из этих таблиц: Некоторые выражения могут вызывать ошибки, если предоставленные входные данные недопустимы, например деление ANSI. В таких случаях компилятор SQL не должен отправлять операции с этими выражениями (например, фильтрами) слишком далеко в плане запроса, чтобы избежать возможных ошибок, таких как "деление на ноль", которые показывают сведения о значениях перед фильтрацией и /или маскированием операций. Используйте детерминированные выражения, которые никогда не вызывают ошибок, например
try_divide
в этом примере. - выполнить тестовые запросы по таблице, чтобы оценить производительность: создавать реалистичные запросы, представляющие ожидаемую рабочую нагрузку для таблицы с фильтрами строк и (или) масками столбцов и измерять производительность. Внесите небольшие изменения в функции политики и следите за их последствиями, пока вы не достигнете хорошего баланса между производительностью и экспрессивностью логики фильтрации и маскирования.
Ограничения
- Версии среды выполнения Databricks ниже 12.2 LTS не поддерживают фильтры строк или маски столбцов. Эти среды выполнения завершаются безопасно, то есть если вы пытаетесь получить доступ к таблицам из неподдерживаемых версий этих сред выполнения, данные не возвращаются.
- Delta Sharing не работает с защитой на уровне строк или масками столбцов.
- К представлению нельзя применять маски безопасности на уровне строк или столбцов.
- Путешествие во времени не работает с безопасностью на уровне строк или маскировками столбцов.
- Доступ на основе пути к файлам в таблицах с политиками не поддерживается.
- Политики фильтрации строк или маскировки столбцов с циклическими зависимостями, возвращающимися к исходным политикам, не поддерживаются.
- Глубокие и мелкие клоны не поддерживаются.
- Операторы
MERGE
не поддерживают таблицы с политиками фильтрации строк или маскирования столбцов, если они содержат вложенность, агрегации, окна, ограничения или недетерминированные функции. - API Delta Lake не поддерживаются.
Ограничение вычислений одного пользователя
Невозможно получить доступ к таблице с фильтрами строк или масками столбцов из одного пользовательского вычислительного ресурса в Databricks Runtime 15.3 или ниже. Вы можете использовать режим доступа с одним пользователем в Databricks Runtime 15.4 LTS или более поздней версии, если рабочая область включена для бессерверных вычислений. Дополнительные сведения см. в разделе "Точное управление доступом" для вычислений одного пользователя.