Как использовать динамическое маскирование данных для объектов 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