Chiffrer les données utilisateur

L'API Data Manager permet de chiffrer les données à l'aide des services de gestion des clés suivants :

La compatibilité avec certains cas d'utilisation diffère selon le service de gestion des clés (KMS) :

Catégorie Cas d'utilisation Google Cloud KMS KMS AWS
Audiences Envoyer des membres de l'audience
Événements Conversions hors connexion ou suivi avancé des conversions pour les prospects
Événements Conversions de vente en magasin Google Ads
Événements Conversions Google Ads avec plusieurs sources
Événements Événements multisources Google Analytics

Configurer Google Cloud KMS

Voici la procédure à suivre pour configurer les ressources Google Cloud KMS pour le chiffrement.

Configurer l'interface de ligne de commande Google Cloud

  1. Installez et initialisez l'interface de ligne de commande Google Cloud.

  2. Pour sélectionner ou créer un projet Google Cloud et activer Cloud Key Management Service, cliquez sur Activer Cloud KMS.

    Activer Cloud KMS
  3. Pour définir votre projet dans votre environnement, utilisez la commande gcloud config set. Pour vérifier si le projet est déjà défini dans votre environnement, exécutez gcloud config list.

    Si aucun project n'est défini ou si vous souhaitez utiliser un autre projet pour votre clé, exécutez gcloud config set :

    gcloud config set project PROJECT_ID
    

Créer une clé

Pour en savoir plus, consultez la présentation de Cloud Key Management Service.

  1. Créer un trousseau de clés.

    gcloud kms keyrings create KEY_RING_NAME \
        --location KEY_RING_LOCATION
    

    Pour en savoir plus, consultez Créer un trousseau de clés.

  2. Créez une clé dans le trousseau de clés. ROTATION_PERIOD indique l'intervalle de rotation de la clé, et NEXT_ROTATION_TIME indique la date et l'heure auxquelles la première rotation doit avoir lieu.

    Par exemple, pour effectuer une rotation de la clé tous les 30 jours et effectuer la première rotation dans une semaine, définissez ROTATION_PERIOD sur 30d et NEXT_ROTATION_TIME sur $(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"
    

    Pour en savoir plus, consultez Créer une clé.

Créer un fournisseur de pools d'identités de charge de travail

Cette section présente brièvement la fédération d'identité de charge de travail. Pour en savoir plus, consultez Fédération d'identité de charge de travail.

  1. Créez un pool d'identités de charge de travail. La valeur location du pool doit être global.

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

    Pour en savoir plus, consultez Gérer les pools d'identités de charge de travail et leurs fournisseurs.

  2. Créez un fournisseur de pool d'identités de charge de travail. L'argument --attribute-condition vérifie que l'appelant est un compte de service de mise en correspondance confidentielle.

    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. Attribuez le rôle de déchiffreur de clé au fournisseur du pool d'identités de charge de travail.

    # 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 vous souhaitez chiffrer les données d'événement pour les conversions hors connexion et le suivi avancé des conversions pour les prospects, attribuez le rôle de déchiffreur de clé au compte de service 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"
    

Passez à la section Chiffrer les données.

Configurer AWS KMS

Voici comment configurer les ressources AWS KMS pour le chiffrement.

Configurer l'interface de ligne de commande AWS

  1. Installez l'interface de ligne de commande AWS.
  2. Exécutez la commande suivante pour vérifier l'installation :

    aws --version
    

    Voici un extrait du résultat d'une installation réussie :

    aws-cli/2.31.12 Python/3.13.7 ...
    

Configurer un utilisateur AWS et se connecter

  1. Remplissez les conditions préalables à l'utilisation de l'interface de ligne de commande AWS.
  2. Connectez-vous à une session IAM Identity Center.

Créer une clé

  1. Créez une clé KMS symétrique (KEK).

    aws kms create-key \
      --key-usage ENCRYPT_DECRYPT \
      --key-spec SYMMETRIC_DEFAULT \
      --description "KEK for Confidential Matching Data Encryption"
    

    Notez l'élément Arn sous KeyMetadata dans le résultat. Vous aurez besoin de cet Amazon Resource Name (ARN) lors d'autres étapes.

    AWS_KEY_ARN
    
  2. Facultatif : Créez un alias de clé en utilisant le nom d'alias de votre choix.

    aws kms create-alias \
      --alias-name "alias/AWS_KEY_ALIAS" \
      --target-key-id AWS_KEY_ARN
    

    Un alias n'est pas obligatoire, mais il est utile pour créer des commandes d'interface de ligne de commande AWS. Par exemple, vous pouvez récupérer l'ARN de la clé à l'aide de l'alias :

    aws kms describe-key --key-id "alias/AWS_KEY_ALIAS" \
      --query 'KeyMetadata.Arn' \
      --output text
    

Créer un fournisseur d'identité OpenID Connect

Créez un fournisseur d'identité OpenID Connect (OIDC). Vous n'avez besoin d'effectuer cette étape qu'une seule fois par compte AWS.

aws iam create-open-id-connect-provider \
  --url https://confidentialcomputing.googleapis.com \
  --client-id-list AUDIENCE \
  --thumbprint-list "08745487e891c19e3078c1f2a07e452950ef36f6"

Notez l'ARN du fournisseur OIDC dans le résultat. Vous en aurez besoin pour d'autres étapes.

AWS_OIDC_PROVIDER_ARN

Créez une stratégie IAM :

  1. Créez un fichier JSON nommé kms-decrypt-policy.json avec le contenu suivant :

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "kms:Decrypt",
          "Resource": "AWS_KEY_ARN"
        }
      ]
    }
    
  2. Créez une stratégie IAM à l'aide du fichier JSON et du nom de stratégie de votre choix.

    aws iam create-policy \
      --policy-name "AWS_POLICY_NAME" \
      --policy-document file://kms-decrypt-policy.json
    

    Notez l'ARN de la stratégie IAM dans le résultat. Vous en aurez besoin pour d'autres étapes.

    AWS_IAM_POLICY_ARN
    

