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


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

  • 加密資料,儲存在 Google Cloud中。

  • 工作負載身分集區 (WIP),用於授權工作負載。工作負載獲得 WIP 授權後,即可存取資料協作者的機密資料並執行作業。

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

儲存加密資料

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

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

使用 WIP 授權工作負載

WIP 是 Confidential Space 用來允許外部工作負載以聯盟身分存取及處理機密資料的機制。同盟身分是外部實體,會視為您專案中的主體,因此您可以授予 IAM 角色,允許存取特定資源,或模擬服務帳戶來執行相同操作。

身為資料協作者,您可以在 WIP 中設定提供者,為以同盟身分驗證的實體設定規則。對於機密空間,您必須在供應器中定義下列項目:

  • 認證服務:這項服務會驗證工作負載是否為 Confidential VM 執行個體,並最終將 OpenID Connect (OIDC) 認證權杖傳回給 WIP 提供者。工作負載運算子會設定使用的驗證服務,且該服務必須與新增至 WIP 提供者的驗證服務相符,才能授予存取權。

  • 屬性對應:安全權杖服務存取權杖中的屬性,會對應至驗證實體 (在本例中,是執行工作負載的 VM 執行個體) 所做的聲明。這些判斷結果是由 VM 執行個體本身、Confidential Space 映像檔和工作負載容器所產生,並由工作負載傳遞至 WIP 提供者。這些屬性可用於 Cloud Logging 中的稽核追蹤記錄,以及根據驗證實體聲明 (例如工作負載映像檔容器摘要) 透過 IAM 授予角色。進一步瞭解屬性對應

  • 認證政策:一系列條件,驗證實體必須通過這些條件,才能根據所做的聲明取得存取權。

工作負載啟動時,Confidential Space Launcher 會將認證報告傳送至工作負載運算子定義的認證服務,該服務會驗證 Confidential VM 執行個體,然後傳回 OIDC 認證權杖。這個權杖的效期為一小時,且會自動更新。

工作負載隨後會將認證權杖傳遞給 WIP 供應商,供應商則會使用該權杖檢查判斷結果是否符合供應商定義的認證政策。如果符合,工作負載就能存取機密資源。

外部工作負載存取權

設定 WIP 和供應商之前,您需要選擇工作負載存取資源的方式:直接存取資源或模擬服務帳戶。

直接存取資源

建議工作負載使用直接資源存取方法。

這個方法是在與驗證實體聲明相關聯的 WIP 提供者中,設定聯合身分。這樣一來,工作負載就能根據工作負載的容器映像檔摘要等屬性,透過 IAM 繫結直接存取資源。

直接存取資源有下列優點:

  • 設定 Confidential Space 環境的步驟較少,因為資料協作者不需要設定服務帳戶,讓工作負載服務帳戶模擬。

  • 工作負載只能存取 IAM 決定的特定資源。相較於服務帳戶模擬方法,這種做法更安全,因為權限過多的服務帳戶或模擬權限可能會提供給惡意行為人超出預期的存取權。

  • 系統會記錄每個資源存取作業,並使用工作負載 VM 執行個體的聯盟身分,而非可能由多個工作負載共用的模擬服務帳戶身分。工作負載 VM 執行個體的 ID 可以包含容器的映像檔摘要、工作負載運作的專案編號,以及執行工作負載的 VM 執行個體 ID 等詳細資料,提供更詳盡的稽核追蹤記錄。

  • 您不需要將 VM 執行個體 selfLink 屬性對應至 WIP 供應商的 google.subject 屬性。如果selfLink值過長,可能會超過這個屬性的 127 位元組限制,導致 WIP 供應商驗證失敗。

服務帳戶模擬

服務帳戶模擬方法是指每位資料協作者設定服務帳戶來解密私人資料,然後將該服務帳戶附加至自己的 WIP。他們也會在 WIP 提供者中指定工作負載服務帳戶,讓工作負載服務帳戶模擬資料協作者服務帳戶,以便擷取及操作機密資料。

服務帳戶模擬只能用於下列情況:

如果 VM 執行個體具有非常長的 selfLink 屬性,服務帳戶模擬方法可能無法向 WIP 提供者完成驗證。這是因為認證權杖中的 sub 聲明 (設為 selfLink 值) 會在 WIP 提供者中對應至 google.subject 屬性,而該屬性有 127 位元組的限制。

如果 VM 執行個體 selfLink 值超過 127 個位元組,您必須重新命名 VM 執行個體來縮短 selfLink,或改用直接資源存取方法。

設定 WIP 和提供者

設定供應商的步驟取決於您是使用直接資源存取權,還是服務帳戶模擬。

直接存取資源

直接資源存取方法包括設定 WIP 和供應商,然後根據特定工作負載容器映像檔摘要設定 IAM 角色。

