Фильтрация конфиденциальных данных таблицы с помощью фильтров строк и маски столбцов
В этой статье приведены рекомендации и примеры использования фильтров строк, маски столбцов и таблиц сопоставления для фильтрации конфиденциальных данных в таблицах. Для этих функций требуется каталог Unity.
Что такое фильтры строк?
Фильтры строк позволяют применять фильтр к таблице, чтобы запросы возвращали только строки, соответствующие критериям фильтра. Вы реализуете фильтр строк как определяемую пользователем функцию SQL (UDF). Пользовательские функции Python и Scala также поддерживаются, но только в том случае, если они обернуты в SQL-функции.
Что такое маски столбцов?
Маски столбцов позволяют применять функцию маскирования к столбцу таблицы. Функция маскирования оценивается во время выполнения запроса, заменив каждую ссылку целевого столбца результатами функции маскирования. В большинстве случаев маски столбцов определяют, следует ли возвращать исходное значение столбца или редактировать его на основе удостоверения вызывающего пользователя. Маски столбцов — это выражения, написанные как SQL UDF, или как Python или Scala UDF, упакованные в SQL UDF.
К каждому столбцу таблицы может применяться только одна функция маскирования. Функция маскирования принимает незамеченное значение столбца в качестве входных данных и возвращает маскированное значение в качестве результата. Возвращаемое значение функции маскирования должно быть таким же типом, что и столбец, маскирующийся. Функция маскирования также может принимать дополнительные столбцы в качестве входных параметров и использовать их в логике маскирования.
Какова разница между этими фильтрами и динамическими представлениями?
Динамические представления, фильтры строк и маски столбцов позволяют применять сложную логику к таблицам и обрабатывать решения по фильтрации во время выполнения запроса.
Динамическое представление — это абстрактное, доступное только для чтения представление одной или нескольких исходных таблиц. Пользователь может получить доступ к динамическому представлению без прямого доступа к исходным таблицам. Создание динамического представления определяет новое имя таблицы, которое не должно соответствовать имени исходных таблиц или других таблиц и представлений, присутствующих в той же схеме.
С другой стороны, связывание фильтра строк или маски столбцов с целевой таблицей применяет соответствующую логику непосредственно к самой таблице, не вводя новые имена таблиц. Последующие запросы могут продолжать ссылаться непосредственно на целевую таблицу с помощью исходного имени.
Используйте динамические представления, если необходимо применить логику преобразования, например, фильтры и маски, для таблиц, доступных только для чтения, и если использование разных имен для динамических представлений приемлемо для пользователей. Если вы хотите фильтровать данные при использовании Delta Sharing, нужно использовать динамические представления. Используйте фильтры строк и маски столбцов, если вы хотите фильтровать или вычислять выражения по определенным данным, но по-прежнему предоставлять пользователям доступ к таблицам с помощью их исходных имен.
Прежде чем начать
Чтобы добавить фильтры строк и маски столбцов в таблицы, необходимо:
- Рабочая область, активированная для каталога Unity.
- Функция, зарегистрированная в каталоге Unity. Эта функция может быть SQL UDF, либо Python или Scala UDF, зарегистрированной в каталоге Unity и обернутой в SQL UDF. Дополнительные сведения см. в разделе Что такое определяемые пользователем функции (ОПФ), положение
mask
столбцаи положение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( )
. Дополнительные сведения см. в предложении mask
столбца и встроенных функций.
Создайте маску столбца:
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_account_group_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_ACCOUNT_GROUP_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 должны быть обёрнуты в SQL UDF.
- Можно создавать представления в таблицах, ссылающихся на маски столбцов или фильтры строк, но нельзя добавлять маски столбцов или фильтры строк в представление.
- Поддержка каналов изменений Delta Lake осуществляется, если схема совместима с фильтрами строк и масками столбцов, применяемыми к целевой таблице.
- Поддерживаются внешние таблицы.
- Поддерживается табличная выборка.
-
MERGE
операторы поддерживаются, если исходные таблицы, целевые таблицы или и то и другое используют фильтры строк и маски столбцов. Сюда входят таблицы с функциями фильтра строк, которые содержат простые вложенные запросы. Ограничения перечислены в следующем разделе.
Databricks SQL материализованные представления и Databricks SQL потоковые таблицы поддерживают фильтры строк и маски столбцов (общедоступная предварительная версия):
- Фильтры строк и маски столбцов можно добавить в материализованное представление или таблицу потоковой передачи Databricks SQL. Добавление маски должно выполняться декларативно при определении материализованного представления или потоковой таблицы. См. CREATE MATERIALIZED VIEW или CREATE STREAMING TABLE.
- Вы можете определить материализованные представления Databricks SQL или потоковые таблицы в таблицах, включающих фильтры строк и маски столбцов.
Материализованные представления и таблицы потоковой передачи, объявленные и опубликованные в DLT, поддерживают фильтры строк или маски столбцов (общедоступная предварительная версия):
- Фильтры строк и маски столбцов можно добавить в материализованное представление или потоковую таблицу DLT.
- Можно определить материализованные представления DLT или потоковые таблицы в таблицах, включающих фильтры строк и маски столбцов.
См. публикацию таблиц с использованием фильтров строк и масок столбцов.
Рекомендации по производительности
Фильтры строк и маски столбцов управляют видимостью данных, гарантируя, что пользователи не могут просматривать содержимое базовых таблиц перед фильтрацией и маскированием операций. Они хорошо работают при ответах на запросы в обычных сценариях использования. В менее распространенных приложениях, где подсистема запросов должна выбирать между оптимизацией производительности запросов и защитой от утечки информации из отфильтрованных или маскированных значений, она всегда будет принимать безопасное решение за счет некоторого влияния на производительность запросов. Чтобы свести к минимуму это влияние на производительность, примените следующие рекомендации.
- Использовать простые функции политики: функции политики с меньшим количеством выражений часто выполняются лучше, чем более сложные выражения. Избегайте использования таблиц сопоставления и подзапросов, использующих выражения, в пользу простых операторов 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 или более поздней версии, если ваша рабочая область включена для бессерверных вычислений. Дополнительные сведения см. в разделе Точное управление доступом для выделенных вычислений (ранее однопользовательских вычислений).