Aller au contenu principal

Masquer les colonnes PII par type avec l'introspection de tag

Ce tutoriel montre comment utiliser la valeur d’un tag de colonne gouvernée pour choisir une règle de masquage pour les informations personnellement identifiables (PII). Une politique de masque de colonne basée sur des attributs (ABAC) unique couvre chaque colonne taguée en tant qu’adresse e-mail ou numéro de téléphone, et une fonction définie par l’utilisateur (UDF) SQL applique le masque approprié à chaque colonne. La politique utilise la fonction d’introspection de tag get_column_tag_value() pour transmettre la valeur de tag de chaque colonne à l’UDF.

Pour la syntaxe et le comportement des fonctions d’introspection de tag, consultez Fonctions d’introspection de tag.

Prérequis​

  • Un SQL warehouse, un compute serverless ou Databricks Runtime 18 LTS et versions supérieures pour créer la politique. Pour query la table protégée, utilisez n’importe quel compute répondant aux exigences de compute ABAC.
  • Le privilège CREATE pour les tags gouvernés au niveau du compte. Les administrateurs du compte et les administrateurs du Workspace ont ce privilège par default.
  • Le privilège ASSIGN sur le tag gouverné que vous créez. Les administrateurs de compte possèdent ce privilège par default. Voir Gérer les autorisations sur les tags gouvernés.
  • Le privilège APPLY TAG sur la table contacts pour définir les balises de colonne à l’étape 3.
  • MANAGE autorisation sur le catalogue ou le schéma cible.
  • EXECUTE sur l'UDF.

Scénario​

Votre organisation classifie les colonnes PII avec la balise régie pii_type, dont la valeur identifie le type de données, tel que email ou phone. Chaque type nécessite un masque différent : masquer la partie locale d’une adresse e-mail, mais conserver les quatre derniers chiffres d’un numéro de téléphone.

Grâce à l’introspection des étiquettes, une seule politique protège toutes les colonnes étiquetées avec pii_type, tout en appliquant un masque différent pour chaque type d’informations personnellement identifiables (PII).

La politique fait correspondre toutes les colonnes avec la balise pii_type et transmet la valeur de la balise de chaque colonne à l'UDF. L'UDF utilise cette valeur pour sélectionner le masque approprié.

Vous pouvez réutiliser une seule politique sur plusieurs types de PII plutôt que de créer une politique distincte pour chaque type.

Le besoin d'introspection des balises dépend de la détermination de la manière dont l'UDF masque les données par la valeur de la balise :

Quand

Motif

L'UDF applique différents masques en fonction de la valeur du tag

has_tag() pour faire correspondre les colonnes et get_column_tag_value() pour passer la valeur à l'UDF

L'UDF applique le même masque à toutes les colonnes correspondantes

Une condition has_tag() ou has_tag_value(), sans introspection de tag

Quand

Motif

L'UDF applique différents masques en fonction de la valeur du tag

has_tag() pour faire correspondre les colonnes et get_column_tag_value() pour passer la valeur à l'UDF

L'UDF applique le même masque à toutes les colonnes correspondantes

Une condition has_tag() ou has_tag_value(), sans introspection de tag

Étape 1 : Créer un tag gouverné​

Pour créer une balise régie avec des valeurs autorisées pour les deux types de PII, exécutez :

SQL
CREATE GOVERNED TAG pii_type
DESCRIPTION 'PII type used by the ABAC tag introspection tutorial'
VALUES ('email', 'phone');

Les clés de tag gérées sont uniques au sein du compte. Si un tag géré nommé pii_type existe déjà, l’instruction renvoie une erreur ALREADY_EXISTS. Choisissez une clé différente et utilisez-la tout au long du tutoriel. Pour la syntaxe complète, consultez CRÉER UN TAG GÉRÉ.

attention

Les données des tags sont stockées en texte clair et peuvent être répliquées à l’échelle mondiale. N’utilisez pas de noms de tags, de valeurs ou de descripteurs susceptibles de compromettre la sécurité de vos ressources. Par exemple, n’utilisez pas de noms, de valeurs ou de descripteurs de tags contenant des informations personnelles ou sensibles.

Étape 2 : Créer des données d’exemple​

Créez un catalogue, un schéma et une table contacts avec une colonne d'e-mail et une colonne de téléphone :

SQL
CREATE CATALOG IF NOT EXISTS abac_tutorial;
USE CATALOG abac_tutorial;

CREATE SCHEMA IF NOT EXISTS introspection_demo;
USE SCHEMA introspection_demo;

CREATE OR REPLACE TABLE contacts (
contact_id INT,
email STRING,
phone STRING
);