設定 WIP 和提供者

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

  1. 建立 WIP:

    gcloud iam workload-identity-pools create DATA_COLLABORATOR_POOL_NAME \
        --location=global
    
  2. 在 WIP 中建立 OIDC 提供者:

    gcloud iam workload-identity-pools providers create-oidc attestation-verifier \
        --location=global \
        --workload-identity-pool=DATA_COLLABORATOR_POOL_NAME \
        --issuer-uri="https://confidentialcomputing.googleapis.com/" \
        --allowed-audiences="https://sts.googleapis.com" \
        --attribute-mapping="google.subject=\"gcpcs::\"+assertion.submods.container.image_digest+\"::\"+assertion.submods.gce.project_number+\"::\"+assertion.submods.gce.instance_id,attribute.image_digest=assertion.submods.container.image_digest" \
        --attribute-condition="assertion.swname == 'CONFIDENTIAL_SPACE' \
            && 'STABLE' in assertion.submods.confidential_space.support_attributes"
    

    本範例使用下列值:

    • issuer-uri,也就是使用 Google Cloud Attestation 做為認證服務。https://confidentialcomputing.googleapis.com/

    • allowed-audienceshttps://sts.googleapis.com。這是 Google 的安全權杖服務,可將憑證換成存取權杖。

    • attribute-mappinggoogle.subject,具有下列值:

      \"gcpcs::\"+assertion.submods.container.image_digest+\"::\"+assertion.submods.gce.project_number+\"::\"+assertion.submods.gce.instance_id,attribute.image_digest=assertion.submods.container.image_digest
      

      這個值是使用一般運算語言 (CEL) 建構而成。系統會將下列值指派給 gcpcs 屬性,且每當工作負載存取資源時,這些值都會顯示在 Cloud Logging 中:

      • assertion.submods.container.image_digest:工作負載容器映像檔摘要。

      • assertion.submods.gce.project_number:VM 執行個體的專案編號。

      • assertion.submods.gce.instance_id:VM 執行個體的 ID。

      此外,attribute.image_digest 會設為 assertion.submods.container.image_digest,也就是工作負載容器映像檔摘要。這個屬性會經過對應,因此您可以根據特定映像檔摘要授予同盟身分 IAM 角色

      只要 google.subject 值的總長度少於 127 個位元組,您就可以對應任何可用的工作負載聲明

    • 以下 attribute-conditions 會形成認證政策。如果這些條件與工作負載的聲明相符,工作負載就能以同盟身分存取機密資源:

      • assertion.swname == 'CONFIDENTIAL_SPACE':驗證 Confidential Space 是否為 VM 上執行的軟體,並提供所有內建安全保障

      • 'STABLE' in assertion.submods.confidential_space.support_attributes: 確認使用的是正式版 Confidential Space 映像檔,且具有 STABLE 支援屬性

      如要瞭解更多可用的屬性條件,請參閱「建立認證政策」。

授予聯合身分 IAM 角色

建立 WIP 提供者後,您可以根據身分識別的工作負載映像檔容器摘要是否符合預期值,授予聯合身分識別 IAM 角色。

以下範例說明如何授予同盟身分可解密特定 Cloud Key Management Service 金鑰的權限:

gcloud kms keys add-iam-policy-binding \
    projects/DATA_COLLABORATOR_PROJECT_ID/locations/global/keyRings/DATA_COLLABORATOR_KEYRING_NAME/cryptoKeys/DATA_COLLABORATOR_KEY_NAME \
    --member="principalSet://iam.googleapis.com/projects/DATA_COLLABORATOR_PROJECT_NUMBER/locations/global/workloadIdentityPools/DATA_COLLABORATOR_POOL_NAME/attribute.image_digest/WORKLOAD_CONTAINER_IMAGE_DIGEST" \
    --role=roles/cloudkms.cryptoKeyDecrypter

服務帳戶模擬

服務帳戶模擬方法包含下列步驟:

  1. 在每個資料協作者專案中建立服務帳戶,並授予解密機密資料的權限。

  2. 在每個資料協作者專案中建立 WIP,然後將剛建立的每個專案服務帳戶附加至 WIP。

  3. 在每個 WIP 中建立 WIP 提供者,將工作負載服務帳戶指定為允許模擬資料協作者服務帳戶的帳戶。

設定服務帳戶來解密機密資料

  1. 在資料協作者專案中建立服務帳戶:

    gcloud iam service-accounts create DATA_COLLABORATOR_SERVICE_ACCOUNT_NAME
    

    授予服務帳戶解密機密資料所需的權限。舉例來說,您可能會使用 Cloud KMS 加密 Cloud Storage 中的機密檔案,因此需要授予服務帳戶解密該資料的權限:

    gcloud kms keys add-iam-policy-binding \
        projects/DATA_COLLABORATOR_PROJECT_ID/locations/global/keyRings/DATA_COLLABORATOR_KEYRING_NAME/cryptoKeys/DATA_COLLABORATOR_KEY_NAME \
        --member=serviceAccount:DATA_COLLABORATOR_SERVICE_ACCOUNT_NAME@DATA_COLLABORATOR_PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/cloudkms.cryptoKeyDecrypter
    

