Desidentifica datos sensibles almacenados en Cloud Storage con la API

{}

En esta página, se describe cómo desidentificar datos sensibles almacenados en Cloud Storage mediante la API de Cloud Data Loss Prevention.

Esta operación ayuda a garantizar que los archivos que usas en los procesos de tu empresa no contengan datos sensibles, como la información de identificación personal (PII). Cloud Data Loss Prevention puede inspeccionar archivos en un bucket de Cloud Storage en busca de datos sensibles y crear copias desidentificadas de esos archivos en un bucket diferente. Luego, puedes usar las copias desidentificadas en los procesos de tu empresa.

Para obtener más información sobre lo que sucede cuando desidentificas datos en el almacenamiento, consulta Desidentificación de datos sensibles en el almacenamiento.

Antes de comenzar

En esta página, se supone lo siguiente:

Obtén más información sobre las limitaciones y puntos de consideración para esta operación.

La inspección de almacenamiento requiere el siguiente alcance de OAuth: https://www.googleapis.com/auth/cloud-platform. Para obtener más información, consulta Autentica la API de DLP.

Funciones de IAM obligatorias

Si todos los recursos para esta operación están en el mismo proyecto, la función de agente de servicio de la API de DLP (roles/dlp.serviceAgent) en el agente de servicio es suficiente. Con esa función, puedes hacer lo siguiente:

  • Crea el trabajo de inspección
  • Leer los archivos en el directorio de entrada
  • Escribe los archivos desidentificados en el directorio de salida
  • Escribir los detalles de la transformación en una tabla de BigQuery

Los recursos relevantes incluyen el trabajo de inspección, las plantillas de desidentificación, el bucket de entrada, el bucket de salida y la tabla de detalles de transformación.

Si debes tener los recursos en proyectos diferentes, asegúrate de que el agente de servicio del proyecto también tenga las siguientes funciones:

  • La función de visualizador de objetos de almacenamiento (roles/storage.objectViewer) en el bucket de entrada o en el proyecto que la contiene
  • La función de creador de objetos de almacenamiento (roles/storage.objectCreator) en el bucket de salida o el proyecto que la contiene
  • La función de editor de datos de BigQuery (roles/bigquery.dataEditor) en la tabla de detalles de transformación o el proyecto que la contiene

Para otorgar una función a tu agente de servicio, que es una cuenta de servicio administrada por Google, consulta Otorga una función única. También puedes controlar el acceso en los siguientes niveles:

Descripción general de la API

Para desidentificar el contenido almacenado en Cloud Storage, configura un trabajo de inspección que busque datos sensibles según los criterios que especifiques. Luego, dentro del trabajo de inspección, debes proporcionar instrucciones de desidentificación en forma de una acción Deidentify.

Si deseas analizar solo un subconjunto de los archivos en tu bucket, puedes limitar los archivos que analiza el trabajo. Las opciones admitidas para los trabajos con desidentificación son el filtrado de archivos por tipo (FileType) y expresión regular (FileSet).

Cuando habilitas la acción Deidentify, de forma predeterminada, Cloud DLP transforma todos los tipos de archivos compatibles incluidos en el análisis. Sin embargo, puedes configurar el trabajo para transformar solo un subconjunto de los tipos de archivos compatibles.

Crea plantillas de desidentificación (opcional)

Si deseas controlar cómo se transforman los resultados, crea las siguientes plantillas. Estas plantillas proporcionan instrucciones sobre cómo transformar resultados en imágenes, archivos y archivos estructurados.

  • Plantilla de desidentificación: Es una DeidentifyTemplate predeterminada que se usa para archivos no estructurados, como archivos de texto de formato libre. Este tipo de DeidentifyTemplate no puede contener un objeto RecordTransformations, que solo es compatible con contenido estructurado. Si esta plantilla no está presente, Cloud DLP usa el método ReplaceWithInfoTypeConfig para transformar archivos no estructurados.

  • Plantilla de desidentificación estructurada: Es un DeidentifyTemplate que se usa para archivos estructurados, como los archivos CSV. Este DeidentifyTemplate puede contener RecordTransformations. Si esta plantilla no está presente, Cloud DLP usa la plantilla de desidentificación predeterminada que creaste. Si eso no está presente, Cloud DLP usa el método ReplaceWithInfoTypeConfig para transformar archivos estructurados.

  • Plantilla de ocultamiento de imágenes: Es un DeidentifyTemplate que se usará para las imágenes. Esta plantilla debe contener un objeto ImageTransformations. Si esta plantilla no está presente, Cloud DLP oculta todos los resultados en imágenes con un cuadro negro.

