加密使用者資料

以下說明如何傳送加密資料:

設定 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_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 Federation 說明文件

  1. 建立工作負載身分集區 (WIP)。集區的 location 必須為 global

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

    詳情請參閱「管理 workload identity pool 和提供者」。

  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"
    

加密資料

Data Manager API 中的加密作業需要資料加密金鑰 (DEK)。DEK 是用來加密資料的對稱金鑰。您的 DEK 會使用 Google Cloud KMS 金鑰加密。您會在要求中傳送加密的 DEK。

如要準備要求中的資料以進行加密,請遵循與未加密資料相同的格式和雜湊處理規範

請勿加密未經過雜湊處理的值。例如 AddressInforegion_codepostal_code

格式化並雜湊處理每個欄位的資料後,請按照下列步驟加密雜湊值:

  1. 使用 Base64 編碼方式編碼雜湊位元組。
  2. 使用 DEK 加密 Base64 編碼的雜湊。
  3. 使用十六進位或 Base64 編碼,為加密程序的輸出內容編碼。
  4. 使用欄位的編碼值。
  5. 在要求中設定 encryption_infoencoding

如要完成最後一個步驟,請修改 IngestAudienceMembersRequestIngestEventsRequest,指出您已加密資料:

  • 設定 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 程式碼範例。