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

Внимание

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

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

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

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

Чтобы создать фильтр строк, сначала напишите UDF SQL, чтобы определить политику фильтра, а затем применить ее к таблице с помощью инструкции 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> 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;.

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

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

С помощью этой функции члены 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);

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

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

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

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

Синтаксис маски столбцов

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 <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. Фильтры и маски применяются к данным, считываемыми UPDATEs и DELETEs, и не применяются к данным, записанным (включая данные INSERTed).
  • Поддерживаемые форматы: Delta и Parquet. Parquet поддерживается только для управляемых или внешних таблиц.
  • Поддерживаются представления таблиц с масками столбцов или фильтрами строк.
  • Каналы данных изменений Delta Lake поддерживаются, если схема совместима с фильтрами строк и масками столбцов, которые могут применяться к целевой таблице.
  • Поддерживаются внешние таблицы.

Ограничения

  • Версии среды выполнения Databricks ниже 12.2 LTS не поддерживают фильтры строк или маски столбцов. Эти среды выполнения завершаются ошибкой безопасно, то есть если вы пытаетесь получить доступ к таблицам из неподдерживаемых версий этих сред выполнения, данные не возвращаются.
  • Разностные динамические таблицы материализованные представления и потоковые таблицы не поддерживают фильтры строк или маски столбцов.
  • Определяемые пользователем функции Python и Scala не поддерживаются в качестве фильтра строк или функций маски столбцов напрямую. Однако их можно ссылаться на эти функции в определяемых пользователями SQL, если их определения хранятся в каталоге постоянно (иными словами, не временным для сеанса).
  • Разностный общий доступ не работает с масками безопасности на уровне строк или столбцов.
  • Перемещение по времени не работает с безопасностью на уровне строк или масками столбцов.
  • Выборка таблиц не работает с масками на уровне строк или столбцов.
  • Доступ на основе пути к файлам в таблицах с политиками в настоящее время не поддерживается.
  • Политики фильтрации строк или маски столбцов с циклическими зависимостями обратно в исходные политики не поддерживаются.
  • MERGE и мелкие клоны не поддерживаются.

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

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