Encripte datos del usuario

A continuación, te indicamos cómo enviar datos encriptados.

Configura la interfaz de línea de comandos de Google Cloud

  1. Instala y, luego, inicializa la interfaz de línea de comandos de Google Cloud.

  2. Para seleccionar o crear un proyecto de Google Cloud nuevo y habilitar Cloud Key Management Service, haz clic en Habilitar Cloud KMS.

    Habilita Cloud KMS
  3. Para configurar tu proyecto en tu entorno, usa el comando gcloud config set. Para verificar si el proyecto ya está configurado en tu entorno, ejecuta gcloud config list.

    Si no se configuró ningún project o si quieres usar un proyecto diferente para tu clave, ejecuta gcloud config set:

    gcloud config set project PROJECT_ID
    

Crear una clave

Para obtener más información, consulta la descripción general de Cloud Key Management Service.

  1. Crea un llavero de claves.

    gcloud kms keyrings create KEY_RING_NAME \
        --location KEY_RING_LOCATION
    

    Para obtener más información, consulta Crea un llavero.

  2. Crea una clave en el llavero de claves. El ROTATION_PERIOD indica el intervalo para rotar la clave, y el NEXT_ROTATION_TIME indica la fecha y la hora en que debe producirse la primera rotación.

    Por ejemplo, para rotar la clave cada 30 días y realizar la primera rotación en 1 semana, establece ROTATION_PERIOD en 30d y NEXT_ROTATION_TIME en $(date --utc --date="next week" --iso-8601=seconds).

    gcloud kms keys create KEY_NAME \
        --keyring KEY_RING_NAME \
        --location KEY_RING_LOCATION \
        --purpose "encryption" \
        --rotation-period ROTATION_PERIOD \
        --next-rotation-time "NEXT_ROTATION_TIME"
    

    Para obtener más información, consulta Crea una clave.

Crea un proveedor de grupos de identidades para cargas de trabajo

En esta sección, se proporciona una breve descripción general de la federación de identidades para cargas de trabajo. Para obtener más información, consulta Federación de identidades para cargas de trabajo.

  1. Crea un grupo de identidades para cargas de trabajo (WIP). El location del grupo debe ser global.

    gcloud iam workload-identity-pools create WIP_ID \
       --location=global \
       --display-name="WIP_DISPLAY_NAME" \
       --description="WIP_DESCRIPTION"
    

    Para obtener más información, consulta Administra grupos y proveedores de identidades para cargas de trabajo.

  2. Crea un proveedor de grupos de identidades para cargas de trabajo. El argumento --attribute-condition verifica que el llamador sea una cuenta de servicio de correlación confidencial.

    gcloud iam workload-identity-pools providers create-oidc PROVIDER_ID \
       --location=global \
       --workload-identity-pool=WIP_ID \
       --display-name="PROVIDER_DISPLAY_NAME" \
       --description="PROVIDER_DESCRIPTION" \
       --attribute-mapping="google.subject=assertion.sub,google.groups=[\"PROVIDER_ID\"]" \
       --attribute-condition="assertion.swname == 'CONFIDENTIAL_SPACE' &&
         'STABLE' in assertion.submods.confidential_space.support_attributes &&
         ['cfm-services@admcloud-cfm-services.iam.gserviceaccount.com'].exists(
             a, a in assertion.google_service_accounts) &&
         'ECDSA_P256_SHA256:6b1f357b59e9407fb017ca0e3e783b2bd5acbfea6c83dd82971a4150df5b25f9'
         in assertion.submods.container.image_signatures.map(sig, sig.signature_algorithm+':'+sig.key_id)" \
       --issuer-uri="https://confidentialcomputing.googleapis.com" \
       --allowed-audiences="https://sts.googleapis.com"
    
  3. Otorga el rol de desencriptador de claves al proveedor del WIP.

    # Grants the role to the WIP provider.
    gcloud kms keys add-iam-policy-binding KEY_NAME \
        --keyring KEY_RING_NAME \
        --location KEY_RING_LOCATION \
        --member "principalSet://iam.googleapis.com/projects/PROJECT_ID/locations/global/workloadIdentityPools/WIP_ID/group/PROVIDER_ID" \
        --role "roles/cloudkms.cryptoKeyDecrypter"
    
  4. Si deseas encriptar los datos de eventos para las conversiones sin conexión y las conversiones avanzadas de clientes potenciales, otorga el rol de desencriptador de claves a la cuenta de servicio de Google datamanager-api@datamanager-ga.iam.gserviceaccount.com.

    # Grants the role to the Google service account.
    gcloud kms keys add-iam-policy-binding KEY_NAME \
        --keyring KEY_RING_NAME \
        --location KEY_RING_LOCATION \
        --member "serviceAccount:datamanager-api@datamanager-ga.iam.gserviceaccount.com" \
        --role "roles/cloudkms.cryptoKeyDecrypter"
    

Encripta datos

La encriptación en la API de Data Manager requiere una clave de encriptación de datos (DEK). Una DEK es una clave simétrica que se usa para encriptar datos. Tu DEK se encripta con tu clave de Google Cloud KMS. Envías la DEK encriptada como parte de la solicitud.

Para preparar los datos de la solicitud para la encriptación, sigue los mismos lineamientos de formato y codificación hash que usarías para los datos sin encriptar.

No encriptes valores sin codificación hash. Por ejemplo, el region_code o el postal_code de un AddressInfo.

Una vez que los datos de cada campo se formatean y se generan sus hashes, encripta el valor con hash siguiendo estos pasos:

  1. Codifica los bytes de hash con la codificación Base64.
  2. Encripta el hash codificado en Base64 con tu DEK.
  3. Codifica el resultado del proceso de encriptación con codificación hexadecimal o Base64.
  4. Usa el valor codificado para el campo.
  5. Configura encryption_info y encoding en la solicitud.

Para completar el último paso, modifica IngestAudienceMembersRequest o IngestEventsRequest para indicar que encriptaste tus datos:

  • Configura el campo encryption_info.
  • Establece el campo encoding en la codificación que se usa para codificar los valores de los campos encriptados.

Este es un fragmento de una solicitud con los campos de encriptación y codificación establecidos:

{
  ...
  "encryptionInfo": {
    "gcpWrappedKeyInfo": {
      "kekUri": "gcp-kms://projects/PROJECT_ID/locations/KEY_RING_LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/KEY_NAME",
      "wipProvider": "projects/PROJECT_ID/locations/global/workloadIdentityPools/WIP_ID/providers/PROVIDER_ID",
      "keyType": "XCHACHA20_POLY1305",
      "encryptedDek": "ENCRYPTED_DEK"
    }
  },
  "encoding": "ENCODING"
}

Para usar la biblioteca y las utilidades de la API de Data Manager para crear y enviar una solicitud, consulta la muestra de código IngestAudienceMembersWithEncryption para Java o la muestra de código ingest_audience_members_with_encryption para Python.