使用 API 对存储在 Cloud Storage 中的敏感数据进行去标识化

{}

本页介绍如何使用 Cloud Data Loss Prevention API 对存储在 Cloud Storage 中的敏感数据进行去标识化。

此操作有助于确保您在业务流程中使用的文件不包含敏感数据,例如个人身份信息 (PII)。Cloud Data Loss Prevention 可以检查 Cloud Storage 存储桶中的文件是否存在敏感数据,并在单独的存储桶中创建这些文件的去标识化副本。然后,您可以在业务流程中使用去标识化副本。

如需详细了解对存储空间中的数据进行去标识化处理时会发生什么,请参阅对存储空间中的敏感数据进行去标识化

准备工作

本页面假定:

了解此操作的限制和注意事项

存储空间检查需要以下 OAuth 范围:https://www.googleapis.com/auth/cloud-platform。如需了解详情,请参阅向 DLP API 进行身份验证

所需 IAM 角色

如果此操作的所有资源都位于同一项目中,则服务代理上的 DLP API Service Agent 角色 (roles/dlp.serviceAgent) 就已足够。使用该角色,您可以执行以下操作:

  • 创建检查作业
  • 读取输入目录中的文件
  • 将去标识化的文件写入输出目录
  • 在 BigQuery 表中写入转换详情

相关资源包括检查作业、去标识化模板、输入存储桶、输出存储桶和转换详情表。

如果您必须在单独的项目中拥有资源,请确保项目的服务代理也具有以下角色:

  • 输入存储桶或包含它的存储对象项目的 Storage Object Viewer 角色 (roles/storage.objectViewer)。
  • 输出存储桶或包含它的项目的 Storage Object Creator 角色 (roles/storage.objectCreator)。
  • 转换详情表或包含该表的数据项目的 BigQuery Data Editor 角色 (roles/bigquery.dataEditor)。

如需向服务代理(由 Google 管理的服务帐号)授予角色,请参阅授予单个角色。您还可以在以下级别控制访问权限:

API 概览

要对存储在 Cloud Storage 中的内容进行去标识化处理,请配置检查作业,以便根据您指定的条件查找敏感数据。然后,在检查作业中,您以 Deidentify 操作的形式提供去标识化说明。

如果您只想扫描存储桶中的部分文件,可以限制作业扫描的文件。支持去标识化的作业选项包括按类型 (FileType) 和正则表达式 (FileSet) 过滤文件。

启用 Deidentify 操作后,默认情况下,Cloud DLP 会转换扫描中包含的所有支持的文件类型。但是,您可以将作业配置为仅转换部分受支持的文件类型。

可选:创建去标识化模板

如果要控制发现结果的转换方式,请创建以下模板。这些模板说明了如何转换结构化文件、非结构化文件和图片中的发现结果。

  • 去标识化模板:用于非结构化文件(如自由格式的文本文件)的默认 DeidentifyTemplate。这种类型的 DeidentifyTemplate 不能包含仅受结构化内容支持的 RecordTransformations 对象。如果此模板不存在,Cloud DLP 使用 ReplaceWithInfoTypeConfig 方法转换非结构化文件。

  • 结构化去标识化模板:用于结构化文件(如 CSV 文件)的 DeidentifyTemplate。此 DeidentifyTemplate 可以包含 RecordTransformations。如果此模板不存在,Cloud DLP 将使用您创建的默认去标识化模板。如果也不存在,Cloud DLP 使用 ReplaceWithInfoTypeConfig 方法转换结构化文件。

  • 图片遮盖模板:用于图片的 DeidentifyTemplate。此模板必须包含 ImageTransformations 对象。如果此模板不存在,Cloud DLP 会使用黑框遮盖图片中的所有发现结果。

详细了解如何创建去标识化模板

创建具有去标识化操作的检查作业

DlpJob 对象提供了以下方面的说明:要检查的内容、要标记哪些类型的数据以及对发现结果的处理方式。如需对 Cloud Storage 目录中的敏感数据进行去标识化,DlpJob 必须至少定义以下内容:

  • StorageConfig 对象,用于指定要检查的 Cloud Storage 目录。
  • InspectConfig 对象,包含要查找的数据类型以及有关如何查找敏感数据的其他检查说明。
  • Deidentify 操作包含以下内容:

    • TransformationConfig 对象,它指定您创建的模板,用于对结构化和非结构化数据中的数据进行去标识化。您还可以添加用于遮盖图片中的敏感数据的配置。

      如果不包含 TransformationConfig 对象,Cloud DLP 会将文本中的敏感数据替换为其 infoType。在图片上,它以黑框遮盖敏感数据。

    • TransformationDetailsStorageConfig 对象,用于指定 BigQuery 表,Cloud DLP 必须在其中存储有关每个转换的详细信息。对于每个转换,详细信息包括说明、成功或错误代码、任何错误详细信息、转换的字节数、转换内容的位置,以及 Cloud DLP 进行转换的检查作业的名称。此表不会存储实际的去标识化内容。

    将数据写入 BigQuery 表时,系统会将结算和配额用量应用于包含此目标表的项目。

