Passer au contenu principal
Le masquage des données est une technique de protection des données qui consiste à remplacer les données d’origine par une version qui en conserve le format et la structure, tout en supprimant toute information personnellement identifiable (PII) ou toute donnée sensible. Ce guide vous montre comment masquer des données dans ClickHouse à l’aide de plusieurs approches :
  • politique de masquage (ClickHouse Cloud, 25.12+) : masquage dynamique natif appliqué à l’exécution des requêtes pour des utilisateurs/rôles spécifiques
  • fonction de remplacement de chaînes : masquage simple à l’aide de fonctions intégrées
  • VIEW masqué : création de vues avec une logique de transformation
  • colonne matérialisée : stockage de versions masquées en parallèle des données d’origine
  • règle de masquage des requêtes : masquage des données sensibles dans les logs (ClickHouse OSS)

Utiliser les politiques de masquage (ClickHouse Cloud)

Les politiques de masquage sont disponibles dans ClickHouse Cloud à partir de la version 25.12.
L’instruction CREATE MASKING POLICY offre un moyen natif de masquer dynamiquement les valeurs de colonnes pour des utilisateurs ou rôles spécifiques au moment de l’exécution de la requête. Contrairement à d’autres approches, les politiques de masquage n’exigent ni la création de vues distinctes ni le stockage de données masquées : la transformation s’applique de manière transparente lorsque les utilisateurs interrogent la table.

Politique de masquage de base

Pour illustrer les politiques de masquage, créons une table orders contenant des informations client :
Créez maintenant un rôle pour les utilisateurs autorisés à voir des données masquées :
Créez une politique de masquage qui s’applique au rôle masked_data_viewer :
Lorsqu’un utilisateur disposant du rôle masked_data_viewer interroge la table orders, il voit automatiquement des données masquées :
Query
Response (for masked_data_viewer role)
Les utilisateurs qui n’ont pas le rôle masked_data_viewer voient les données d’origine non masquées.

Masquage conditionnel

Vous pouvez utiliser la clause WHERE pour appliquer le masquage uniquement à certaines lignes. Par exemple, pour masquer uniquement les commandes d’un montant élevé :

Plusieurs politiques avec priorité

Lorsque plusieurs politiques de masquage s’appliquent à la même colonne, utilisez la clause PRIORITY pour déterminer quelle transformation sera appliquée. Les valeurs de priorité les plus élevées sont appliquées en dernier :
Dans cet exemple, pour les commandes avec total_amount > 100, la politique refined_masking (priorité 10) prend le pas sur la politique basic_masking (priorité 0) pour la colonne name, tandis que email continue d’utiliser le masquage de base.

Masquage basé sur le hachage

Lorsque vous avez besoin d’un masquage constant (une même valeur d’entrée produit toujours le même résultat masqué), utilisez des fonctions de hachage :

Gérer les politiques de masquage

Affichez toutes les politiques de masquage :
Supprimez une politique de masquage :
Remplacez une politique existante :
Pour plus d’informations, consultez la documentation CREATE MASKING POLICY.

Utiliser les fonctions de remplacement de chaînes

Pour les cas simples de masquage des données, la famille de fonctions replace offre un moyen pratique de masquer les données : Par exemple, vous pouvez remplacer le nom “John Smith” par un espace réservé [CUSTOMER_NAME] à l’aide de la fonction replaceOne :
Query
Response
De façon plus générale, vous pouvez utiliser replaceRegexpOne pour remplacer n’importe quel nom de client :
Query
Response
Vous pouvez aussi masquer un numéro de sécurité sociale en ne laissant apparaître que les 4 derniers chiffres à l’aide de la fonction replaceRegexpAll.
Query
Dans la requête ci-dessus, \3 sert à insérer le troisième groupe de capture dans la chaîne résultante, ce qui produit :
Response

Créer des VIEWs masquées

