Руководство по настройке ABAC с помощью SQL

В этом руководстве показано, как настроить параметры ABAC фильтров строк и масок столбцов в каталоге Unity с помощью SQL. В версии с пользовательским интерфейсом «Обозреватель каталога» см. руководство: настройка ABAC.

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

В этом руководстве приведены следующие действия.

  1. Создание управляемых тегов
  2. Создание каталога Unity, схемы и таблицы
  3. Применение управляемых тегов к столбцам
  4. Создание UDF для обнаружения адресов ЕС
  5. Создание политики фильтрации строк
  6. Проверка фильтра строк
  7. Создание UDF для маскирования SSN
  8. Создание политики маски столбцов
  9. Протестировать маску столбца

После выполнения этих действий вы можете дополнительно расширить учебник с помощью условного маскирования электронной почты (шаги 10–12).

Необходимые условия

  • Databricks Runtime 16.4 или более поздней версии или бессерверные вычисления.
  • Разрешения администратора учетной записи или администратора рабочей области (для создания управляемых тегов).
  • MANAGE разрешение на целевой каталог или схему.
  • EXECUTE в определяемых пользователем функциях.

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

Шаг 1. Создание управляемых тегов

Управляемые теги — это пары "ключ-значение", определенные на уровне учетной записи. Политики ABAC используют их для определения, какие столбцы необходимо отфильтровать или замаскировать. В этом руководстве вы создадите два управляемых тега:

  • pii Тег с тремя допустимыми значениями: ssn, addressиemail
  • consent Тег только для ключей (без допустимых значений) для идентификации столбцов согласия

Чтобы создать управляемый тег, необходимо иметь разрешение на создание управляемого тега на уровне учетной записи. Администраторы учетных записей и рабочих областей по умолчанию имеют разрешение на создание.

  1. В рабочей области Azure Databricks щелкните Data icon.Catalog.
  2. Щелкните значок щита.Кнопка управления.
  3. В раскрывающемся меню щелкните "Управляемые теги".
  4. Нажмите кнопку "Создать управляемый тег".
  5. Введите pii для ключа тега.
  6. Введите описание управляемого тега.
  7. Для допустимых значений введите : ssn, addressи email. Только эти значения можно назначить этому ключу тега.
  8. Щелкните Создать.
  9. Повторите шаги 4–8, чтобы создать второй управляемый тег с ключом consent. Оставьте допустимые значения пустыми (тег только для ключей).

Предупреждение

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

Шаг 2. Создание таблицы клиентов

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

Выполните следующие команды в записной книжке, подключенной к вычислению в Databricks Runtime 16.4 или более поздней версии:

-- Create catalog (if not already exists)
CREATE CATALOG IF NOT EXISTS abac_tutorial;
USE CATALOG abac_tutorial;

-- Create schema
CREATE SCHEMA IF NOT EXISTS customers;
USE SCHEMA customers;
CREATE OR REPLACE TABLE profiles (
    first_name STRING,
    last_name STRING,
    email STRING,
    phone_number STRING,
    home_address STRING,
    ssn_number STRING,
    has_consent BOOLEAN
);
INSERT INTO profiles (first_name, last_name, email, phone_number, home_address, ssn_number, has_consent)
VALUES
('John', 'Doe', 'john.doe@example.com', '123-456-7890', '123 Main St, NY', '123-45-6789', TRUE),
('Jane', 'Smith', 'jane.smith@example.com', '234-567-8901', '456 Oak St, CA', '234-56-7890', FALSE),
('Alice', 'Johnson', 'alice.j@example.com', '345-678-9012', '789 Pine St, TX', '345-67-8901', TRUE),
('Bob', 'Brown', 'bob.brown@example.com', '456-789-0123', '321 Maple St, FL', '456-78-9012', FALSE),
('Charlie', 'Davis', 'charlie.d@example.com', '567-890-1234', '654 Cedar St, IL', '567-89-0123', TRUE),
('Emily', 'White', 'emily.w@example.com', '678-901-2345', '987 Birch St, WA', '678-90-1234', FALSE),
('Frank', 'Miller', 'frank.m@example.com', '789-012-3456', '741 Spruce St, WA', '789-01-2345', TRUE),
('Grace', 'Wilson', 'grace.w@example.com', '890-123-4567', '852 Elm St, NV', '890-12-3456', TRUE),
('Hank', 'Moore', 'hank.moore@example.com', '901-234-5678', '963 Walnut St, CO', '901-23-4567', FALSE),
('Ivy', 'Taylor', 'ivy.taylor@example.com', '012-345-6789', '159 Aspen St, AZ', '012-34-5678', TRUE),
('Liam', 'Connor', 'liam.c@example.com', '111-222-3333', '12 Abbey Street, Dublin, Ireland EU', '111-22-3333', TRUE),
('Sophie', 'Dubois', 'sophie.d@example.com', '222-333-4444', '45 Rue de Rivoli, Paris, France Europe', '222-33-4444', FALSE),
('Hans', 'Müller', 'hans.m@example.com', '333-444-5555', '78 Berliner Str., Berlin, Germany E.U.', '333-44-5555', TRUE),
('Elena', 'Rossi', 'elena.r@example.com', '444-555-6666', '23 Via Roma, Milan, Italy Europe', '444-55-6666', FALSE),
('Johan', 'Andersson', 'johan.a@example.com', '555-666-7777', '56 Drottninggatan, Stockholm, Sweden EU', '555-66-7777', TRUE);

