建立並授予機密資源的存取權


資料協作者必須設定下列資源,工作負載才能存取機密資料:

此外,資料協作者必須選擇 Confidential Space 工作負載結果的儲存位置,以及顯示的資料是專屬還是共用。舉例來說,您可以將相同結果輸出至每個資料協作者所屬的多個 Cloud Storage 值區。

儲存資料

您可以使用任何 Google Cloud 資料儲存服務代管機密資料。舉例來說,您可能會使用下列其中一項服務:

無論是使用內建功能,還是 Cloud Key Management Service (Cloud KMS) 等服務,都應確保靜態資料經過加密。

建立服務帳戶來解密機密資料

您可透過服務帳戶,將機密資料提供給 Confidential Space 工作負載,並減少人為接觸這些資料的機會。

舉例來說,您可以使用 Cloud KMS 加密 Cloud Storage 中的機密檔案,然後建立服務帳戶,並授予該帳戶存取資料和解密金鑰的權限。

然後將該服務帳戶連結至 WIP。其他專案中授權的 Confidential Space 工作負載隨後可以使用該 WIP 模擬解密資料的服務帳戶、擷取解密資料,並進行處理。

服務帳戶可用於解密及處理機密資料,因此只有擁有者才能查看機密資料。由於工作負載是在機密 VM 中運作,因此硬體式記憶體加密功能可確保資料在使用期間保持私密。使用正式版 Confidential Space 映像檔的工作負載 VM 也會停用 SSH,因此 VM 執行時,任何人都無法存取。

如需相關範例,請參閱「建立第一個 Confidential Space 環境」。

建立 WIP 和提供者,用於認證驗證

為保護資料免受不受信任的工作負載運算子侵害,機密空間會實作認證程序,偵測工作負載映像檔或 TEE 的修改內容。這個程序以受防護的 VM 測量啟動和擴充執行階段測量為基礎,並在虛擬信任平台模組 (vTPM) 裝置中,擷取受保護的僅擴充暫存器中的啟動順序測量值。

私密空間驗證服務會產生 OpenID Connect (OIDC) 權杖,其中包含 vTPM 驗證,且格式可供 WIP 驗證,WIP 會根據新增為屬性條件的政策檢查這些驗證,並將其新增至提供者。這些權杖由 Google 簽署,效期為一小時,且會自動重新整理。

如果 WIP 授權工作負載,工作負載就能模擬專案中的服務帳戶,解密及擷取機密資料。

如要設定 WIP 和供應商,請完成下列操作:

  1. 建立 WIP

  2. 使用 iam.workloadIdentityUser 角色,將解密服務帳戶連結至 WIP。

  3. 建立 OIDC 提供者,並提供下列詳細資料:

    • https://confidentialcomputing.googleapis.com/ 的核發者 URI。

    • https://sts.googleapis.com」的允許目標對象。

    • 提供者屬性對應 google.subject,值為 assertion.sub

    • 用於驗證工作負載認證的屬性條件。如需可用選項,請參閱「建立認證政策」。

建立認證政策

建立 WIP 時,您會新增屬性條件,工作負載必須通過這些條件,才能存取資料。對於 Confidential Space,這些屬性條件會構成驗證政策。

政策是以一般運算語言 (CEL) 編寫,由一系列可使用 && 運算子串連的判斷組成。

以下範例說明如何使用 gcloud CLI 將提供者新增至工作負載身分集區,以及定義政策的 attribute-condition 選項:

gcloud iam workload-identity-pools providers create-oidc attestation-verifier \
    --location=global \
    --workload-identity-pool=user-pool-name \
    --issuer-uri="https://confidentialcomputing.googleapis.com/" \
    --allowed-audiences="https://sts.googleapis.com" \
    --attribute-mapping="google.subject=assertion.sub" \
    --attribute-condition="assertion.submods.container.image_digest =='sha256:837ccb607e312b170fac7383d7ccfd61fa5072793f19a25e75fbacb56539b86b' \
&& 'service-account@my-project.iam.gserviceaccount.com' in assertion.google_service_accounts \
&& assertion.swname == 'CONFIDENTIAL_SPACE' \
&& 'STABLE' in assertion.submods.confidential_space.support_attributes"

