Desidentificar dados confidenciais armazenados no Cloud Storage usando a API

{}

Nesta página, descrevemos como desidentificar dados confidenciais armazenados no Cloud Storage usando a API Cloud Data Loss Prevention.

Essa operação ajuda a garantir que os arquivos que você usa nos processos empresariais não contenham dados confidenciais, como informações de identificação pessoal (PII). O Cloud Data Loss Prevention pode inspecionar dados confidenciais em arquivos em um bucket do Cloud Storage e criar cópias desidentificadas desses arquivos em um bucket separado. É possível usar as cópias desidentificadas nos processos da sua empresa.

Para mais informações sobre o que acontece quando você desidentifica dados no armazenamento, consulte Desidentificação de dados confidenciais no armazenamento.

Antes de começar

Esta página pressupõe o seguinte:

Saiba mais sobre as limitações e os pontos de consideração para essa operação.

A inspeção de armazenamento exige o seguinte escopo do OAuth: https://www.googleapis.com/auth/cloud-platform. Para saber mais, consulte Como autenticar na API DLP.

Papéis do IAM obrigatórios

Se todos os recursos para esta operação estiverem no mesmo projeto, o papel de agente de serviço da API DLP (roles/dlp.serviceAgent) no agente de serviço é suficiente. Com esse papel, é possível fazer o seguinte:

  • Criar o job de inspeção
  • ler os arquivos no diretório de entrada;
  • Gravar os arquivos desidentificados no diretório de saída
  • Gravar os detalhes da transformação em uma tabela do BigQuery

Os recursos relevantes incluem o job de inspeção, modelos de desidentificação, bucket de entrada, bucket de saída e tabela de detalhes de transformação.

Se você precisa ter os recursos em projetos separados, verifique se o agente de serviço do projeto também tem os seguintes papéis:

  • O papel de Leitor de objetos do Storage (roles/storage.objectViewer) no bucket de entrada ou no projeto que o contém.
  • O papel de Criador de objetos do Storage (roles/storage.objectCreator) no bucket de saída ou no projeto que o contém.
  • O papel de editor de dados do BigQuery (roles/bigquery.dataEditor) na tabela de detalhes de transformação ou o projeto que o contém.

Para conceder um papel ao agente de serviço, que é uma conta de serviço gerenciada pelo Google, consulte Conceder um único papel. Também é possível controlar o acesso nos seguintes níveis:

Visão geral da API

Para desidentificar conteúdo armazenado no Cloud Storage, configure um job de inspeção que procure dados confidenciais de acordo com os critérios que você especificar. Em seguida, no job de inspeção, forneça instruções de desidentificação na forma de uma ação Deidentify.

Se quiser verificar apenas um subconjunto dos arquivos no bucket, limite os arquivos que o job verifica. As opções aceitas para jobs com desidentificação são a filtragem de arquivos por tipo (FileType) e a expressão regular (FileSet).

Quando você ativa a ação Deidentify, por padrão, o Cloud DLP transforma todos os tipos de arquivos compatíveis incluídos na verificação. No entanto, é possível configurar o job para transformar somente um subconjunto dos tipos de arquivos compatíveis.

Opcional: criar modelos de desidentificação

Se você quiser controlar como as descobertas são transformadas, crie os modelos a seguir. Esses modelos oferecem instruções sobre como transformar as descobertas em arquivos estruturados, não estruturados e imagens.

  • Modelo de desidentificação: um DeidentifyTemplate padrão a ser usado para arquivos não estruturados, como arquivos de texto em formato livre. Esse tipo de DeidentifyTemplate não pode conter um objeto RecordTransformations, que é compatível somente com conteúdo estruturado. Se esse modelo não estiver presente, o Cloud DLP usará o método ReplaceWithInfoTypeConfig para transformar arquivos não estruturados.

  • Modelo de desidentificação estruturado:um DeidentifyTemplate que será usado para arquivos estruturados, como arquivos CSV. Esse DeidentifyTemplate pode conter RecordTransformations. Se esse modelo não estiver presente, o Cloud DLP usará o modelo de desidentificação padrão que você criou. Se isso também não estiver presente, o Cloud DLP usará o método ReplaceWithInfoTypeConfig para transformar arquivos estruturados.

  • Modelo de edição de imagem:um DeidentifyTemplate a ser usado para imagens. Esse modelo precisa conter um objeto ImageTransformations. Se esse modelo não estiver presente, o Cloud DLP editará todas as descobertas em imagens com uma caixa preta.