Obtén más información sobre cómo crear una plantilla de desidentificación.

Crea un trabajo de inspección que tenga una acción de desidentificación

El objeto DlpJob proporciona instrucciones sobre qué inspeccionar, qué tipos de datos marcar como sensibles y qué hacer con los resultados. Para desidentificar datos sensibles en un directorio de Cloud Storage, tu DlpJob debe definir al menos lo siguiente:

  • Un objeto StorageConfig, que especifica el directorio de Cloud Storage que se inspeccionará.
  • Un objeto InspectConfig, que contiene los tipos de datos que se deben buscar y las instrucciones de inspección adicionales para encontrar los datos sensibles
  • Una acción Deidentify que contiene lo siguiente:

    • Un objeto TransformationConfig, que especifica las plantillas que creaste para desidentificar datos en archivos estructurados y no estructurados. También puedes incluir la configuración para ocultar datos sensibles de las imágenes.

      Si no incluyes un objeto TransformationConfig, Cloud DLP reemplaza los datos sensibles en texto por su Infotipo. En las imágenes, cubre los datos sensibles con un cuadro negro.

    • Un objeto TransformationDetailsStorageConfig, que especifica una tabla de BigQuery en la que Cloud DLP debe almacenar los detalles de cada transformación. Para cada transformación, los detalles incluyen una descripción, un código de éxito o de error, cualquier detalle de error, la cantidad de bytes transformados, la ubicación del contenido transformado y el nombre del trabajo de inspección en el que Cloud DLP realizó la transformación. Esta tabla no almacena el contenido real desidentificado.

    Cuando se escriben los datos en una tabla de BigQuery, el uso de la facturación y la cuota se aplica al proyecto que contiene la tabla de destino.

Una vez desidentificado el contenido copiado, finaliza el trabajo de desidentificación. El trabajo contiene un resumen de la cantidad de veces que se aplicaron las transformaciones especificadas, que puedes recuperar mediante el método projects.dlpJobs.get en DlpJob. El DlpJob que se muestra incluye un objeto DeidentifyDataSourceDetails y un objeto InspectDataSourceDetails. Esos objetos contienen los resultados de una acción Deidentify y el trabajo de inspección, respectivamente.

Si incluiste un objeto TransformationDetailsStorageConfig en tu DlpJob, se crea una tabla de BigQuery que contiene metadatos sobre los detalles de transformación. Para cada transformación que se produce, Cloud DLP escribe una fila de metadatos en la tabla. Para obtener más información sobre el contenido de la tabla, consulta la referencia de los detalles de transformación.

Ejemplo de código

En el siguiente ejemplo de JSON, se muestra cómo desidentificar archivos en un directorio de Cloud Storage.

Método HTTP y URL

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

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

