Anonymiser les données sensibles stockées dans Cloud Storage à l'aide de l'API

{}

Cette page explique comment anonymiser les données sensibles stockées dans Cloud Storage à l'aide de l'API Cloud Data Loss Prevention.

Cette opération permet de garantir que les fichiers que vous utilisez dans vos processus d'entreprise ne contiennent pas de données sensibles, telles que des informations personnelles. Cloud Data Loss Prevention peut inspecter les fichiers d'un bucket Cloud Storage à la recherche de données sensibles et créer des copies anonymisées de ces fichiers dans un bucket distinct. Vous pouvez ensuite utiliser des copies anonymisées dans vos processus métier.

Pour en savoir plus sur ce qui se passe lorsque vous anonymisez des données dans le stockage, consultez la page Anonymiser des données sensibles dans le stockage.

Avant de commencer

Cette page part du principe que:

Découvrez les limites et points de considération concernant cette opération.

L'inspection du stockage nécessite le champ d'application OAuth suivant : https://www.googleapis.com/auth/cloud-platform. Pour en savoir plus, consultez la page S'authentifier sur l'API DLP.

Rôles IAM requis

Si toutes les ressources de cette opération appartiennent au même projet, le rôle Agent de service de l'API DLP (roles/dlp.serviceAgent) sur l'agent de service est suffisant. Ce rôle vous permet d'effectuer les opérations suivantes:

  • Créer la tâche d'inspection
  • Lire les fichiers dans le répertoire d'entrée
  • Écrire les fichiers anonymisés dans le répertoire de sortie
  • Écrire les détails de la transformation dans une table BigQuery

Les ressources concernées incluent la tâche d'inspection, les modèles de suppression de l'identification, le bucket d'entrée, le bucket de sortie et la table des détails de la transformation.

Si vous devez disposer des ressources dans des projets distincts, assurez-vous que l'agent de service de votre projet dispose également des rôles suivants:

  • Le rôle Lecteur des objets Storage (roles/storage.objectViewer) sur le bucket d'entrée ou le projet qui le contient.
  • Le rôle Créateur d'objets Storage (roles/storage.objectCreator) sur le bucket de sortie ou le projet qui le contient.
  • Le rôle Éditeur de données BigQuery (roles/bigquery.dataEditor) sur la table de détails de la transformation ou le projet qui le contient.

Pour attribuer un rôle à votre agent de service, qui est un compte de service géré par Google, consultez Attribuer un seul rôle. Vous pouvez également contrôler les accès aux niveaux suivants:

Présentation de l'API

Pour supprimer l'identification du contenu stocké dans Cloud Storage, vous devez configurer une tâche d'inspection qui recherche les données sensibles selon les critères que vous spécifiez. Ensuite, dans la tâche d'inspection, vous fournissez des instructions d'anonymisation sous la forme d'une action Deidentify.

Si vous souhaitez analyser uniquement un sous-ensemble des fichiers de votre bucket, vous pouvez limiter les fichiers analysés par la tâche. Les options acceptées pour les tâches d'anonymisation sont le filtrage par fichier (FileType) et l'expression régulière (FileSet).

Lorsque vous activez l'action Deidentify, Cloud DLP transforme par défaut tous les types de fichiers compatibles inclus dans l'analyse. Toutefois, vous pouvez configurer la tâche pour qu'elle ne transforme qu'un sous-ensemble des types de fichiers compatibles.

Facultatif: Créer des modèles d'anonymisation

Si vous souhaitez contrôler la transformation des résultats, créez les modèles suivants. Ces modèles fournissent des instructions sur la transformation des résultats dans les fichiers structurés, non structurés et les images.

  • Modèle d'anonymisation:un DeidentifyTemplate par défaut à utiliser pour les fichiers non structurés, tels que les fichiers texte à forme libre. Ce type d'élément DeidentifyTemplate ne peut pas contenir d'objet RecordTransformations, qui n'est compatible qu'avec le contenu structuré. Si ce modèle n'est pas présent, Cloud DLP transforme les fichiers non structurés à l'aide de la méthode ReplaceWithInfoTypeConfig.

  • Modèle d'anonymisation structuré : un DeidentifyTemplate à utiliser pour les fichiers structurés, tels que les fichiers CSV. Ce DeidentifyTemplate peut contenir RecordTransformations. Si ce modèle n'est pas présent, Cloud DLP utilise le modèle d'anonymisation par défaut que vous avez créé. Si ce n'est pas le cas, Cloud DLP transforme les fichiers structurés à l'aide de la méthode ReplaceWithInfoTypeConfig.

  • Modèle de masquage d'images : un DeidentifyTemplate à utiliser pour les images. Ce modèle doit contenir un objet ImageTransformations. Si ce modèle n'est pas présent, Cloud DLP masque tous les résultats dans les images avec une zone noire.