Шаг 3. Добавление управляемых тегов в столбцы

Отметьте столбцы ssn_number, home_address и email с управляемым тегом pii. Политики ABAC соответствуют столбцам по тегу, а не по имени.

Столбец has_consent помечен тегом, управляемым consent . Это необходимо для политики маскирования с учетом согласия на шаге 11, где has_consent передается в UDF через USING COLUMNS.

ALTER TABLE abac_tutorial.customers.profiles
ALTER COLUMN ssn_number
SET TAGS ('pii' = 'ssn');

ALTER TABLE abac_tutorial.customers.profiles
ALTER COLUMN home_address
SET TAGS ('pii' = 'address');

ALTER TABLE abac_tutorial.customers.profiles
ALTER COLUMN email
SET TAGS ('pii' = 'email');

ALTER TABLE abac_tutorial.customers.profiles
ALTER COLUMN has_consent
SET TAGS ('consent' = '');

Шаг 4. Создание UDF для обнаружения адресов ЕС

Этот UDF передает значение каждого столбца, помеченного pii = address и возвращает следующее:

  • если адрес содержит , , или — строка скрыта.
  • TRUE в противном случае — отображается строка.
CREATE OR REPLACE FUNCTION is_not_eu_address(address STRING)
RETURNS BOOLEAN
RETURN (
    SELECT CASE
        WHEN LOWER(address) LIKE '%eu%'
          OR LOWER(address) LIKE '%e.u.%'
          OR LOWER(address) LIKE '%europe%'
        THEN FALSE
        ELSE TRUE
    END
);

Замечание

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

Шаг 5. Создание политики фильтрации строк

Чтобы создать политику, необходимо иметь MANAGE на объект или владеть объектом. Чтобы добавить UDF в политику, необходимо иметь EXECUTE для UDF.

CREATE POLICY hide_eu_customers
ON SCHEMA abac_tutorial.customers
ROW FILTER is_not_eu_address
TO `account users`
FOR TABLES
MATCH COLUMNS has_tag_value('pii', 'address') AS addr_col
USING COLUMNS (addr_col);

Вы также можете создавать политики с помощью пользовательского интерфейса обозревателя каталогов. Дополнительные сведения см. в статье "Создание политик ABAC и управление ими ".

Шаг 6. Проверка фильтра строк

Выполните следующий запрос, чтобы убедиться, что политика фильтрации строк работает.

SELECT * FROM abac_tutorial.customers.profiles;

Возвращаются только 10 строк, не являющихся резидентами ЕС. Пять клиентов ЕС (Лиам, Софи, Ханс, Елена и Джохан) скрыты.

Шаг 7. Создание UDF для маскирования SSN

Этот UDF возвращает полностью редактированные заполнители для любого значения SSN, переданного в него.

CREATE OR REPLACE FUNCTION redact_ssn(ssn STRING)
RETURNS STRING
RETURN '***-**-****';

Шаг 8. Создание политики маски столбцов

Создайте политику, которая нацелена на все столбцы, помеченные pii = ssn, и применяет к ним функцию redact_ssn.

CREATE POLICY redact_ssn_policy
ON SCHEMA abac_tutorial.customers
COLUMN MASK redact_ssn
TO `account users`
FOR TABLES
MATCH COLUMNS has_tag_value('pii', 'ssn') AS ssn_col
ON COLUMN ssn_col;

Шаг 9. Проверка маски столбцов

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

