Как зашифровать пользовательские данные

Data Manager API поддерживает шифрование данных с помощью следующих сервисов управления ключами:

Поддержка некоторых вариантов использования зависит от сервиса управления ключами (KMS):

Категория Пример использования Google Cloud KMS AWS KMS
Аудитории Отправка данных об аудитории
События Офлайн-конверсии или расширенное отслеживание конверсий лидов
События Конверсии – продажи в магазинах в Google Рекламе
События Конверсии Google Рекламы из нескольких источников
События События из нескольких источников в Google Аналитике

Как настроить Google Cloud KMS

Ниже описано, как настроить ресурсы Google Cloud KMS для шифрования.

Как настроить интерфейс командной строки Google Cloud

  1. Установите и инициализируйте интерфейс командной строки Google Cloud.

  2. Чтобы выбрать или создать новый облачный проект Google Cloud и включить Cloud Key Management Service, нажмите Включить Cloud KMS.

    Как включить Cloud KMS
  3. Чтобы задать проект в своей среде, используйте команду gcloud config set. Чтобы проверить, задан ли проект в вашей среде, выполните команду gcloud config list.

    Если project не задан или вы хотите использовать другой проект для ключа, выполните команду gcloud config set:

    gcloud config set project PROJECT_ID
    

Создать ключ

Подробнее об обзоре Cloud Key Management Service.

  1. Создайте набор ключей.

    gcloud kms keyrings create KEY_RING_NAME \
        --location KEY_RING_LOCATION
    

    Подробнее о том, как создать набор ключей…

  2. Создайте ключ в наборе ключей. ROTATION_PERIOD – интервал, через который будет меняться ключ, а NEXT_ROTATION_TIME – дата и время первого изменения.

    Например, чтобы ключ менялся каждые 30 дней, а первое изменение произошло через неделю, задайте для параметра ROTATION_PERIOD значение 30d, а для параметра NEXT_ROTATION_TIME – $(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"
    

    Подробнее о том, как создать ключ…

Как создать поставщика пула Workload Identity

В этом разделе приводится краткий обзор Workload Identity Federation. Подробнее об интеграции идентификационных данных рабочих нагрузок…

  1. Создайте пул Workload Identity. Значение location для пула должно быть global.

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

    Подробнее о том, как управлять пулами Workload Identity и поставщиками…

  2. Создать поставщика пула Workload Identity. Аргумент --attribute-condition подтверждает, что вызывающая функция является сервисным аккаунтом конфиденциального сопоставления.

    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. Предоставьте поставщику пула Workload Identity роль дешифровщика ключа.

    # 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. Если вы хотите зашифровать данные о событиях для офлайн-конверсий и расширенного отслеживания конверсий лидов, предоставьте сервисному аккаунту 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"
    

Перейдите к разделу Шифрование данных.

Как настроить AWS KMS

Ниже описаны шаги по настройке ресурсов AWS KMS для шифрования.

Как настроить интерфейс командной строки AWS

  1. Установите интерфейс командной строки AWS.
  2. Чтобы проверить установку, выполните следующую команду:

    aws --version
    

    Ниже приведен фрагмент вывода для успешной установки:

    aws-cli/2.31.12 Python/3.13.7 ...
    

Как настроить пользователя AWS и войти в аккаунт

  1. Выполните предварительные условия для использования интерфейса командной строки AWS.
  2. Войдите в сеанс IAM Identity Center.

Создать ключ

  1. Создайте симметричный ключ KMS (KEK).

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

    Обратите внимание на Arn под KeyMetadata в выходных данных. Имя ресурса Amazon (ARN) понадобится вам на других этапах.

    AWS_KEY_ARN
    
  2. Необязательно: создайте псевдоним ключа, используя любое название.

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

    Псевдоним не обязателен, но он полезен для создания команд интерфейса командной строки AWS. Например, вы можете получить ARN ключа, используя псевдоним:

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

Как создать поставщика идентификационной информации OpenID Connect

Создайте поставщика идентификационной информации OpenID Connect (OIDC). Это нужно сделать лишь один раз для каждого аккаунта AWS.

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

Запишите ARN поставщика OIDC из выходных данных. Эти сведения понадобятся вам на других шагах.

AWS_OIDC_PROVIDER_ARN

Как создать правило IAM

  1. Создайте JSON-файл с именем kms-decrypt-policy.json и следующим содержимым:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "kms:Decrypt",
          "Resource": "AWS_KEY_ARN"
        }
      ]
    }
    
  2. Создайте правило IAM, используя JSON-файл и название правила по вашему выбору.

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

    Запишите ARN политики IAM из выходных данных. Эти сведения понадобятся вам на других шагах.

    AWS_IAM_POLICY_ARN
    

Как создать и прикрепить роль IAM

  1. Создайте JSON-файл с названием role-trust-policy.json и следующим содержимым, используя ARN поставщика OIDC, полученный на предыдущем шаге:

    {
        "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. Создайте роль IAM с выбранным вами названием.

    aws iam create-role \
      --role-name "AWS_IAM_ROLE_NAME" \
      --assume-role-policy-document file://role-trust-policy.json
    
  3. Прикрепите правила роли к правилам IAM.

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

Как зашифровать данные

Для шифрования в Data Manager API требуется ключ шифрования данных. Ключ шифрования данных – это симметричный ключ, который используется для шифрования данных. Ваш ключ шифрования данных зашифрован с помощью ключа шифрования ключа (KEK) Google Cloud или AWS KMS. В запросе вы отправляете зашифрованный ключ шифрования данных, URI ключа шифрования ключей и поставщика WIP.

Чтобы подготовить данные в запросе к шифрованию, следуйте тем же правилам форматирования и хеширования, которые вы используете для незашифрованных данных.

Не шифруйте нехешированные значения. Например, не хешируйте region_code, postal_code, city или administrative_area AddressInfo.

После того как данные для каждого поля будут отформатированы и хешированы, зашифруйте хешированное значение, выполнив следующие действия:

  1. Закодируйте байты хеша с помощью кодировки Base64.
  2. Зашифруйте хеш, закодированный в формате Base64, с помощью ключа шифрования данных.
  3. Закодируйте выходные данные процесса шифрования, используя шестнадцатеричное кодирование или кодирование Base64.
  4. Используйте закодированное значение поля.
  5. Установите в запросе значения encryption_info и encoding.

Чтобы выполнить последний шаг, измените IngestAudienceMembersRequest или IngestEventsRequest, указав, что вы зашифровали данные:

  • Задайте значение поля encryption_info.
  • В поле encoding укажите кодировку, которая использовалась для шифрования значений полей.

Ниже приведен фрагмент запроса с использованием ключа Google Cloud KMS и заданными полями шифрования и кодирования:

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

Чтобы использовать библиотеку и утилиты Data Manager API для создания и отправки запроса, ознакомьтесь с IngestAudienceMembersобразцом кода для Java или ingest_audience_membersобразцом кода для Python.

Как проверить диагностику на наличие проблем с шифрованием

После загрузки зашифрованных данных проверьте, нет ли предупреждений, связанных с шифрованием, например PROCESSING_WARNING_REASON_KEK_PERMISSION_DENIED или PROCESSING_WARNING_REASON_DEK_DECRYPTION_ERROR, с помощью диагностики. Устраните все предупреждения в диагностике, отправьте запросы ещё раз и убедитесь, что после этого диагностика больше не возвращает предупреждения.