Saiba mais sobre como criar um modelo de desidentificação.

Criar um job de inspeção que tenha uma ação de desidentificação

O objeto DlpJob fornece instruções sobre o que inspecionar, que tipos de dados sinalizar como confidenciais e o que fazer com as descobertas. Para desidentificar dados confidenciais em um diretório do Cloud Storage, o DlpJob precisa definir pelo menos o seguinte:

  • Um objeto StorageConfig, que especifica o diretório do Cloud Storage a ser inspecionado.
  • Um objeto InspectConfig, que contém os tipos de dados a serem pesquisados e instruções de inspeção adicionais sobre como encontrar os dados confidenciais.
  • Uma ação Deidentify que contém o seguinte:

    • Um objeto TransformationConfig, que especifica todos os modelos que você criou para desidentificar dados em arquivos estruturados e não estruturados. Também é possível incluir configuração para editar dados confidenciais de imagens.

      Se você não incluir um objeto TransformationConfig, o Cloud DLP substitui os dados confidenciais no texto pelo respectivo infoType. Nas imagens, ele abrange dados confidenciais com uma caixa preta.

    • Um objeto TransformationDetailsStorageConfig, que especifica uma tabela do BigQuery em que o Cloud DLP precisa armazenar detalhes sobre cada transformação. Para cada transformação, os detalhes incluem uma descrição, um código de sucesso ou de erro, detalhes de erro, o número de bytes transformados, a localização do conteúdo transformado e o nome do job de inspeção em que o Cloud DLP fez a transformação. Essa tabela não armazena o conteúdo real desidentificado.

    Quando os dados são gravados em uma tabela do BigQuery, o uso de faturamento e cotas é aplicado ao projeto que contém a tabela de destino.

Depois que o conteúdo copiado é desidentificado, o job de desidentificação é concluído. O job contém um resumo de quantas vezes as transformações especificadas foram aplicadas, e é possível recuperá-las usando o método projects.dlpJobs.get na DlpJob. O DlpJob retornado inclui um objeto DeidentifyDataSourceDetails e um objeto InspectDataSourceDetails. Esses objetos contêm os resultados de uma ação Deidentify e do job de inspeção, respectivamente.

Se você incluiu um objeto TransformationDetailsStorageConfig no DlpJob, uma tabela do BigQuery será criada com metadados sobre os detalhes da transformação. Para cada transformação que ocorrer, o Cloud DLP grava uma linha de metadados na tabela. Para mais informações sobre o conteúdo da tabela, consulte Referência de detalhes da transformação.

Exemplo de código

Veja no exemplo JSON a seguir como desidentificar arquivos em um diretório do Cloud Storage.

Método e URL HTTP

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

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