在本例中,嘗試模擬連線至工作負載身分集區的服務帳戶時,外部身分必須證明並符合下列詳細資料:

  • 工作負載容器的映像檔摘要

  • 連結至工作負載 VM 的服務帳戶地址

  • 這是指在 VM 上執行的軟體,並具有所有內建安全保障CONFIDENTIAL_SPACE

  • 生產環境的 Confidential Space 映像檔支援屬性

認證聲明

下表詳細列出可用於建構認證政策的判斷。他們可以驗證 Confidential Space 映像檔、工作負載容器和 VM 所做的判斷。

圖片聲明

斷言 類型 說明

assertion.dbgstat

互動對象:

定義的字串

確認 Confidential Space 映像檔是偵錯或正式版。

有效值如下:

  • enable:確認使用的是偵錯圖片。
  • disabled-since-boot:確認使用的是正式版圖片。
範例

下列程式碼會驗證是否使用 Confidential Space 映像檔的偵錯版本:

assertion.dbgstat == "enable"

下列程式碼會驗證是否使用 Confidential Space 映像檔的正式版:

assertion.dbgstat == "disabled-since-boot"
assertion.submods.confidential_space.support_attributes 字串陣列

驗證 TEE 的安全版本是否為正式版 Confidential Space 映像檔。偵錯機密空間映像檔未設定支援屬性。

支援的屬性有三種:

  • LATEST:這是最新版圖片,且系統支援此版本。LATEST圖片也STABLEUSABLE
  • STABLE:這個版本的映像檔受到支援,且會監控是否有安全漏洞。STABLE 圖片也是 USABLE
  • USABLE:只有這項屬性的映像檔已停止支援,且不再監控是否有安全漏洞。您必須自行承擔使用風險。
範例

下列程式碼會驗證是否使用穩定版本的 Confidential Space 映像檔:

"STABLE" in assertion.submods.confidential_space.support_attributes
assertion.swname 定義的字串

驗證認證實體執行的軟體。值一律為 CONFIDENTIAL_SPACE

範例
assertion.swname == "CONFIDENTIAL_SPACE"
assertion.swversion 字串陣列

驗證 Confidential Space 映像檔的軟體版本。建議改用 assertion.submods.confidential_space.support_attributes,以便指定最新版本的映像檔。

範例
int(assertion.swversion[0]) == 230103

容器斷言

斷言 類型 說明

assertion.submods.container.cmd_override

互動對象:

字串陣列

驗證工作負載映像檔中使用的 CMD 指令和參數。

範例

下列程式碼會驗證工作負載映像檔的 CMD 是否遭到覆寫:

size(assertion.submods.container.cmd_override) == 0

下列程式碼會驗證 program 是否為 CMD 覆寫中的唯一內容:

assertion.submods.container.cmd_override == ['program']

assertion.submods.container.env

互動對象:

JSON 物件

確認環境變數及其值已明確傳遞至容器。

範例

下列程式碼會驗證環境變數 example-env-1 是否設為 value-1,以及 example-env-2 是否設為 value-2

assertion.submods.container.env == {"example-env-1": "value-1", "example-env-2": "value-2"}

assertion.submods.container.env_override

互動對象:

字串

確認工作負載運算子是否已覆寫容器中的環境變數。

範例

下列程式碼會驗證工作負載運算子是否未覆寫 example 環境變數:

!has(assertion.submods.container.env_override.example)

下列程式碼會驗證工作負載運算子是否覆寫任何環境變數:

size(assertion.submods.container.env_override) == 0
assertion.submods.container.image_digest 字串

驗證工作負載容器的映像檔摘要。指定這項條件後,多方就能同意授權工作負載存取資料。