Reemplaza lo siguiente:

  • PROJECT_ID: Es el ID del proyecto en el que deseas almacenar el trabajo de inspección.
  • INPUT_DIRECTORY: Es el directorio de Cloud Storage que deseas inspeccionar, por ejemplo, gs://input-bucket/folder1/folder1a. Si la URL termina en una barra diagonal, no se analizan los subdirectorios dentro de INPUT_DIRECTORY.
  • OUTPUT_DIRECTORY: Es el directorio de Cloud Storage en el que deseas almacenar los archivos desidentificados. Este directorio no debe estar en el mismo bucket de Cloud Storage que INPUT_DIRECTORY.
  • DEIDENTIFY_TEMPLATE_NAME: Es el nombre completo del recurso de la plantilla de desidentificación predeterminada, para archivos no estructurados y estructurados, si creaste una. Este valor debe tener el formato projects/projectName/(locations/locationId)/deidentifyTemplates/templateName.
  • STRUCTURED_DEIDENTIFY_TEMPLATE_NAME: Es el nombre completo del recurso de la plantilla de desidentificación para archivos estructurados si creaste uno. Este valor debe tener el formato projects/projectName/(locations/locationId)/deidentifyTemplates/templateName.
  • IMAGE_REDACTION_TEMPLATE_NAME: Es el nombre completo del recurso de la plantilla de ocultamiento de imágenes si creaste una. Este valor debe tener el formato projects/projectName/(locations/locationId)/deidentifyTemplates/templateName.
  • TRANSFORMATION_DETAILS_PROJECT_ID: Es el ID del proyecto en el que deseas almacenar los detalles de la transformación.
  • TRANSFORMATION_DETAILS_DATASET_ID: Es el ID del conjunto de datos de BigQuery en el que deseas almacenar los detalles de transformación. Si no proporcionas un ID de tabla, el sistema crea uno automáticamente.
  • TRANSFORMATION_DETAILS_TABLE_ID: Es el ID de la tabla de BigQuery en la que deseas almacenar los detalles de transformación.

En el ejemplo de JSON anterior, ten en cuenta lo siguiente:

  • inspectJob: Es el objeto de configuración del trabajo (DlpJob). Este objeto contiene la configuración de las etapas de inspección y desidentificación.
  • storageConfig: Es la ubicación del contenido que se inspeccionará (StorageConfig). En este ejemplo, se especifica un depósito de Cloud Storage CloudStorageOptions.
  • inspectConfig: La información sobre los datos sensibles que quieres inspeccionar (InspectConfig). En este ejemplo, se inspecciona el contenido que coincide con el Infotipo integrado PERSON_NAME.
  • actions: Son las acciones que se deben realizar después de que se completa la parte del trabajo de inspección (Action).
  • deidentify: Especificar esta acción le indica a Cloud DLP que desidentifique los datos sensibles coincidentes de acuerdo con la configuración especificada en el interior (Deidentify).
  • cloud_storage_output: Especifica la URL del directorio de Cloud Storage que deseas inspeccionar.
  • transformation_config: Especifica cómo Cloud DLP debe desidentificar datos sensibles en imágenes y archivos estructurados (TransformationConfig).

    Si no incluyes un objeto TransformationConfig, Cloud DLP reemplaza los datos sensibles en texto por su Infotipo. En las imágenes, cubre los datos sensibles con un cuadro negro.

  • transformation_details_storage_config: Especifica que Cloud DLP debe almacenar metadatos sobre cada transformación que realiza para este trabajo. Además, especifica la ubicación y el nombre de la tabla en la que Cloud DLP debe almacenar esos metadatos (TransformationDetailsStorageConfig).

  • fileTypesToTransform: Limita la operación de desidentificación solo a los tipos de archivo que enumeras. Si no configuras este campo, todos los tipos de archivos admitidos incluidos en la operación de inspección también se incluirán en la operación de desidentificación. En este ejemplo, Cloud DLP desidentifica solo archivos de imagen, CSV y texto, incluso si configuraste DlpJob para inspeccionar todos los tipos de archivos compatibles.

Crea el trabajo de inspección

Para crear el trabajo de inspección (DlpJob), envía una solicitud projects.dlpJobs.create. Para enviar la solicitud con cURL, guarda el ejemplo anterior como un archivo JSON y ejecuta el siguiente comando:

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

Reemplaza lo siguiente:

  • PROJECT_ID: Es el ID del proyecto en el que almacenaste el DlpJob.
  • PATH_TO_JSON_FILE: Es la ruta al archivo JSON que contiene el cuerpo de la solicitud.

Cloud DLP muestra el identificador del DlpJob recién creado, su estado y una instantánea de la configuración de inspección que estableciste.

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

Recupera los resultados del trabajo de inspección

Para recuperar los resultados de DlpJob, envía una solicitud 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

Reemplaza lo siguiente:

  • PROJECT_ID: Es el ID del proyecto en el que almacenaste el DlpJob.
  • JOB_ID: Es el ID del trabajo que se mostró cuando creaste el DlpJob.

Si la operación se completa, obtendrás una respuesta similar a la siguiente:

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

¿Qué sigue?