Utilisation du masquage dynamique des données

Cette rubrique fournit des instructions sur la configuration et l’utilisation du masquage dynamique des données dans Snowflake.

Utilisation du masquage dynamique des données

Ce qui suit répertorie les étapes de haut niveau pour configurer et utiliser le masquage dynamique des données dans Snowflake :

  1. Accordez des privilèges de gestion des politiques de masquage à un rôle personnalisé pour un responsable de la sécurité ou de la confidentialité.

  2. Le responsable de la sécurité ou de la confidentialité crée et définit des politiques de masquage et les applique aux colonnes contenant des données sensibles.

  3. Exécutez des requêtes dans Snowflake. Remarques :

    • Snowflake réécrit dynamiquement la requête en appliquant l’expression SQL de la politique de masquage à la colonne.

    • La réécriture de colonne se produit à chaque endroit où la colonne spécifiée dans la politique de masquage apparaît dans la requête (par exemple, projections, prédicat de jointure, prédicat de clause where, trier par et regrouper par).

    • Les utilisateurs voient les données masquées en fonction des conditions de contexte d’exécution définies dans les politiques de masquage. Pour plus d’informations sur le contexte d’exécution dans les politiques de masquage dynamique des données, voir Rubriques de sécurité avancées au niveau des colonnes.

Étape 1 : accordez des privilèges de politiques de masquage à un rôle personnalisé

Un responsable de la sécurité ou de la confidentialité doit servir d’administrateur de politiques de masquage (c’est-à-dire un rôle personnalisé : MASKING_ADMIN) et avoir les privilèges pour définir, gérer et appliquer des politiques de masquage aux colonnes.

Snowflake fournit les privilèges suivants à accorder à un responsable de la sécurité ou de la confidentialité pour les politiques de sécurité au niveau des colonnes :

Privilège

Description

CREATE MASKING POLICY

Ce privilège au niveau du schéma contrôle qui peut créer des politiques de masquage.

APPLY MASKING POLICY

Ce privilège au niveau du compte contrôle qui peut définir/annuler des politiques de masquage sur les colonnes et reçoit par défaut le rôle ACCOUNTADMIN. . Ce privilège permet uniquement d’appliquer une politique de masquage à une colonne et ne fournit aucun privilège de table supplémentaire décrit dans Privilèges de contrôle d’accès.

APPLY ON MASKING POLICY

En option. Ce privilège au niveau de la politique peut être utilisé par un propriétaire de politique pour décentraliser les opérations de définition/annulation d’une politique de masquage donnée sur des colonnes vers les propriétaires d’objet (c’est-à-dire le rôle qui a le privilège OWNERSHIP sur l’objet). . Snowflake prend en charge le contrôle d’accès discrétionnaire dans lequel les propriétaires d’objets sont également considérés comme des gestionnaires de données. . Si l’administrateur de politique fait confiance aux propriétaires d’objets pour être des gestionnaires de données pour les colonnes protégées, alors l’administrateur de politique peut utiliser ce privilège pour décentraliser l’application des opérations de définition/annulation de politiques.

L’exemple suivant crée le rôle MASKING_ADMIN et accorde des privilèges de politiques de masquage à ce rôle.

-- create a masking policy administrator custom role

CREATE ROLE masking_admin;

-- grant privileges to masking_admin role.

GRANT CREATE MASKING POLICY on SCHEMA <schema_name> to ROLE masking_admin;

GRANT APPLY MASKING POLICY on ACCOUNT to ROLE masking_admin;

-- allow table_owner role to set or unset the ssn_mask masking policy (optional)

GRANT APPLY ON MASKING POLICY ssn_mask to ROLE table_owner;

Où :

  • nom_schéma

    Indique l’identificateur du schéma pour lequel le privilège doit être accordé.

Pour plus d’informations, voir :

Étape 2 : créez une politique de masquage et appliquez-la à une colonne

À l’aide du rôle MASKING_ADMIN, créez une politique de masquage et appliquez-la à une colonne.

Dans cet exemple représentatif, les utilisateurs avec le rôle ANALYST voient la valeur non masquée. Les utilisateurs sans le rôle ANALYST voient un masque complet.

-- create masking policy

create or replace masking policy email_mask as (val string) returns string ->
  case
    when current_role() in ('ANALYST') then val
    else '*********'
  end;

Étape 3 : appliquez la politique de masquage à une colonne de table ou de vue