範例
assertion.submods.container.image_digest == "sha256:837ccb607e312b170fac7383d7ccfd61fa5072793f19a25e75fbacb56539b86b"
assertion.submods.container.image_id 字串

驗證工作負載容器的映像檔 ID。

範例
assertion.submods.container.image_id == "sha256:652a44b0e911271ba07cf2915cd700fdfa50abd62a98f87a57fdebc59843d93f"

assertion.submods.container.image_reference

互動對象:

字串

驗證在 Confidential Space 映像檔上執行的工作負載容器位置。

範例
assertion.submods.container.image_reference == "us-docker.pkg.dev/PROJECT_ID/WORKLOAD_CONTAINER:latest"

assertion.submods.container.image_signatures

互動對象:

JSON 物件

驗證圖片是否具有特定簽章,或是否由公開金鑰和簽章演算法簽署。指定這項條件後,多方就能同意授權工作負載存取資料。

判斷可包含下列元素:

  • key_id:公開金鑰的十六進位指紋。如要取得指紋,請執行下列指令:

    openssl pkey -pubin -in public_key.pem -outform DER | openssl sha256

    其中 public_key.pem 是 PEM 格式的公開金鑰。

  • signature:與已簽署容器相關聯的酬載簽章,且遵循 簡易簽署格式
  • signature_algorithm:用於簽署金鑰的演算法。可以是下列其中一項:

    • RSASSA_PSS_SHA256 (RSASSA-PSS,具有 SHA-256 摘要)
    • RSASSA_PKCS1V15_SHA256 (RSASSA-PKCS1 v1_5 搭配 SHA-256 摘要)
    • ECDSA_P256_SHA256 (具有 SHA-256 摘要之 P-256 曲線的 ECDSA)
範例
assertion.swname == 'CONFIDENTIAL_SPACE' && ['ECDSA_P256_SHA256:PUBLIC_KEY_FINGERPRINT'].exists(fingerprint, fingerprint in assertion.submods.container.image_signatures.map(sig, sig.signature_algorithm+':'+sig.key_id)) && 'serviceaccount.iam.gserviceaccount.com' in assertion.google_service_accounts"

assertion.submods.container.restart_policy

互動對象:

定義的字串

驗證容器啟動器的重新啟動政策,以瞭解工作負載停止時的行為。

有效值如下:

  • Never (預設)
  • Always
  • OnFailure
範例
assertion.submods.container.restart_policy == "Never"

VM 聲明

斷言 類型 說明

assertion.google_service_accounts

互動對象:

字串陣列

確認指定服務帳戶已連線至執行工作負載的 VM,或已使用 VM 中繼資料的 tee-impersonate-service-accounts 列出。

範例
workload-service-account@my-project.iam.gserviceaccount.com in assertion.google_service_accounts
assertion.hwmodel 字串

驗證基礎機密運算技術。支援的平台如下:

  • GCP_AMD_SEV
  • INTEL_TDX
範例
assertion.hwmodel == "GCP_AMD_SEV"

assertion.submods.confidential_space.monitoring_enabled

互動對象:

布林值

驗證認證實體的監控狀態。

範例
assertion.submods.confidential_space.monitoring_enabled.memory == true
assertion.submods.gce.instance_id 字串

驗證 VM 執行個體 ID。

範例
assertion.submods.gce.instance_id == "0000000000000000000"
assertion.submods.gce.instance_name 字串

驗證 VM 執行個體的名稱。

範例
assertion.submods.gce.instance_name == "workload-vm"
assertion.submods.gce.project_id 字串

驗證 VM 執行的 Google Cloud 專案是否具有指定的專案 ID。

範例
assertion.submods.gce.project_id == "project-id"
assertion.submods.gce.project_number 字串

驗證 VM 是否在具有指定專案編號的 Google Cloud 專案中執行。

範例
assertion.submods.gce.project_number == "00000000000"

assertion.submods.gce.zone

互動對象:

  • 工作負載運算子 --zone 值。
字串

確認 VM 是否在指定區域中執行。

範例
assertion.submods.gce.zone == "us-central1-a"