ユーザーデータの暗号化

オーディエンス メンバーの取り込みリクエストで暗号化されたデータを送信する方法は次のとおりです。

Google Cloud コマンドライン インターフェースを設定する

  1. Google Cloud コマンドライン インターフェースをインストールして初期化します。

  2. gcloud コンポーネントが最新であることを確認するには、次のコマンドを実行します。

    gcloud components update
    
  3. 新しい Google Cloud プロジェクトを選択または作成して Cloud Key Management Service を有効にするには、[Cloud KMS を有効にする] をクリックします。

    Cloud KMS を有効にする
  4. 環境にプロジェクトを設定するには、gcloud config set コマンドを使用します。プロジェクトが環境にすでに設定されているかどうかを確認するには、gcloud config list を実行します。

    project が設定されていない場合や、鍵に別のプロジェクトを使用する場合は、gcloud config set を実行します。

    gcloud config set project PROJECT_ID
    

キーを作成

詳細については、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"
    

データの暗号化

Data Manager API での暗号化には、データ暗号鍵(DEK)が必要です。DEK は、データを暗号化するために使用する対称鍵です。DEK は Google Cloud KMS 鍵を使用して暗号化されます。暗号化された DEK をリクエストの一部として送信します。

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

ハッシュ化されていない値は暗号化しないでください。たとえば、AddressInforegion_code または postal_code です。

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

  1. Base64 エンコードを使用してハッシュバイトをエンコードします。
  2. DEK を使用して、Base64 でエンコードされたハッシュを暗号化します。
  3. 16 進数または Base64 エンコードを使用して、暗号化プロセスの出力をエンコードします。
  4. フィールドにエンコードされた値を使用します。
  5. リクエストencryption_infoencoding を設定します。

最後のステップとして、データを暗号化したことを示すように IngestAudienceMembersRequest を変更します。

  • encryption_info フィールドを設定します。
  • encoding フィールドを、暗号化されたフィールド値のエンコードに使用されるエンコードに設定します。

暗号化フィールドとエンコード フィールドが設定されたリクエストのスニペットは次のとおりです。

{
  ...
  "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 コードサンプルをご覧ください。