Exécutez les instructions suivantes pour appliquer la politique à une colonne de table ou une colonne de vue.

-- apply masking policy to a table column

alter table if exists user_info modify column email set masking policy email_mask;

-- apply the masking policy to a view column

alter view user_info_v modify column email set masking policy email_mask;

Étape 4 : interrogez les données dans Snowflake

Exécutez deux requêtes différentes dans Snowflake, une requête avec le rôle ANALYST et une autre requête avec un rôle différent, pour vérifier que les utilisateurs sans le rôle ANALYST voient un masque complet.

-- using the ANALYST role

use role ANALYST;
select email from user_info; -- should see plain text value

-- using the PUBLIC role

use role public;
select email from user_info; -- should see full data mask

Exemples de politiques de masquage supplémentaires

Voici des exemples représentatifs supplémentaires qui peuvent être utilisés dans le corps de la politique de masquage dynamique des données.

Renvoi de NULL pour les utilisateurs non autorisés :

case
  when current_role() IN ('ANALYST') then val
  else NULL
end;

Renvoi d’une valeur masquée statique pour les utilisateurs non autorisés :

CASE
  WHEN current_role() IN ('ANALYST') THEN val
  ELSE '********'
END;

Renvoi d’une valeur de hachage en utilisant SHA2 , SHA2_HEX pour les utilisateurs non autorisés :

CASE
  WHEN current_role() IN ('ANALYST') THEN val
  ELSE sha2(val) -- return hash of the column value
END;

Appliquer un masque partiel ou un masque complet :

CASE
  WHEN current_role() IN ('ANALYST') THEN val
  WHEN current_role() IN ('SUPPORT') THEN regexp_replace(val,'.+\@','*****@') -- leave email domain unmasked
  ELSE '********'
END;

En utilisant une UDF :

CASE
  WHEN current_role() IN ('ANALYST') THEN val
  ELSE mask_udf(val) -- custom masking function
END;

Sur les données des variantes :

CASE
   WHEN current_role() IN ('ANALYST') THEN val
   ELSE OBJECT_INSERT(val, 'USER_IPADDRESS', '****', true)
END;

En utilisant une table de droits personnalisée. Notez l’utilisation de EXISTS dans la clause WHEN. Utilisez toujours EXISTS lors de l’inclusion d’une sous-requête dans le corps de la politique de masquage.

CASE
  WHEN current_role() EXISTS
    (SELECT role from <db>.<schema>.entitlement where mask_method='unmask') THEN val
  ELSE '********'
END;

En utilisant DECRYPT sur des données précédemment chiffrées avec ENCRYPT ou ENCRYPT_RAW, avec une phrase secrète sur les données chiffrées :

case
  when current_role() in ('ANALYST') then DECRYPT(val, $passphrase)
  else val -- shows encrypted value
end;

En utilisant JavaScript UDFs sur JSON (variante) :

Dans cet exemple, une UDF JavaScript masque les données d’emplacement dans une chaîne JSON. Il est important de définir le type de données comme VARIANT dans l’UDF et la politique de masquage.

-- Flatten the JSON data

create or replace table <table_name> (v variant) as
select value::variant
from @<table_name>,
  table(flatten(input => parse_json($1):stationLocation));

-- JavaScript UDF to mask latitude, longitude, and location data

CREATE OR REPLACE FUNCTION full_location_masking(v variant)
  RETURNS variant
  LANGUAGE JAVASCRIPT
  AS
  $$
    if ("latitude" in V) {
      V["latitude"] = "**latitudeMask**";
    }
    if ("longitude" in V) {
      V["longitude"] = "**longitudeMask**";
    }
    if ("location" in V) {
      V["location"] = "**locationMask**";
    }

    return V;
  $$;

  -- Grant UDF usage to ACCOUNTADMIN

  grant ownership on function FULL_LOCATION_MASKING(variant) to role accountadmin;

  -- Create a masking policy using JavaScript UDF

  create or replace masking policy json_location_mask as (val variant) returns variant ->
    CASE
      WHEN current_role() IN ('ANALYST') THEN val
      else full_location_masking(val)
      -- else object_insert(val, 'latitude', '**locationMask**', true) -- limited to one value at a time
    END;

Pour des exemples utilisant d’autres fonctions de contexte et la hiérarchie des rôles, voir Rubriques de sécurité avancées au niveau des colonnes.

Chapitres suivants :