En savoir plus sur la création d'un modèle de suppression de l'identification

Créer une tâche d'inspection avec une action d'anonymisation

L'objet DlpJob fournit des instructions sur les éléments à inspecter, les types de données à signaler comme sensibles et la procédure à suivre avec les résultats. Pour supprimer l'identification des données sensibles dans un répertoire Cloud Storage, votre DlpJob doit définir au moins les éléments suivants:

  • Un objet StorageConfig qui spécifie le répertoire Cloud Storage à inspecter.
  • Un objet InspectConfig, qui contient les types de données à rechercher et des instructions d'inspection supplémentaires pour identifier les données sensibles
  • Une action Deidentify contenant les éléments suivants:

    • Un objet TransformationConfig, qui spécifie les modèles créés pour anonymiser les données dans les fichiers structurés et non structurés. Vous pouvez également inclure une configuration permettant de masquer les données sensibles des images.

      Si vous n'incluez pas d'objet TransformationConfig, Cloud DLP remplace les données sensibles dans le texte par son infoType. Sur les images, il recouvre les données sensibles avec une zone noire.

    • Un objet TransformationDetailsStorageConfig, qui spécifie une table BigQuery dans laquelle Cloud DLP doit stocker les détails de chaque transformation. Pour chaque transformation, les détails incluent une description, un code de réussite ou d'erreur, les détails de l'erreur, le nombre d'octets transformés, l'emplacement du contenu transformé et le nom de la tâche d'inspection dans laquelle Cloud DLP a effectué la transformation. Ce tableau ne stocke pas le contenu anonymisé.

    Lorsque des données sont écrites dans une table BigQuery, l'utilisation de la facturation et des quotas est appliquée au projet contenant la table de destination.

Une fois que le contenu copié a été anonymisé, la tâche d'anonymisation se termine. La tâche contient un récapitulatif du nombre de transformations appliquées, que vous pouvez récupérer à l'aide de la méthode projects.dlpJobs.get sur DlpJob. Le DlpJob renvoyé inclut à la fois un objet DeidentifyDataSourceDetails et un objet InspectDataSourceDetails. Ces objets contiennent respectivement les résultats d'une action Deidentify et de la tâche d'inspection.

Si vous avez inclus un objet TransformationDetailsStorageConfig dans votre DlpJob, une table BigQuery est créée, contenant des métadonnées sur les détails de la transformation. Pour chaque transformation, Cloud DLP écrit une ligne de métadonnées dans la table. Pour en savoir plus sur le contenu de la table, consultez la documentation de référence sur les détails de la transformation.

Exemple de code

L'exemple JSON suivant montre comment anonymiser les fichiers dans un répertoire Cloud Storage.

Méthode et URL HTTP

POST https://dlp.googleapis.com/v2/projects/PROJECT_ID/dlpJobs

Saisie JSON

{
   "inspect_job": {
     "storage_config": {
       "cloud_storage_options": {
         "file_set": {
           "url": "INPUT_DIRECTORY"
         }
       }
     },
     "inspect_config": {
       "info_types": [
         {
           "name": "PERSON_NAME"
         }
       ]
     },
     "actions": {
       "deidentify": {
         "cloud_storage_output": "OUTPUT_DIRECTORY",
         "transformation_config": {
           "deidentify_template": "DEIDENTIFY_TEMPLATE_NAME",
           "structured_deidentify_template": "STRUCTURED_DEIDENTIFY_TEMPLATE_NAME",
           "image_redact_template": "IMAGE_REDACTION_TEMPLATE_NAME"
         },
         "transformation_details_storage_config": {
           "table": {
             "project_id": "TRANSFORMATION_DETAILS_PROJECT_ID",
             "dataset_id": "TRANSFORMATION_DETAILS_DATASET_ID",
             "table_id": "TRANSFORMATION_DETAILS_TABLE_ID"
           }
         },
         "fileTypesToTransform": ["IMAGE","CSV", "TEXT_FILE"]
       }
     }
   }
 }

