資料協作者必須設定下列資源,工作負載才能存取機密資料:
此外,資料協作者必須選擇 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 和供應商,請完成下列操作:
建立 WIP:
gcloud iam workload-identity-pools create DATA_COLLABORATOR_POOL_NAME \ --location=global
在 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-audiences
的https://sts.googleapis.com
。這是 Google 的安全權杖服務,可將憑證換成存取權杖。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
這個值是使用一般運算語言 (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
服務帳戶模擬
服務帳戶模擬方法包含下列步驟:
在每個資料協作者專案中建立服務帳戶,並授予解密機密資料的權限。
在每個資料協作者專案中建立 WIP,然後將剛建立的每個專案服務帳戶附加至 WIP。
在每個 WIP 中建立 WIP 提供者,將工作負載服務帳戶指定為允許模擬資料協作者服務帳戶的帳戶。
設定服務帳戶來解密機密資料
在資料協作者專案中建立服務帳戶:
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 和供應商,請在每個資料協作者專案中完成下列操作:
建立 WIP:
gcloud iam workload-identity-pools create DATA_COLLABORATOR_POOL_NAME \ --location=global
將要模擬的服務帳戶附加至 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
在 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-audiences
的https://sts.googleapis.com
。這是 Google 的安全權杖服務,可將憑證換成存取權杖。google.subject
的attribute-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 執行個體所做的聲明。
圖片聲明
斷言 | 類型 | 說明 |
---|---|---|
互動對象:
|
定義的字串 |
確認 Confidential Space 映像檔是偵錯或正式版。 有效值如下:
範例下列程式碼會驗證是否使用 Confidential Space 映像檔的偵錯版本:
下列程式碼會驗證是否使用 Confidential Space 映像檔的正式版:
|
assertion.submods.confidential_space.support_attributes |
字串陣列 |
驗證 TEE 的安全版本是否為正式版 Confidential Space 映像檔。偵錯機密空間映像檔未設定支援屬性。 支援的屬性有三種:
範例下列程式碼會驗證是否使用穩定版本的 Confidential Space 映像檔:
|
assertion.swname |
定義的字串 |
驗證認證實體執行的軟體。值一律為 範例
|
assertion.swversion |
字串陣列 |
驗證 Confidential Space 映像檔的軟體版本。建議改用 範例
|
容器斷言
斷言 | 類型 | 說明 |
---|---|---|
互動對象:
|
字串陣列 |
驗證工作負載映像檔中使用的 CMD 指令和參數。 範例下列程式碼會驗證工作負載映像檔的 CMD 是否遭到覆寫:
下列程式碼會驗證
|
互動對象:
|
JSON 物件 |
確認環境變數及其值已明確傳遞至容器。 範例下列程式碼會驗證環境變數
|
互動對象:
|
字串 |
確認工作負載運算子是否已覆寫容器中的環境變數。 範例下列程式碼會驗證工作負載運算子是否未覆寫
下列程式碼會驗證工作負載運算子是否覆寫任何環境變數:
|
assertion.submods.container.image_digest |
字串 |
驗證工作負載容器的映像檔摘要。指定這項條件後,多方就能同意授權工作負載存取資料。 範例
|
assertion.submods.container.image_id |
字串 |
驗證工作負載容器的映像檔 ID。 範例
|
互動對象:
|
字串 |
驗證在 Confidential Space 映像檔上執行的工作負載容器位置。 範例
|
互動對象:
|
JSON 物件 |
驗證圖片是否具有特定簽章,或是否由公開金鑰和簽章演算法簽署。指定這項條件後,多方就能同意授權工作負載存取資料。 判斷可包含下列元素:
範例
|
互動對象:
|
定義的字串 |
驗證容器啟動器的重新啟動政策,以瞭解工作負載停止時的行為。 有效值如下:
範例
|
VM 聲明
斷言 | 類型 | 說明 |
---|---|---|
互動對象:
|
字串陣列 |
確認指定服務帳戶已連線至執行工作負載的 VM,或已使用 VM 中繼資料的 範例
|
assertion.hwmodel |
字串 |
驗證基礎機密運算技術。支援的平台如下:
範例
|
互動對象:
|
布林值 |
驗證認證實體的監控狀態。 範例
|
assertion.submods.gce.instance_id |
字串 |
驗證 VM 執行個體 ID。 範例
|
assertion.submods.gce.instance_name |
字串 |
驗證 VM 執行個體的名稱。 範例
|
assertion.submods.gce.project_id |
字串 |
驗證 VM 執行的 Google Cloud 專案是否具有指定的專案 ID。 範例
|
assertion.submods.gce.project_number |
字串 |
驗證 VM 是否在具有指定專案編號的 Google Cloud 專案中執行。 範例
|
互動對象:
|
字串 |
確認 VM 是否在指定區域中執行。 範例
|
互動對象:
|
定義的字串 |
驗證 NVIDIA 機密運算驅動程式的狀態。 有效值如下:
範例
|