ユーザーデータの暗号化

Data Manager API は、次の鍵管理サービスを使用したデータの暗号化をサポートしています。

一部のユースケースのサポートは、鍵管理サービス(KMS)によって異なります。

カテゴリ ユースケース Google Cloud KMS AWS KMS
オーディエンス オーディエンス メンバーを送信する
イベント オフライン コンバージョンまたはリードの拡張コンバージョン
イベント 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"
    

    出力の 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. 次の内容と前の手順の 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 鍵を使用して暗号化されます。暗号化された DEK は、リクエストの一部として送信します。

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

ハッシュ化されていない値を暗号化しないでください。たとえば、AddressInforegion_codepostal_code などです。

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

  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 の IngestAudienceMembersWithEncryption コードサンプルまたは Python の ingest_audience_members_with_encryption コードサンプルをご覧ください。