Chiffrer les données utilisateur

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

La compatibilité avec certains cas d'utilisation varie selon le service de gestion de 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 Événements envoyés en tant que source de données supplémentaire à une destination Google Ads
Événements Événements envoyés en tant que source de données supplémentaire à une destination 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 de la première rotation.

    Par exemple, pour effectuer la rotation de la clé tous les 30 jours et 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. Le 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 pools 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és au fournisseur 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 vous souhaitez chiffrer les données d'événement pour les conversions hors connexion et le suivi avancé des conversions pour les prospects, accordez 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"
    

Accédez à 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 pour utiliser 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 ce nom de ressource Amazon (ARN) dans 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 construire des commandes de l'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 dans 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 d'un 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 dans 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 en lui attribuant 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é Google Cloud ou AWS KMS. Vous envoyez la clé DEK chiffrée dans la requête.

Pour préparer les données de la demande 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, le region_code ou le postal_code d'un AddressInfo.

Une fois les données de chaque champ mises en forme et hachées, chiffrez la valeur hachée 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 clé DEK.
  3. Encodez la sortie 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 dans 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 avec les champs de chiffrement et d'encodage 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 IngestAudienceMembersWithEncryption pour Java ou l'exemple de code ingest_audience_members_with_encryption pour Python.