Crea plantillas de transformación de desidentificación de Cloud DLP para conjuntos de datos de PII

En este instructivo, se muestra cómo crear y administrar transformaciones de desidentificación para conjuntos de datos de información de identificación personal (PII) a gran escala mediante plantillas de Cloud Data Loss Prevention (Cloud DLP). En este instructivo, también se ofrece orientación sobre cómo seleccionar las transformaciones adecuadas para tu caso práctico.

Este documento forma parte de una serie:

En este instructivo, se supone que tienes conocimientos básicos sobre secuencias de comandos de shell, y el contenido está dirigido a administradores de seguridad empresarial.

Arquitectura de referencia

En este instructivo, se muestra la sección de administración de la configuración (plantilla y clave de DLP) que se ilustra en el siguiente diagrama.

Arquitectura de la configuración de desidentificación

Esta arquitectura consiste en una configuración de desidentificación administrada a la que solo puede acceder un pequeño grupo de personas (por ejemplo, administradores de seguridad) para evitar exponer los métodos de desidentificación y las claves de encriptación.

Objetivos

  • Diseñar una transformación de Cloud DLP para un conjunto de datos de muestra
  • Crear plantillas de Cloud DLP para almacenar la configuración de la transformación

Costos

En este instructivo, se usan los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud sean aptos para obtener una prueba gratuita.

Cuando finalices este instructivo, podrás borrar los recursos creados para evitar que se te siga facturando. Para obtener más información, consulta cómo hacer una limpieza.

Antes de comenzar

  1. Accede a tu cuenta de Google Cloud. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. En la página del selector de proyectos de Google Cloud Console, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyecto

  3. Comprueba que la facturación esté habilitada en tu proyecto.

    Descubre cómo puedes habilitar la facturación

  4. En Cloud Console, activa Cloud Shell.

    Activar Cloud Shell

    En la parte inferior de Cloud Console, se inicia una sesión de Cloud Shell en la que se muestra una ventana de línea de comandos. Cloud Shell es un entorno de shell que tiene el SDK de Cloud preinstalado, incluida la herramienta de línea de comandos de gcloud, y valores ya establecidos para el proyecto actual. La inicialización de la sesión puede tomar unos minutos.

  5. Ejecuta todos los comandos de este instructivo desde Cloud Shell.
  6. En Cloud Shell, habilita las API de Cloud DLP, Cloud Key Management Service, BigQuery, Cloud Storage, Dataflow y Cloud Build.
    gcloud services enable dlp.googleapis.com
    gcloud services enable cloudkms.googleapis.com
    gcloud services enable bigquery.googleapis.com
    gcloud services enable storage-component.googleapis.com
    gcloud services enable dataflow.googleapis.com
    gcloud services enable cloudbuild.googleapis.com
    

Crea depósitos de Cloud Storage

En esta serie, necesitas dos depósitos de Cloud Storage. En el primer depósito, se almacena el conjunto de datos de muestra y, en el segundo, se almacenan los datos temporales para la canalización automatizada que se usa en la siguiente parte (Ejecuta una canalización automatizada de Dataflow para desidentificar un conjunto de datos de PII).

  1. En Cloud Shell, crea dos depósitos de Cloud Storage (reemplaza REGION por la región de Dataflow que elijas, por ejemplo, us-central1):

    export REGION=REGION
    export PROJECT_ID=$(gcloud config get-value project)
    export DATA_STORAGE_BUCKET=${PROJECT_ID}-data-storage-bucket
    export DATAFLOW_TEMP_BUCKET=${PROJECT_ID}-dataflow-temp-bucket
    gsutil mb -c standard -l ${REGION} gs://${DATA_STORAGE_BUCKET}
    gsutil mb -c standard -l ${REGION} gs://${DATAFLOW_TEMP_BUCKET}
    

Descarga los archivos de muestra