Créer et associer un rôle IAM

  1. Créez un fichier JSON nommé role-trust-policy.json avec le contenu suivant et l'ARN du fournisseur OIDC de l'étape précédente :

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Federated": "AWS_OIDC_PROVIDER_ARN"
                },
                "Action": [
                    "sts:AssumeRoleWithWebIdentity",
                    "sts:TagSession"
                ],
                "Condition": {
                    "StringEquals": {
                        "confidentialcomputing.googleapis.com:aud": "cfm-awsresource",
                        "aws:RequestTag/swname": "CONFIDENTIAL_SPACE",
                        "aws:RequestTag/container.signatures.key_ids": "6b1f357b59e9407fb017ca0e3e783b2bd5acbfea6c83dd82971a4150df5b25f9"
                    },
                    "StringLike": {
                        "aws:RequestTag/confidential_space.support_attributes": "*STABLE*"
                    }
                }
            }
        ]
    }
    
  2. Créez un rôle IAM avec le nom de votre choix.

    aws iam create-role \
      --role-name "AWS_IAM_ROLE_NAME" \
      --assume-role-policy-document file://role-trust-policy.json
    
  3. Associez la stratégie de rôle à la stratégie IAM.

    aws iam attach-role-policy \
      --role-name "AWS_IAM_ROLE_NAME" \
      --policy-arn "AWS_IAM_POLICY_ARN"
    

Chiffrer des données

Le chiffrement dans l'API Data Manager nécessite une clé de chiffrement des données (DEK). Une DEK est une clé symétrique que vous utilisez pour chiffrer des données. Votre DEK est chiffrée à l'aide de votre clé de chiffrement de clé (KEK) Google Cloud ou AWS KMS. Vous envoyez la DEK chiffrée, l'URI de la KEK et le fournisseur WIP dans la requête.

Pour préparer les données de la requête de chiffrement, suivez les mêmes consignes de mise en forme et de hachage que pour les données non chiffrées.

Ne chiffrez pas les valeurs non hachées. Par exemple, ne hachez pas les éléments region_code, postal_code, city ou administrative_area d'un AddressInfo.

Une fois les données de chaque champ mises en forme et hachées, chiffrez la valeur de hachage en procédant comme suit :

  1. Encodez les octets de hachage à l'aide de l'encodage Base64.

  2. Chiffrez le hachage encodé en Base64 à l'aide de votre DEK. Étant donné que le chiffrement requis est XCHACHA20_POLY1305, la fonction encrypt() de Tink nécessite un paramètre de données associé. Ce paramètre doit être vide (par exemple, b"" en Python ou new byte[0] en Java). Si vous transmettez null ou une valeur non vide, l'API Data Manager ne peut pas déchiffrer les données.

  3. Encodez le résultat du processus de chiffrement à l'aide de l'encodage hexadécimal ou Base64.

  4. Utilisez la valeur encodée pour le champ.

  5. Définissez encryption_info et encoding sur la requête.

Pour terminer la dernière étape, modifiez IngestAudienceMembersRequest ou IngestEventsRequest pour indiquer que vous avez chiffré vos données :

  • Définissez le champ encryption_info.

  • Définissez le champ encoding sur l'encodage utilisé pour encoder les valeurs des champs chiffrés.

Voici un extrait d'une requête utilisant une clé Google Cloud KMS et dont les champs de chiffrement et d'encodage sont définis :

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

Pour utiliser la bibliothèque et les utilitaires de l'API Data Manager afin de créer et d'envoyer une requête, consultez l'exemple de code IngestAudienceMembers pour Java ou l'exemple de code ingest_audience_members pour Python.

Vérifier les diagnostics pour détecter les problèmes de chiffrement

Après avoir importé des données chiffrées, utilisez les diagnostics pour vérifier s'il existe des avertissements liés au chiffrement, tels que PROCESSING_WARNING_REASON_KEK_PERMISSION_DENIED ou PROCESSING_WARNING_REASON_DEK_DECRYPTION_ERROR. Corrigez les avertissements dans les diagnostics, renvoyez les requêtes et vérifiez que les diagnostics ne renvoient plus d'avertissements après vos modifications.