INSERT INTO contacts VALUES
(1, 'alex@example.com', '123-456-7890'),
(2, 'sam@example.com', '234-567-8901');

Étape 3 : Appliquer le tag gouverné​

Balisez les deux colonnes avec des valeurs différentes de la même clé de balise :

SQL
ALTER TABLE contacts
ALTER COLUMN email SET TAGS ('pii_type' = 'email');
ALTER TABLE contacts
ALTER COLUMN phone SET TAGS ('pii_type' = 'phone');

Les deux colonnes partagent désormais la clé de tag pii_type. La valeur du tag indique à l'UDF quel masque appliquer.

Étape 4 : Créer l’UDF de masquage​

Créer une fonction UDF SQL qui prend la valeur de la colonne et son type PII :

SQL
CREATE OR REPLACE FUNCTION abac_tutorial.introspection_demo.mask_pii_by_type(
col_value STRING,
pii_type STRING
)
RETURNS STRING
RETURN CASE
WHEN col_value IS NULL THEN NULL
WHEN pii_type = 'email' THEN regexp_replace(col_value, '(^[^@]+)', '***')
WHEN pii_type = 'phone' THEN concat('***-***-', right(col_value, 4))
ELSE '***'
END;

La branch ELSE masque entièrement la valeur si l'UDF reçoit un type PII qu'elle ne reconnaît pas, ou aucun type du tout.

Étape 5 : créer la politique de masque de colonne​

Créer une politique qui s'applique à chaque colonne du schéma avec le tag pii_type :

SQL
CREATE POLICY mask_pii_columns
ON SCHEMA abac_tutorial.introspection_demo
COLUMN MASK abac_tutorial.introspection_demo.mask_pii_by_type
TO `account users`
FOR TABLES
MATCH COLUMNS has_tag('pii_type') AS pii_col
ON COLUMN pii_col
USING COLUMNS (get_column_tag_value(pii_col, 'pii_type'));

Dans cette politique :

  • has_tag('pii_type') correspond à chaque colonne qui possède le tag, quelle que soit sa valeur.
  • ON COLUMN pii_col passe les données de la colonne correspondante comme premier argument de l'UDF.
  • USING COLUMNS (get_column_tag_value(pii_col, 'pii_type')) transmet la valeur de tag de cette colonne, email ou phone, comme deuxième argument.

Étape 6 : Vérifier les résultats​

Comme la politique s’applique à account users, elle s’applique également à vous. Pour vérifier les valeurs masquées, exécutez :

SQL
SELECT * FROM abac_tutorial.introspection_demo.contacts;

La query retourne :

Output
contact_id email phone
1 ***@example.com ***-***-7890
2 ***@example.com ***-***-8901

Les colonnes e-mail et téléphone sont masquées différemment, mais la même politique protège les deux.

Pourquoi ce modèle fonctionne​

La politique fait correspondre les colonnes en fonction de la clé de balise, indépendamment du fait que la valeur soit email ou phone. L'UDF reçoit la valeur de la balise et applique le masque correspondant.

Pour prendre en charge un autre type de PII, tel que ssn:

  1. Ajoutez ssn aux valeurs autorisées du tag gouverné.
  2. Ajoutez une branch ssn à l’UDF.
  3. Marquez les nouvelles colonnes.

La politique ne change pas.

Ce modèle consolide les politiques qui ne diffèrent que par la manière dont elles masquent des données. Si différents types de PII nécessitent des principaux TO ou EXCEPT différents, vous avez toujours besoin de politiques distinctes. Consultez Implémenter le masquage de colonne multidomaine avec des niveaux de sensibilité pour obtenir un exemple.

Pour l'introspection de tag de table avec get_tag_value(), voir Fonctions d'introspection de tag.

Nettoyer​

Pour supprimer les objets créés dans ce tutoriel, exécutez :

SQL
DROP POLICY mask_pii_columns ON SCHEMA abac_tutorial.introspection_demo;
DROP FUNCTION IF EXISTS abac_tutorial.introspection_demo.mask_pii_by_type;
DROP TABLE IF EXISTS abac_tutorial.introspection_demo.contacts;
DROP SCHEMA IF EXISTS abac_tutorial.introspection_demo CASCADE;

D’autres tutoriels ABAC utilisent également le catalogue abac_tutorial, donc ce nettoyage le laisse en place. Pour le supprimer, exécutez DROP CATALOG IF EXISTS abac_tutorial CASCADE.

Pour supprimer le tag gouverné, supprimez d'abord la politique, puis exécutez :

SQL
DROP GOVERNED TAG pii_type;