加密用户数据

Data Manager API 支持使用以下密钥管理服务加密数据:

对某些使用场景的支持因密钥管理服务 (KMS) 而异:

类别 使用场景 Google Cloud KMS AWS KMS
受众群体 发送受众群体成员
事件 线下转化或增强型潜在客户转化
事件 Google Ads 实体店销售转化
事件 作为额外数据源发送到 Google Ads 目标位置的事件
事件 作为额外数据源发送到 Google Analytics 目标位置的事件

设置 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 天轮换一次密钥并在 1 周内执行首次轮换 ,请将 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"
    

    如需了解详情,请参阅创建密钥

创建工作负载身份池提供方

本部分简要介绍了工作负载身份联合。如需了解更多 信息,请参阅工作负载身份联合

  1. 创建工作负载身份池 (WIP)。池的 location 必须为 global

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

    如需了解详情,请参阅管理工作负载身份池和 提供方

  2. 创建工作负载身份池提供方。--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. 向 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. 如果您想为线下转化和 增强型潜在客户转化加密事件数据,请向 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"
    

    请注意输出中 KeyMetadata 下的 Arn。您将在其他步骤中需要此 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"

请注意输出中的 OIDC 提供方 ARN。您将在其他步骤中需要此 ARN。

AWS_OIDC_PROVIDER_ARN

创建 IAM 政策

  1. 创建一个名为 kms-decrypt-policy.json 且包含以下内容的 JSON 文件:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "kms:Decrypt",
          "Resource": "AWS_KEY_ARN"
        }
      ]
    }
    
  2. 使用 JSON 文件和您选择的 政策名称创建 IAM 政策。

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

    请注意输出中的 IAM 政策 ARN。您将在其他步骤中需要此 ARN。

    AWS_IAM_POLICY_ARN
    

创建并附加 IAM 角色

  1. 创建一个名为 role-trust-policy.json 且包含以下内容以及上一步中的 OIDC 提供方 ARN 的 JSON 文件:

    {
        "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 中的加密需要数据加密密钥 (DEK)。DEK 是用于加密数据的对称密钥。您的 DEK 使用 Google Cloud 或 AWS KMS 密钥加密密钥 (KEK) 进行加密。您可以在请求中发送加密的 DEK、KEK URI 和 WIP 提供方。

如需准备请求中的数据以进行加密,请遵循与未加密数据相同的格式设置 和哈希处理准则

请勿加密未经过哈希处理的值。例如,region_codepostal_codeAddressInfo

为每个字段的数据设置格式并进行哈希处理后,请按照以下步骤加密哈希处理后的值:

  1. 使用 Base64 编码对哈希字节进行编码。
  2. 使用 DEK 对经过 Base64 编码的哈希值进行加密。
  3. 使用十六进制或 Base64 编码对加密过程的输出进行编码。
  4. 使用字段的编码值。
  5. 在请求中设置 encryption_infoencoding

如需完成最后一步,请修改 IngestAudienceMembersRequestIngestEventsRequest 以表明您已加密 数据:

  • 设置 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 库和 实用程序来构建和发送 请求,请参阅 Java 的 IngestAudienceMembers 代码示例 或 Python 的 ingest_audience_members 代码示例。

检查诊断信息以了解加密问题

上传加密的数据后,请使用 诊断信息 检查 与加密相关的任何 警告,例如 PROCESSING_WARNING_REASON_KEK_PERMISSION_DENIEDPROCESSING_WARNING_REASON_DEK_DECRYPTION_ERROR。解决诊断信息中的所有警告,再次发送请求,并验证诊断信息在您做出更改后不再返回警告。