SELECT * FROM abac_tutorial.customers.profiles;

Теперь номера SSN возвращаются в виде ***-**-****. Возвращаются только жители, не являющиеся резидентами ЕС, поскольку фильтр строк также активен.

Расширение: условное маскирование электронной почты

Следующие шаги расширяют руководство с учетом требований о согласии при маскировании электронной почты. Пользователи, которые приняли участие (has_consent = TRUE) имеют полную электронную почту, другие видят только первый символ и домен.

Этот UDF принимает два аргумента:

  • email: фактическое значение электронной почты из соответствующего столбца
  • consent: значение столбца has_consent в одной строке
CREATE OR REPLACE FUNCTION mask_email_by_consent(email STRING, consent BOOLEAN)
RETURNS STRING
RETURN CASE
  WHEN consent = TRUE THEN email
  ELSE CONCAT(LEFT(email, 1), '***@', SUBSTRING_INDEX(email, '@', -1))
END;

Шаг 11. Создание политики условного маскирования электронной почты

Эта политика предназначена для столбцов, помеченных pii = email и передает has_consent столбец в UDF.

Замечание

Столбец has_consent был помечен управляемым тегом на шаге consent. Это необходимо, так как USING COLUMNS может ссылаться только на столбцы, сопоставленные через MATCH COLUMNS. Несмотря на то, что has_consent не маскируется, он должен быть помечен, чтобы политика могла передать его значение в UDF.

CREATE POLICY mask_email_by_consent_policy
ON SCHEMA abac_tutorial.customers
COLUMN MASK mask_email_by_consent
TO `account users`
FOR TABLES
MATCH COLUMNS has_tag_value('pii', 'email') AS email_col,
  has_tag('consent') AS consent_col
ON COLUMN email_col
USING COLUMNS (consent_col);

Шаг 12. Тестирование условной маскировки электронной почты

Выполните следующий запрос, чтобы убедиться, что все три политики работают вместе.

SELECT * FROM abac_tutorial.customers.profiles;

Клиенты с has_consent = TRUE видят свои полные адреса электронной почты. Клиенты с has_consent = FALSE видят замаскированную версию. СНИЛС остаются полностью замаскированными, и возвращаются только клиенты, не являющиеся гражданами ЕС.

первое имя has_consent электронная почта номер социального страхования (ССН)
Джон TRUE john.doe@example.com ***-**-****
Джейн FALSE j***@example.com ***-**-****
Алиса TRUE alice.j@example.com ***-**-****
Боб FALSE b***@example.com ***-**-****
Чарли TRUE charlie.d@example.com ***-**-****
Эмили FALSE e***@example.com ***-**-****
Фрэнк TRUE frank.m@example.com ***-**-****
Грация TRUE grace.w@example.com ***-**-****
Хэнк FALSE h***@example.com ***-**-****
Плющ TRUE ivy.taylor@example.com ***-**-****

Сводка

В этом руководстве показано три шаблона ABAC:

  • Фильтрация строк: скрытие строк на основе значений столбцов, сопоставленных с управляемыми тегами
  • Маскирование столбцов: скрытие столбцов, сопоставленных с управляемыми тегами
  • Условное маскирование: маскирование столбца на основе значения другого столбца в той же строке путем добавления тега в контекстный столбец и передачи его в UDF через UDF USING COLUMNS

Очистка

Чтобы удалить все объекты, созданные в этом руководстве, выполните следующие действия. Если вы пропустили шаги условной маскировки электронной почты, инструкции DROP POLICY mask_email_by_consent_policy и DROP FUNCTION mask_email_by_consent не выполнятся, что ожидаемо.

DROP POLICY hide_eu_customers ON SCHEMA abac_tutorial.customers;
DROP POLICY redact_ssn_policy ON SCHEMA abac_tutorial.customers;
DROP POLICY mask_email_by_consent_policy ON SCHEMA abac_tutorial.customers;
DROP FUNCTION IF EXISTS abac_tutorial.customers.is_not_eu_address;
DROP FUNCTION IF EXISTS abac_tutorial.customers.redact_ssn;
DROP FUNCTION IF EXISTS abac_tutorial.customers.mask_email_by_consent;
DROP TABLE IF EXISTS abac_tutorial.customers.profiles;
DROP SCHEMA IF EXISTS abac_tutorial.customers CASCADE;

Чтобы удалить теги, управляемые pii и consent, используйте пользовательский интерфейс обозревателя каталогов.