对复制的内容进行去标识化处理后,去标识化作业会完成。该作业包含指定转换已应用的次数摘要,您可以通过 DlpJob 上的 projects.dlpJobs.get 方法检索该转换。返回的 DlpJob 同时包含 DeidentifyDataSourceDetails 对象和 InspectDataSourceDetails 对象。这些对象分别包含 Deidentify 操作的结果和检查作业。

如果您在 DlpJob 中添加了 TransformationDetailsStorageConfig 对象,系统会创建一个 BigQuery 表,其中包含有关转换详情的元数据。对于发生的每个转换,Cloud DLP 都会将一行元数据写入表中。如需详细了解表的内容,请参阅转换详情参考文档

代码示例

以下 JSON 示例演示了如何对 Cloud Storage 目录中的文件进行去标识化。

HTTP 方法和网址

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

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"]
       }
     }
   }
 }

请替换以下内容:

  • PROJECT_ID:您要存储检查作业的项目的 ID
  • INPUT_DIRECTORY:您要检查的 Cloud Storage 目录,例如 gs://input-bucket/folder1/folder1a。如果网址以结尾斜杠结尾,则不会扫描 INPUT_DIRECTORY 中的任何子目录。
  • OUTPUT_DIRECTORY:您要存储去标识化文件的 Cloud Storage 目录。此目录不得与 INPUT_DIRECTORY 位于同一 Cloud Storage 存储桶中。
  • DEIDENTIFY_TEMPLATE_NAME:适用于非结构化和结构化文件的默认去标识化模板的完整资源名称(如果您已创建一个)。此值必须采用 projects/projectName/(locations/locationId)/deidentifyTemplates/templateName 格式。
  • STRUCTURED_DEIDENTIFY_TEMPLATE_NAME:结构化数据文件的去标识化模板的完整资源名称(如果您已创建)。此值必须采用 projects/projectName/(locations/locationId)/deidentifyTemplates/templateName 格式。
  • IMAGE_REDACTION_TEMPLATE_NAME:映像的图片遮盖模板的完整资源名称(如果您已创建)。此值必须采用 projects/projectName/(locations/locationId)/deidentifyTemplates/templateName 格式。
  • TRANSFORMATION_DETAILS_PROJECT_ID:您要存储转换详情的项目的 ID。
  • TRANSFORMATION_DETAILS_DATASET_ID:您要存储转换详细信息的 BigQuery 数据集的 ID。如果您未提供表 ID,系统会自动创建一个。
  • TRANSFORMATION_DETAILS_TABLE_ID:您要存储转换详细信息的 BigQuery 表的 ID。

在上一个 JSON 示例中,请注意以下几点:

  • inspectJob:作业的配置对象 (DlpJob)。此对象同时包含检查阶段和去标识化阶段的配置。
  • storageConfig:要检查的内容的位置 (StorageConfig)。此示例指定了 Cloud Storage 存储桶 CloudStorageOptions
  • inspectConfig:您要检查的敏感数据的相关信息 (InspectConfig)。此示例会检查与内置 infoType PERSON_NAME 匹配的内容。
  • actions:在作业检查完毕之后要执行的操作 (Action)。
  • deidentify:指定此操作可指示 Cloud DLP 根据内部指定的配置 (Deidentify) 对匹配的敏感数据进行去标识化。
  • cloud_storage_output:指定要检查的 Cloud Storage 目录的网址。
  • transformation_config:指定 Cloud DLP 必须如何对结构化文件、非结构化文件和图片 (TransformationConfig) 中的敏感数据进行去标识化。

    如果不包含 TransformationConfig 对象,Cloud DLP 会将文本中的敏感数据替换为其 infoType。在图片上,它以黑框遮盖敏感数据。

  • transformation_details_storage_config:指定 Cloud DLP 必须存储有关为此作业执行的每个转换的元数据。此外,它指定 Cloud DLP 必须存储该元数据的表的位置和名称 (TransformationDetailsStorageConfig)。

  • fileTypesToTransform:将去标识化操作限制为仅使用您列出的文件类型。如果您未设置此字段,则检查操作中包含的所有受支持的文件类型也会包含在去标识化操作中。在此示例中,Cloud DLP 只对图片、CSV 和文本文件进行去标识化,即使您将 DlpJob 配置为检查所有受支持的文件类型。

创建检查作业

如需创建检查作业 (DlpJob),请发送 projects.dlpJobs.create 请求。如需使用 c网址 发送请求,请将上一个示例保存为 JSON 文件,然后运行以下命令:

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

请替换以下内容:

  • PROJECT_ID:您存储 DlpJob 的项目的 ID。
  • PATH_TO_JSON_FILE:包含请求正文的 JSON 文件的路径。

Cloud DLP 会返回新创建的 DlpJob 的标识符、其状态以及您设置的检查配置的快照。

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

检索检查作业的结果

如需检索 DlpJob 的结果,请发送 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

请替换以下内容:

  • PROJECT_ID:您存储 DlpJob 的项目的 ID。
  • JOB_ID:创建 DlpJob 时返回的作业的 ID。

如果操作完成,您会收到类似于以下内容的响应:

{
  "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"
}

后续步骤