ユーザーデータの暗号化

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 日ごとに鍵をローテーションし、最初のローテーションを 1 週間後に実行するには、ROTATION_PERIOD30d に、 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 連携の概要について説明します。詳細については、Workload Identity 連携をご覧ください。

  1. Workload Identity プール(WIP)を作成します。プールの locationglobal である必要があります。

    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. 鍵復号のロールを 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"
    

    出力の KeyMetadataArn をメモします。この 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 ID プロバイダを作成する

OpenID Connect(OIDC)ID プロバイダを作成します。この手順は、AWS アカウントごとに 1 回だけ行います。

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

出力から OIDC プロバイダ 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. IAM ポリシーを作成するには、JSON ファイルと 任意のポリシー名を使用します。

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

    出力の IAM ポリシー ARN をメモします。これは他の手順で必要になります。

    AWS_IAM_POLICY_ARN
    

IAM ロールを作成してアタッチする

  1. 次の内容と前の手順の OIDC プロバイダ ARN を含む role-trust-policy.json という名前の 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. 暗号化プロセスの出力を、16 進数または Base64 エンコードを使用してエンコードします。
  4. エンコードされた値を フィールドに使用します。
  5. リクエストで encryption_infoencoding を設定します。

最後の手順を完了するには、 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 ライブラリと ユーティリティを使用してリクエストを作成して送信するには、Java の IngestAudienceMembers コードサンプル または Python の ingest_audience_members コードサンプルをご覧ください。

暗号化の問題について診断を確認する

暗号化されたデータをアップロードしたら、診断を使用して、暗号化に関連する警告がないか確認します。たとえば、PROCESSING_WARNING_REASON_KEK_PERMISSION_DENIEDPROCESSING_WARNING_REASON_DEK_DECRYPTION_ERROR などです。診断で警告が表示された場合は、その警告に対処し、リクエストを再度送信して、変更後に診断で警告が返されなくなったことを確認します。