Substitua:

  • PROJECT_ID: o ID do projeto em que você quer armazenar o job de inspeção.
  • INPUT_DIRECTORY: o diretório do Cloud Storage que você quer inspecionar, por exemplo, gs://input-bucket/folder1/folder1a. Se o URL terminar com uma barra no final, os subdiretórios em INPUT_DIRECTORY não serão verificados.
  • OUTPUT_DIRECTORY: o diretório do Cloud Storage em que você quer armazenar os arquivos desidentificados. Esse diretório não pode estar no mesmo bucket do Cloud Storage que INPUT_DIRECTORY.
  • DEIDENTIFY_TEMPLATE_NAME: o nome completo do recurso do modelo de desidentificação padrão (para arquivos não estruturados e estruturados) se você criou um. Esse valor precisa estar no formato projects/projectName/(locations/locationId)/deidentifyTemplates/templateName.
  • STRUCTURED_DEIDENTIFY_TEMPLATE_NAME: o nome completo do recurso do modelo de desidentificação de arquivos estruturados, se você tiver criado um. Esse valor precisa estar no formato projects/projectName/(locations/locationId)/deidentifyTemplates/templateName.
  • IMAGE_REDACTION_TEMPLATE_NAME: o nome completo do recurso do modelo de edição de imagens, se você tiver criado um. Esse valor precisa estar no formato projects/projectName/(locations/locationId)/deidentifyTemplates/templateName.
  • TRANSFORMATION_DETAILS_PROJECT_ID: o ID do projeto em que você quer armazenar os detalhes da transformação.
  • TRANSFORMATION_DETAILS_DATASET_ID: o ID do conjunto de dados do BigQuery em que você quer armazenar os detalhes de transformação. Se você não fornecer um ID de tabela, o sistema criará um automaticamente.
  • TRANSFORMATION_DETAILS_TABLE_ID: o ID da tabela do BigQuery em que você quer armazenar os detalhes de transformação.

No exemplo JSON anterior, observe o seguinte:

  • inspectJob: o objeto de configuração do job (DlpJob). Esse objeto contém a configuração dos estágios de inspeção e de desidentificação.
  • storageConfig: o local do conteúdo a ser inspecionado (StorageConfig). Este exemplo especifica um bucket do Cloud Storage CloudStorageOptions.
  • inspectConfig: informações sobre os dados confidenciais que você quer inspecionar (InspectConfig). Este exemplo inspeciona o conteúdo correspondente ao infoType integrado PERSON_NAME.
  • actions: as ações a serem realizadas após a conclusão da parte de inspeção do job (Action).
  • deidentify: especificar essa ação instrui o Cloud DLP a desidentificar os dados confidenciais correspondentes de acordo com a configuração especificada dentro (Deidentify).
  • cloud_storage_output: especifica o URL do diretório do Cloud Storage que você quer inspecionar.
  • transformation_config: especifica como o Cloud DLP precisa desidentificar dados confidenciais em arquivos estruturados, arquivos não estruturados e imagens (TransformationConfig).

    Se você não incluir um objeto TransformationConfig, o Cloud DLP substitui os dados confidenciais no texto pelo respectivo infoType. Nas imagens, ele abrange dados confidenciais com uma caixa preta.

  • transformation_details_storage_config: especifica que o Cloud DLP precisa armazenar metadados sobre cada transformação executada para esse job. Além disso, ele especifica o local e o nome da tabela em que o Cloud DLP precisa armazenar esses metadados (TransformationDetailsStorageConfig).

  • fileTypesToTransform: limita a operação de desidentificação apenas aos tipos de arquivo que você lista. Se você não definir esse campo, todos os tipos de arquivos compatíveis incluídos na operação de inspeção também serão incluídos na operação de desidentificação. Neste exemplo, o Cloud DLP desidentifica apenas arquivos de imagem, CSV e texto, mesmo que você tenha configurado DlpJob para inspecionar todos os tipos de arquivo compatíveis.

Criar o job de inspeção

Para criar o job de inspeção (DlpJob), envie uma solicitação projects.dlpJobs.create. Para enviar a solicitação usando cURL, salve o exemplo anterior como um arquivo JSON e execute o comando a seguir:

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

Substitua:

  • PROJECT_ID: o ID do projeto em que você armazenou o DlpJob.
  • PATH_TO_JSON_FILE: o caminho para o arquivo JSON que contém o corpo da solicitação.

O Cloud DLP retorna o identificador da DlpJob recém-criada, o status dela e um snapshot da configuração de inspeção definida.

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

Recuperar os resultados do job de inspeção

Para recuperar os resultados de DlpJob, envie uma solicitação 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

Substitua:

  • PROJECT_ID: o ID do projeto em que você armazenou o DlpJob.
  • JOB_ID: o ID do job que foi retornado quando você criou o DlpJob.

Se a operação for concluída, você receberá uma resposta semelhante a esta:

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

A seguir