Remplacez les éléments suivants :

  • PROJECT_ID : ID du projet dans lequel vous souhaitez stocker la tâche d'inspection.
  • INPUT_DIRECTORY: répertoire Cloud Storage que vous souhaitez inspecter, par exemple gs://input-bucket/folder1/folder1a. Si l'URL se termine par une barre oblique, les sous-répertoires de INPUT_DIRECTORY ne sont pas analysés.
  • OUTPUT_DIRECTORY: répertoire Cloud Storage dans lequel vous souhaitez stocker les fichiers anonymisés. Ce répertoire ne doit pas se trouver dans le même bucket Cloud Storage que INPUT_DIRECTORY.
  • DEIDENTIFY_TEMPLATE_NAME : nom complet de la ressource du modèle d'anonymisation par défaut (pour les fichiers non structurés et les fichiers structurés), si vous en avez créé un. Cette valeur doit être au format projects/projectName/(locations/locationId)/deidentifyTemplates/templateName.
  • STRUCTURED_DEIDENTIFY_TEMPLATE_NAME : nom complet de la ressource du modèle d'anonymisation des fichiers structurés, le cas échéant. Cette valeur doit être au format projects/projectName/(locations/locationId)/deidentifyTemplates/templateName.
  • IMAGE_REDACTION_TEMPLATE_NAME : nom complet de la ressource du modèle de masquage des images, le cas échéant. Cette valeur doit être au format projects/projectName/(locations/locationId)/deidentifyTemplates/templateName.
  • TRANSFORMATION_DETAILS_PROJECT_ID: ID du projet dans lequel vous souhaitez stocker les détails de la transformation.
  • TRANSFORMATION_DETAILS_DATASET_ID : ID de l'ensemble de données BigQuery dans lequel vous souhaitez stocker les détails de la transformation. Si vous ne fournissez pas d'ID de table, le système en crée un automatiquement.
  • TRANSFORMATION_DETAILS_TABLE_ID : ID de la table BigQuery dans laquelle vous souhaitez stocker les détails de la transformation.

Dans l'exemple JSON précédent, notez les points suivants:

  • inspectJob: objet de configuration de la tâche (DlpJob). Cet objet contient la configuration pour les étapes d'inspection et d'anonymisation.
  • storageConfig: emplacement du contenu à inspecter (StorageConfig). Cet exemple spécifie un bucket Cloud Storage CloudStorageOptions.
  • inspectConfig : informations sur les données sensibles que vous souhaitez inspecter (InspectConfig). Cet exemple examine le contenu correspondant à l'infoType intégré PERSON_NAME.
  • actions : actions à effectuer une fois la partie d'inspection de la tâche terminée (Action).
  • deidentify: spécifier cette action indique à Cloud DLP d'anonymiser les données sensibles correspondantes en fonction de la configuration spécifiée dans Deidentify.
  • cloud_storage_output : spécifie l'URL du répertoire Cloud Storage que vous souhaitez inspecter.
  • transformation_config : indique comment Cloud DLP doit anonymiser les données sensibles dans les fichiers structurés, non structurés et les images (TransformationConfig).

    Si vous n'incluez pas d'objet TransformationConfig, Cloud DLP remplace les données sensibles dans le texte par son infoType. Sur les images, il recouvre les données sensibles avec une zone noire.

  • transformation_details_storage_config: indique que Cloud DLP doit stocker les métadonnées de chaque transformation effectuée pour cette tâche. Il spécifie également l'emplacement et le nom de la table dans laquelle Cloud DLP doit stocker ces métadonnées (TransformationDetailsStorageConfig).

  • fileTypesToTransform: limite l'opération d'anonymisation uniquement aux types de fichiers que vous répertoriez. Si vous ne définissez pas ce champ, tous les types de fichiers compatibles inclus dans l'opération d'inspection sont également inclus dans l'opération d'anonymisation. Dans cet exemple, Cloud DLP anonymise uniquement les fichiers image, CSV et texte, même si vous avez configuré DlpJob pour inspecter tous les types de fichiers compatibles.

Créer la tâche d'inspection

Pour créer la tâche d'inspection (DlpJob), envoyez une requête projects.dlpJobs.create. Pour envoyer la requête à l'aide de cURL, enregistrez l'exemple précédent en tant que fichier JSON et exécutez la commande suivante:

curl -s \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "X-Goog-User-Project: PROJECT_ID" \
https://dlp.googleapis.com/v2/projects/PROJECT_ID/dlpJobs \
-d @PATH_TO_JSON_FILE

Remplacez les éléments suivants :

  • PROJECT_ID: ID du projet dans lequel vous avez stocké l'élément DlpJob.
  • PATH_TO_JSON_FILE : chemin d'accès au fichier JSON contenant le corps de la requête.

Cloud DLP renvoie l'identifiant du nouveau fichier DlpJob, son état et un instantané de la configuration d'inspection que vous avez définie.