設定 WIP 和提供者

如要設定 WIP 和供應商,請在每個資料協作者專案中完成下列操作:

  1. 建立 WIP:

    gcloud iam workload-identity-pools create DATA_COLLABORATOR_POOL_NAME \
        --location=global
    
  2. 將要模擬的服務帳戶附加至 WIP,並指派 roles/iam.workloadIdentityUser 角色:

    gcloud iam service-accounts add-iam-policy-binding \
        DATA_COLLABORATOR_SERVICE_ACCOUNT_NAME@DATA_COLLABORATOR_PROJECT_ID.iam.gserviceaccount.com \
        --member="principalSet://iam.googleapis.com/projects/DATA_COLLABORATOR_PROJECT_NUMBER/locations/global/workloadIdentityPools/DATA_COLLABORATOR_POOL_NAME/*" \
        --role=roles/iam.workloadIdentityUser
    
  3. 在 WIP 中建立 OIDC 供應商,並在其中定義工作負載服務帳戶,以便模擬資料協作者服務帳戶:

    gcloud iam workload-identity-pools providers create-oidc attestation-verifier \
        --location=global \
        --workload-identity-pool=DATA_COLLABORATOR_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 == 'WORKLOAD_CONTAINER_IMAGE_DIGEST' \
    && 'WORKLOAD_SERVICE_ACCOUNT_NAME@WORKLOAD_OPERATOR_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts \
    && assertion.swname == 'CONFIDENTIAL_SPACE' \
    && 'STABLE' in assertion.submods.confidential_space.support_attributes"
    

    本範例使用下列值:

    • issuer-uri,也就是使用 Google Cloud Attestation 做為認證服務。https://confidentialcomputing.googleapis.com/

    • allowed-audienceshttps://sts.googleapis.com。這是 Google 的安全權杖服務,可將憑證換成存取權杖。

    • google.subjectattribute-mapping,值為 assertion.sub。這是 VM 執行個體的 selfLink,如認證權杖中的 sub 聲明所定義。

      每當工作負載存取資源時,VM 執行個體 selfLink 就會顯示在 Cloud Logging 中。

    • 以下 attribute-conditions 會形成認證政策。如果這些條件與工作負載的判斷結果相符,工作負載就能以聯盟身分存取資源:

      • assertion.submods.container.image_digest == 'WORKLOAD_CONTAINER_IMAGE_DIGEST': 確認工作負載容器映像檔摘要與預期值相符。

      • 'WORKLOAD_SERVICE_ACCOUNT_NAME@WORKLOAD_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts: 驗證附加至工作負載的服務帳戶是否與預期服務帳戶相符,然後使用該服務帳戶模擬資料協作者服務帳戶。

      • assertion.swname == 'CONFIDENTIAL_SPACE':驗證 Confidential Space 是否為 VM 上執行的軟體,並提供所有內建安全保障

      • 'STABLE' in assertion.submods.confidential_space.support_attributes: 確認使用的是正式版 Confidential Space 映像檔,且具有 STABLE 支援屬性

      如要瞭解更多可用的屬性條件,請參閱「建立認證政策」。

建立認證政策

建立 WIP 時,您需要建立認證政策。驗證實體的聲明必須符合政策規定,才能存取您的資料。

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

這些陳述式會使用 Confidential Space 映像檔、工作負載容器映像檔或 VM 執行個體的斷言做為變數,並以您指定的值做為運算式。舉例來說,以下政策會強制工作負載使用 Confidential Space,且必須使用 STABLE Confidential Space 映像檔,以及工作負載 VM 執行個體執行的區域必須為 us-central1-a

assertion.swname == 'CONFIDENTIAL_SPACE' \
&& 'STABLE' in assertion.submods.confidential_space.support_attributes" \
&& assertion.submods.gce.zone == "us-central1-a"

詳情請參閱認證聲明

認證聲明

下表詳細列出可用於建構認證政策的判斷。政策可驗證機密空間映像檔、工作負載容器和 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:只有這項屬性的映像檔已停止支援,且不再監控是否有安全漏洞。您必須自行承擔使用風險。
  • EXPERIMENTAL:如果圖片只有這項屬性,就會使用預覽功能。僅供測試,不得用於實際工作環境。EXPERIMENTAL 圖片絕不會有 LATESTSTABLEUSABLE 屬性。
範例

下列程式碼會驗證是否使用穩定版本的 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"

assertion.submods.nvidia_gpu.cc_mode

互動對象:

定義的字串

驗證 NVIDIA 機密運算驅動程式的狀態。 有效值如下:

  • OFF:NVIDIA 機密運算功能皆未啟用。
  • ON:NVIDIA H100 硬體、韌體和軟體已完全啟用機密運算功能。
  • DEVTOOLS:GPU 處於部分機密運算模式,與 ON 模式的工作流程相符,但會停用安全防護措施。
範例
assertion.submods.nvidia_gpu.cc_mode == "ON"