Une VIEW peut être utilisée avec les fonctions sur les chaînes de caractères mentionnées ci-dessus pour appliquer des transformations aux colonnes contenant des données sensibles avant qu’elles ne soient présentées à l’utilisateur. Ainsi, les données d’origine restent inchangées, et les utilisateurs qui interrogent la vue ne voient que les données masquées. Pour l’illustrer, imaginons que nous disposions d’une table stockant des enregistrements de commandes clients. Nous voulons nous assurer qu’un groupe d’employés puisse consulter ces informations, sans pour autant leur donner accès à l’intégralité des informations sur les clients. Exécutez la requête ci-dessous pour créer une table d’exemple orders et y insérer quelques enregistrements fictifs de commandes clients :
Créez une vue nommée masked_orders :
Dans la clause SELECT de la requête de création de la vue ci-dessus, nous définissons des transformations à l’aide de replaceRegexpOne sur les champs name, email, phone et shipping_address, qui contiennent des informations sensibles que nous souhaitons masquer partiellement. Sélectionnez les données de la vue :
Query
Response
Notez que les données renvoyées par la vue sont partiellement masquées, ce qui dissimule les informations sensibles. Vous pouvez également créer plusieurs vues, avec des niveaux d’obfuscation différents selon le niveau d’accès privilégié aux informations dont dispose l’utilisateur. Pour vous assurer que les utilisateurs ne peuvent accéder qu’à la vue renvoyant les données masquées, et non à la table contenant les données d’origine non masquées, vous devez utiliser le contrôle d’accès basé sur les rôles afin que des rôles spécifiques disposent uniquement des autorisations nécessaires pour effectuer des sélections depuis la vue. Créez d’abord le rôle :
Ensuite, accordez au rôle le privilège SELECT sur la vue :
Comme les rôles ClickHouse sont cumulatifs, vous devez vous assurer que les utilisateurs qui ne doivent voir que la vue masquée ne disposent d’aucun privilège SELECT sur la table de base, quel que soit le rôle concerné. Il est donc plus sûr de révoquer explicitement l’accès à la table de base :
Enfin, attribuez le rôle aux utilisateurs concernés :
Cela garantit que les utilisateurs ayant le rôle masked_orders_viewer ne peuvent voir que les données masquées de la vue, et non les données d’origine non masquées de la table.

Utiliser des colonnes MATERIALIZED et des restrictions d’accès au niveau des colonnes

Si vous ne souhaitez pas créer de vue distincte, vous pouvez stocker des versions masquées de vos données avec les données d’origine. Pour ce faire, vous pouvez utiliser des colonnes matérialisées. Les valeurs de ces colonnes sont automatiquement calculées à partir de l’expression matérialisée spécifiée lors de l’insertion des lignes, et vous pouvez les utiliser pour créer de nouvelles colonnes contenant des versions masquées des données. En reprenant l’exemple précédent, au lieu de créer une VIEW distincte pour les données masquées, nous allons maintenant créer des colonnes masquées à l’aide de MATERIALIZED :
Si vous exécutez maintenant la requête SELECT suivante, vous verrez que les données masquées sont ‘matérialisées’ au moment de l’insertion et stockées avec les données d’origine non masquées. Il est nécessaire de sélectionner explicitement les colonnes masquées, car ClickHouse n’inclut pas automatiquement les colonnes matérialisées dans les requêtes SELECT * par défaut.
Query
Response
Pour garantir que les utilisateurs puissent uniquement accéder aux colonnes contenant des données masquées, vous pouvez à nouveau utiliser le contrôle d’accès basé sur les rôles pour faire en sorte que certains rôles ne disposent que du privilège SELECT sur les colonnes masquées de orders. Recréez le rôle que nous avons créé précédemment :
Ensuite, accordez le privilège SELECT sur la table orders :
Révoquez l’accès aux colonnes sensibles :
Enfin, attribuez le rôle aux utilisateurs concernés :
Si vous souhaitez stocker uniquement les données masquées dans la table orders, vous pouvez marquer les colonnes sensibles non masquées comme EPHEMERAL, ce qui garantit que les colonnes de ce type ne sont pas stockées dans la table.
Si nous exécutons la même requête que précédemment, vous verrez maintenant que seules les données masquées matérialisées ont été insérées dans la table :
Query
Response

Utiliser les règles de masquage des requêtes pour les données de journalisation

Pour les utilisateurs de ClickHouse OSS qui souhaitent masquer spécifiquement les données de journalisation, il est possible d’utiliser les règles de masquage des requêtes (masquage des logs) pour masquer les données. Pour ce faire, vous pouvez définir des règles de masquage basées sur des expressions régulières dans la configuration du serveur. Ces règles sont appliquées aux requêtes et à tous les messages de log avant d’être stockés dans les logs du serveur ou les tables système (comme system.query_log, system.text_log et system.processes). Cela permet uniquement d’éviter que des données sensibles ne se retrouvent dans les logs. Notez que cela ne masque pas les données dans les résultats de requête. Par exemple, pour masquer un numéro de sécurité sociale, vous pouvez ajouter la règle suivante à votre configuration du serveur :
Dernière modification le 29 juin 2026