Как использовать динамическое маскирование данных для объектов Json с несколькими слоями и / или массивами

Я смог создать политику маскирования данных для столбца json для ключей верхнего уровня со следующим, но не смог понять, как перейти на более глубокие уровни в json. Кто-нибудь это сделал?

CREATE OR REPLACE MASKING POLICY json_mask_test AS
(val variant) returns variant ->
CASE
WHEN invoker_role()='ADMIN' THEN val
ELSE object_insert(
     object_insert(
     object_insert(val, 'pii_field', '***', true),
         'address','***', true),
         'lastName','***', true)
END

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

Я использовал пример для данных о вариантах

Также в качестве побочного эффекта эта политика вставляет ключи в поля json, когда ключи не существуют в исходном поле. Было бы желательно иметь возможность это устранить.

Редактировать:

Я использовал этот json для примера выше{"regular_field": "regular data", "pii_field": "pii data"}

Я пытался замаскировать LastNames в json, как показано ниже

'{"root":[{"employees":[
   {"firstName":"John", "lastName":"Doe"},
   {"firstName":"Anna", "lastName":"Smith"},
   {"firstName":"Peter", "lastName":"Jones"}
]}]}'

2 ответа

Решение

В приведенном выше случае мы создаем представления, чтобы сгладить поля json для использования.

Чтобы удовлетворить требование, к представлению можно применить политику маскирования.

Просмотр определения:

CREATE OR REPLACE VIEW v_json_mask AS 
SELECT n.value:firstName::string firstName, n.value:lastName::string lastName
FROM json_test,
lateral flatten (input => v:root) r,
lateral flatten (input => r.value) e,
lateral flatten (input => e.value) n

Я создал другую политику маскирования для маскировки фамилии и применил ее к представлению

CREATE OR REPLACE MASKING POLICY lastName_mask AS
(lastName text) returns text ->
CASE
WHEN invoker_role()='ADMIN' THEN lastName
ELSE '*masked*'
END;

ALTER VIEW v_json_mask MODIFY COLUMN lastName SET MASKING POLICY lastName_mask;

Бег SELECT * FROM v_json_mask с любой ролью, не указанной в политике маскирования, возвращает

FIRSTNAME   LASTNAME
John        *masked*
Anna        *masked*
Peter       *masked*

Это также работает и было рекомендовано для маскирования данных до того, как Snowflake создала политики маскирования данных. Просто используйте RBAC для управления доступом к таблице JSON и используйте Secure View.

CREATE OR REPLACE SECURE VIEW v_json_mask AS 
SELECT n.value:firstName::string firstName, 
       CASE WHEN current_role()='ADMIN' THEN n.value:lastName::string
            ELSE '*masked*'
       END as lastName
FROM json_test,
lateral flatten (input => v:root) r,
lateral flatten (input => r.value) e,
lateral flatten (input => e.value) n
Другие вопросы по тегам