ユーザーデータの暗号化

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_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 連携の概要について簡単に説明します。詳細については、Workload Identity 連携をご覧ください。

  1. Workload Identity プール(WIP)を作成します。プールの 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. 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 Resource Name(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. JSON ファイルと任意のポリシー名を使用して IAM ポリシーを作成します。

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

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

    AWS_IAM_POLICY_ARN
    

IAM ロールを作成して接続する

  1. role-trust-policy.json という名前の JSON ファイルを作成し、次の内容と前の手順の OIDC プロバイダ ARN を追加します。

    {
        "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 プロバイダを送信します。

暗号化のリクエストでデータを準備するには、暗号化されていないデータに使用するのと同じフォーマットとハッシュ化のガイドラインに従います。

ハッシュ化されていない値は暗号化しないでください。たとえば、AddressInfo の region_code、postal_code、city、administrative_area をハッシュ化しないでください。

各フィールドのデータがフォーマットされ、ハッシュ化されたら、次の手順でハッシュ値を暗号化します。

  1. Base64 エンコードを使用してハッシュバイトをエンコードします。

  2. DEK を使用して、Base64 でエンコードしたハッシュを暗号化します。必要な暗号は XCHACHA20_POLY1305 であるため、Tink の encrypt() 関数には関連するデータ パラメータが必要です。このパラメータは空にする必要があります(Python の b""、Java の new byte[0] など)。null または空でない値を渡すと、Data Manager API はデータを復号できません。

  3. 暗号化プロセスの出力を 16 進数または 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 のライブラリとユーティリティを使用してリクエストを作成して送信するには、Java の IngestAudienceMembers コードサンプルまたは Python の ingest_audience_members コードサンプルをご覧ください。

診断で暗号化の問題を確認する

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