{
  "name": "projects/PROJECT_ID/dlpJobs/JOB_ID",
  "type": "INSPECT_JOB",
  "state": "PENDING",
  ...
}

Récupérer les résultats de la tâche d'inspection

Pour récupérer les résultats de DlpJob, envoyez une requête projects.dlpJobs.get:

curl -s \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "X-Goog-User-Project: PROJECT_ID" \
https://dlp.googleapis.com/v2/projects/PROJECT_ID/dlpJobs/JOB_ID

Remplacez les éléments suivants :

  • PROJECT_ID : ID du projet dans lequel vous avez stocké l'élément DlpJob.
  • JOB_ID: ID de l'offre d'emploi renvoyée lors de la création de DlpJob.

Si l'opération est terminée, vous obtenez une réponse semblable à celle-ci:

{
  "name": "projects/PROJECT_ID/dlpJobs/JOB_ID",
  "type": "INSPECT_JOB",
  "state": "DONE",
  "inspectDetails": {
    "requestedOptions": {
      "snapshotInspectTemplate": {},
      "jobConfig": {
        "storageConfig": {
          "cloudStorageOptions": {
            "fileSet": {
              "url": "INPUT_DIRECTORY"
            }
          }
        },
        "inspectConfig": {
          "infoTypes": [
            {
              "name": "PERSON_NAME"
            }
          ],
          "limits": {}
        },
        "actions": [
          {
            "deidentify": {
              "transformationDetailsStorageConfig": {
                "table": {
                  "projectId": "TRANSFORMATION_DETAILS_PROJECT_ID",
                  "datasetId": "TRANSFORMATION_DETAILS_DATASET_ID",
                  "tableId": "TRANSFORMATION_DETAILS_TABLE_ID"
                }
              },
              "transformationConfig": {
                "deidentifyTemplate": "DEIDENTIFY_TEMPLATE_NAME",
                "structuredDeidentifyTemplate": "STRUCTURED_DEIDENTIFY_TEMPLATE_NAME",
                "imageRedactTemplate": "IMAGE_REDACTION_TEMPLATE_NAME"
              },
              "fileTypesToTransform": [
                "IMAGE",
                "CSV",
                "TEXT_FILE"
              ],
              "cloudStorageOutput": "OUTPUT_DIRECTORY"
            }
          }
        ]
      }
    },
    "result": {
      "processedBytes": "25242",
      "totalEstimatedBytes": "25242",
      "infoTypeStats": [
        {
          "infoType": {
            "name": "PERSON_NAME"
          },
          "count": "114"
        }
      ]
    }
  },
  "createTime": "2022-06-09T23:00:53.380Z",
  "startTime": "2022-06-09T23:01:27.986383Z",
  "endTime": "2022-06-09T23:02:00.443536Z",
  "actionDetails": [
    {
      "deidentifyDetails": {
        "requestedOptions": {
          "snapshotDeidentifyTemplate": {
            "name": "DEIDENTIFY_TEMPLATE_NAME",
            "createTime": "2022-06-09T17:46:34.208923Z",
            "updateTime": "2022-06-09T17:46:34.208923Z",
            "deidentifyConfig": {
              "infoTypeTransformations": {
                "transformations": [
                  {
                    "primitiveTransformation": {
                      "characterMaskConfig": {
                        "maskingCharacter": "*",
                        "numberToMask": 25
                      }
                    }
                  }
                ]
              }
            },
            "locationId": "global"
          },
          "snapshotStructuredDeidentifyTemplate": {
            "name": "STRUCTURED_DEIDENTIFY_TEMPLATE_NAME",
            "createTime": "2022-06-09T20:51:12.411456Z",
            "updateTime": "2022-06-09T21:07:53.633149Z",
            "deidentifyConfig": {
              "recordTransformations": {
                "fieldTransformations": [
                  {
                    "fields": [
                      {
                        "name": "Name"
                      }
                    ],
                    "primitiveTransformation": {
                      "replaceConfig": {
                        "newValue": {
                          "stringValue": "[redacted]"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "locationId": "global"
          },
          "snapshotImageRedactTemplate": {
            "name": "IMAGE_REDACTION_TEMPLATE_NAME",
            "createTime": "2022-06-09T20:52:25.453564Z",
            "updateTime": "2022-06-09T20:52:25.453564Z",
            "deidentifyConfig": {},
            "locationId": "global"
          }
        },
        "deidentifyStats": {
          "transformedBytes": "3972",
          "transformationCount": "110"
        }
      }
    }
  ],
  "locationId": "global"
}

Étapes suivantes