Descarga los archivos de muestra a fin de identificar las columnas que se requieren para las transformaciones de desidentificación.

  1. En Cloud Shell, descarga el conjunto de datos de muestra y las secuencias de comandos usadas en este instructivo a tu máquina local:

    curl -X GET \
        -o "sample_data_scripts.tar.gz" \
        "http://storage.googleapis.com/dataflow-dlp-solution-sample-data/sample_data_scripts.tar.gz"
    
  2. Descomprime el contenido del archivo:

    tar -zxvf sample_data_scripts.tar.gz
    
  3. Para validar la transferencia, confirma que el resultado coincida con la lista de los siguientes archivos descargados:

    wc -l solution-test/CCRecords_1564602825.csv
    

    Este es el resultado:

    100001 solution-test/CCRecords_1564602825.csv
    
  4. Para identificar qué columnas pueden requerir la desidentificación de DLP, examina el registro de encabezado en el archivo CSV:

    head -1 solution-test/CCRecords_1564602825.csv
    

    Este es el resultado:

    ID,Card Type Code,Card Type Full Name,Issuing Bank,Card Number,Card Holder's Name,Issue Date,Expiry Date,Billing Date,Card PIN,Credit Limit,Age,SSN,JobTitle,Additional Details
    

    La primera línea de cada archivo CSV define el esquema de datos y los nombres de las columnas. El conjunto de datos extraído contiene identificadores directos (SSN y Card Holder's Name) y cuasi-identificadores (Age y JobTitle).

El proceso para determinar las transformaciones requeridas varía según tu caso de uso. Para el conjunto de datos de muestra que se usa en este instructivo, la lista de transformaciones se resume en la siguiente tabla.

Nombre de la columna InfoType (personalizado o integrado) Tipo de transformación de Cloud DLP Descripción de la transformación
Card PIN N/A Encriptación mediante hashing criptográfico La encriptación con hashing criptográfico reemplaza los datos originales por un valor codificado en base64 que no se puede revertir.
Card Number N/A Encriptación mediante encriptación determinista (DE) La DE reemplaza los datos originales por un valor encriptado codificado en base64 y no conserva el grupo de caracteres original ni la longitud.
Card Holder's Name N/A Encriptación mediante encriptación determinista (DE) La DE reemplaza los datos originales por un valor encriptado codificado en base64 y no conserva el grupo de caracteres original ni la longitud.
SSN (Social Security Number) N/A Carácter de enmascaramiento El enmascaramiento es una técnica no criptográfica que puedes usar para enmascarar datos originales parciales o completos con un carácter especificado.
Age N/A Agrupamiento con un valor general La transformación de agrupación ayuda a reemplazar un valor identificable por un valor general.
Job Title N/A Agrupamiento con un valor general La transformación de agrupación ayuda a reemplazar un valor identificable por un valor general.
Additional Details Integrado: IBAN_CODE, EMAIL_ADDRESS, PHONE_NUMBER
Personalizado: ONLINE_USER_ID
Reemplazo por un token La transformación de reemplazo reemplaza los datos originales con un valor arbitrario.

Crea un conjunto de datos de BigQuery

  1. Crea un conjunto de datos en BigQuery en el que la canalización de Cloud DLP puede almacenar los datos desidentificados (reemplaza LOCATION por la ubicación de BigQuery que prefieras, por ejemplo US ):

    bq mk --location=LOCATION \
        --description="De-Identified PII Dataset" \
        deid_dataset
    

En los pasos de este instructivo, se supone que los datos sensibles se almacenan en Cloud Storage en formato delimitado por columnas, en general, CSV. La canalización usada en este instructivo crea de forma automática una tabla de BigQuery en función del contenido del registro del encabezado CSV que se encuentra en los archivos de datos. Si se quita este registro del encabezado de los archivos CSV, corres el riesgo de exponer los datos de PII en BigQuery.

Crea una clave de encriptación de claves (KEK)

Una clave de encriptación de token (TEK) está protegida (unida) con otra clave (clave de encriptación de claves) de Cloud Key Management Service (Cloud KMS):

  1. En Cloud Shell, crea una TEK de forma local. Para este instructivo, debes generar una clave de encriptación aleatoria de 32 caracteres de base64:

    export TEK=$(openssl rand -base64 32); echo ${TEK}
    

    El resultado es una clave aleatoria generada en el siguiente formato:

    MpyFxEQKYKscEJVOiKMuEPdwqdffk4vTF+qwGwrp7Ps=
    

    El tamaño de clave efectivo en base-2 es (64)^32 =(2^6)^32=2^192, o un vector de inicialización de AES (IV) de 192 bits. Esta clave se usa más adelante en una secuencia de comandos.

  2. Exporta la clave, el llavero de claves y el archivo KEK como variables:

    export KEY_RING_NAME=my-kms-key-ring
    export KEY_NAME=my-kms-key
    export KEK_FILE_NAME=kek.json
    
  3. Habilita las funciones de encriptador de claves y de administrador de Cloud KMS para la cuenta de servicio de Cloud Build:

    export PROJECT_NUMBER=$(gcloud projects list \
        --filter=${PROJECT_ID} --format="value(PROJECT_NUMBER)")
    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
        --role roles/cloudkms.cryptoKeyEncrypter
    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
        --role roles/cloudkms.admin
    
  4. Clona el siguiente repositorio de GitHub y ve a la carpeta raíz del proyecto:

    git clone https://github.com/GoogleCloudPlatform/dlp-dataflow-deidentification.git
    cd dlp-dataflow-deidentification
    
  5. Crea una KEK:

    gcloud builds submit . \
        --config dlp-demo-part-1-crypto-key.yaml \
        --substitutions \
        _GCS_BUCKET_NAME=gs://${DATA_STORAGE_BUCKET},_KEY_RING_NAME=${KEY_RING_NAME},_KEY_NAME=${KEY_NAME},_TEK=${TEK},_KEK=${KEK_FILE_NAME},_API_KEY=$(gcloud auth print-access-token)
    
  6. Valida que la KEK se haya creado correctamente:

    gsutil cat gs://${DATA_STORAGE_BUCKET}/${KEK_FILE_NAME}
    

    El resultado presenta este aspecto:

    {
      "name": "kms-key-resource-path",
      "ciphertext": "kms-wrapped-key",
      "ciphertextCrc32c": "checksum"
    }
    

    Notas sobre el resultado:

    • kms-key-resource-path: La ruta del recurso de la KEK en el formato: projects/${PROJECT_ID}/locations/global/keyRings/${KEY_RING_NAME}/cryptoKeys/${KEY_NAME}/cryptoKeyVersions/1

    • kms-wrapped-key: Valor con codificación base64 del TEK unido a Cloud KMS.

    • checksum: La suma de verificación CRC32C del texto cifrado.

Crea plantillas de Cloud DLP

En este punto, investigaste el conjunto de datos de muestra y determinaste cuáles son las transformaciones de Cloud DLP necesarias. También creaste una clave de encriptación de claves (KEK) para las columnas que requieren transformaciones criptográficas. El siguiente paso es ejecutar una secuencia de comandos de Cloud Build para crear plantillas de Cloud DLP basadas en la transformación necesaria y la KEK.

Crea una cuenta de servicio para Cloud DLP

  1. En Cloud Shell, crea una cuenta de servicio:

    export SERVICE_ACCOUNT_NAME=my-service-account
    gcloud iam service-accounts create ${SERVICE_ACCOUNT_NAME} \
        --display-name "DLP Demo Service Account"
    
  2. Crea un archivo de claves de API JSON llamado service-account-key.json para la cuenta de servicio:

    gcloud iam service-accounts keys create \
        --iam-account ${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com \
        service-account-key.json
    
  3. Asigna las funciones project editor y storage admin a la cuenta de servicio:

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member serviceAccount:${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com \
        --role roles/editor
    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member serviceAccount:${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com \
        --role roles/storage.admin
    
  4. Activa la cuenta de servicio:

    gcloud auth activate-service-account --key-file service-account-key.json
    

Crea las plantillas

  1. En Cloud Shell, ejecuta la secuencia de comandos de Cloud Build para crear las plantillas:

    gcloud builds submit . \
        --config dlp-demo-part-2-dlp-template.yaml \
        --substitutions \
        _KEK_CONFIG_FILE=gs://${DATA_STORAGE_BUCKET}/${KEK_FILE_NAME},_GCS_BUCKET_NAME=gs://${DATA_STORAGE_BUCKET},_API_KEY=$(gcloud auth print-access-token)
    
  2. Verifica que la plantilla de desidentificación se haya creado de forma correcta:

    gsutil cp gs://${DATA_STORAGE_BUCKET}/deid-template.json .
    cat deid-template.json
    

    El resultado luce de la siguiente manera:

    {
      "name": "projects/<project_id>/deidentifyTemplates/<template_id>",
      "displayName": "Config to DeIdentify Sample Dataset",
      "description": "De-identifies Card Number, Card PIN, Card Holder's Name, SSN, Age, Job Title, Additional Details and Online UserId Fields",
      "createTime": "2019-12-01T19:21:07.306279Z",
      "updateTime": "2019-12-01T19:21:07.306279Z",
      "deidentifyConfig": {
        "recordTransformations": {
          "fieldTransformations": [
            {
              "fields": [
                {
                  "name": "Card PIN"
                }
              ],
              "primitiveTransformation": {
                "cryptoHashConfig": {
                  "cryptoKey": {
                    "kmsWrapped": {
                      "wrappedKey": "<var>kms-wrapped-key</var>",
                      "cryptoKeyName": "<var>kms-key-resource-name</var>"
                    }
                  }
                }
              }
            },
            {
              "fields": [
                {
                  "name": "SSN"
                }
              ],
              "primitiveTransformation": {
                "characterMaskConfig": {
                  "maskingCharacter": "*",
                  "numberToMask": 5,
                  "charactersToIgnore": [
                    {
                      "charactersToSkip": "-"
                    }
                  ]
                }
              }
            },
            {
              "fields": [
                {
                  "name": "Age"
                }
              ],
              "primitiveTransformation": {
                "bucketingConfig": {
                  "buckets": [
                    {
                      "min": {
                        "integerValue": "18"
                      },
                      "max": {
                        "integerValue": "30"
                      },
                      "replacementValue": {
                        "stringValue": "20"
                      }
                    },
                    {
                      "min": {
                        "integerValue": "30"
                      },
                      "max": {
                        "integerValue": "40"
                      },
                      "replacementValue": {
                        "stringValue": "30"
                      }
                    },
                    {
                      "min": {
                        "integerValue": "40"
                      },
                      "max": {
                        "integerValue": "50"
                      },
                      "replacementValue": {
                        "stringValue": "40"
                      }
                    },
                    {
                      "min": {
                        "integerValue": "50"
                      },
                      "max": {
                        "integerValue": "60"
                      },
                      "replacementValue": {
                        "stringValue": "50"
                      }
                    },
                    {
                      "min": {
                        "integerValue": "60"
                      },
                      "max": {
                        "integerValue": "99"
                      },
                      "replacementValue": {
                        "stringValue": "60"
                      }
                    }
                  ]
                }
              }
            },
            {
              "fields": [
                {
                  "name": "JobTitle"
                }
              ],
              "primitiveTransformation": {
                "bucketingConfig": {
                  "buckets": [
                    {
                      "min": {
                        "stringValue": "CIO"
                      },
                      "max": {
                        "stringValue": "CIOz"
                      },
                      "replacementValue": {
                        "stringValue": "Executive"
                      }
                    },
                    {
                      "min": {
                        "stringValue": "CEO"
                      },
                      "max": {
                        "stringValue": "CEOz"
                      },
                      "replacementValue": {
                        "stringValue": "Executive"
                      }
                    },
                    {
                      "min": {
                        "stringValue": "Vice President"
                      },
                      "max": {
                        "stringValue": "Vice Presidentz"
                      },
                      "replacementValue": {
                        "stringValue": "Executive"
                      }
                    },
                    {
                      "min": {
                        "stringValue": "Software Engineer"
                      },
                      "max": {
                        "stringValue": "Software Engineerz"
                      },
                      "replacementValue": {
                        "stringValue": "Engineer"
                      }
                    },
                    {
                      "min": {
                        "stringValue": "Product Manager"
                      },
                      "max": {
                        "stringValue": "Product Managerz"
                      },
                      "replacementValue": {
                        "stringValue": "Manager"
                      }
                    }
                  ]
                }
              }
            },
            {
              "fields": [
                {
                  "name": "Additional Details"
                }
              ],
              "infoTypeTransformations": {
                "transformations": [
                  {
                    "infoTypes": [
                      {
                        "name": "EMAIL_ADDRESS"
                      },
                      {
                        "name": "PHONE_NUMBER"
                      },
                      {
                        "name": "IBAN_CODE"
                      },
                      {
                        "name": "ONLINE_USER_ID"
                      }
                    ],
                    "primitiveTransformation": {
                      "replaceWithInfoTypeConfig": {}
                    }
                  }
                ]
              }
            },
            {
              "fields": [
                {
                  "name": "Card Holder's Name"
                },
                {
                  "name": "Card Number"
                }
              ],
              "primitiveTransformation": {
                "cryptoDeterministicConfig": {
                  "cryptoKey": {
                    "kmsWrapped": {
                      "wrappedKey": "<var>kms-wrapped-key</var>",
                      "cryptoKeyName": "<var>kms-key-resource-name</var>"
                    }
                  }
                }
              }
            }
          ]
        }
      }
    }
  3. Verifica que la plantilla de inspección se haya creado de forma correcta:

    gsutil cp gs://${DATA_STORAGE_BUCKET}/inspect-template.json .
    cat inspect-template.json
    

    El resultado luce de la siguiente manera:

    {
      "name": "projects/<project_id>/inspectTemplates/<template_id>",
      "displayName": "Config to Inspect Additional Details Column",
      "description": "Inspect template for built in info types EMAIL_ADDRESS, PHONE_NUMBER, IBAN_CODE and custom Info type ONLINE_USER_ID",
      "createTime": "2019-12-01T19:21:08.063415Z",
      "updateTime": "2019-12-01T19:21:08.063415Z",
      "inspectConfig": {
        "infoTypes": [
          {
            "name": "IBAN_CODE"
          },
          {
            "name": "EMAIL_ADDRESS"
          },
          {
            "name": "PHONE_NUMBER"
          }
        ],
        "minLikelihood": "LIKELY",
        "limits": {},
        "customInfoTypes": [
          {
            "infoType": {
              "name": "ONLINE_USER_ID"
            },
            "regex": {
              "pattern": "\\b:\\d{16}"
            }
          }
        ]
      }
    }
  4. Verifica que la plantilla de reidentificación se haya creado de forma correcta:

    gsutil cp gs://${DATA_STORAGE_BUCKET}/reid-template.json .
    cat reid-template.json
    

    El resultado luce de la siguiente manera:

    {
      "name": "projects/<project_id>/deidentifyTemplates/<template_id>",
      "displayName": "Config to ReIdentify Sample Dataset",
      "description": "Used to re-identify Card Number and Card Holder's Name",
      "createTime": "2019-12-01T19:21:07.306279Z",
      "updateTime": "2019-12-01T19:21:07.306279Z",
      "deidentifyConfig": {
        "recordTransformations": {
          "fieldTransformations": [
            {
              "fields": [
                {
                  "name": "Card_Holders_Name"
                },
                {
                  "name": "Card_Number"
                }
              ],
              "primitiveTransformation": {
                "cryptoDeterministicConfig": {
                  "cryptoKey": {
                    "kmsWrapped": {
                      "wrappedKey": "<var>kms-wrapped-key</var>",
                      "cryptoKeyName": "<var>kms-key-resource-name</var>"
                    }
                  }
                }
              }
            }
          ]
        }
      }
    }

    La plantilla de reidentificación es similar a la plantilla de desidentificación, excepto que solo contiene transformaciones que se pueden revertir. En este caso, las de los campos Card Holder's Name y Card Number.

  5. Exporta los nombres de las plantillas de Cloud DLP:

    export DEID_TEMPLATE_NAME=$(jq -r '.name' deid-template.json)
    export INSPECT_TEMPLATE_NAME=$(jq -r '.name' inspect-template.json)
    export REID_TEMPLATE_NAME=$(jq -r '.name' reid-template.json)
    
  6. Verifica que existan las siguientes variables:

    echo ${DATA_STORAGE_BUCKET}
    echo ${DATAFLOW_TEMP_BUCKET}
    echo ${DEID_TEMPLATE_NAME}
    echo ${INSPECT_TEMPLATE_NAME}
    echo ${REID_TEMPLATE_NAME}
    

Completaste este instructivo de forma correcta. En el siguiente instructivo, activarás una canalización automatizada de Dataflow para inspeccionar y desidentificar el conjunto de datos de muestra y almacenar este conjunto de datos en BigQuery.

Limpia

Si no quieres continuar con los instructivos de la serie, la manera más fácil de quitar la facturación es borrar el proyecto de Cloud que creaste para el instructivo. Como alternativa, puedes borrar los recursos individuales.

Borra el proyecto

  1. En Cloud Console, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

¿Qué sigue?