以機密空間保護共用資料的安全

1. 總覽

Confidential Space 提供安全的多方資料分享和協作功能,同時讓機構保有資料的機密性。也就是說,機構可以彼此協同合作,同時維持資料的控管權,並防止資料遭到未經授權的存取。

在 Confidential Space 中,您可以匯總及分析機密資料 (通常受監管),同時保有資料的完全控制權,進而獲得雙贏的局面。有了 Confidential Space,機構就能匯總及分析機密資料來獲得價值,讓雙方都受益,同時保有資料的完全控制權,例如個人識別資訊 (PII)、受保護的健康資訊 (PHI)、智慧財產和加密密鑰。

軟硬體需求

課程內容

  • 如何設定執行機密空間所需的雲端資源
  • 如何在執行機密空間 VM 映像檔的機密 VM 中執行工作負載
  • 如何根據工作負載程式碼的屬性 (what)、機密空間環境 (where) 和執行工作負載的帳戶 (who),授權存取受保護的資源。

在這個程式碼研究室中,您將為 Primus 和 Secundus Bank 之間建立機密空間,以便找出兩者共同的客戶,而無須彼此分享完整的帳戶清單。其中包含下列步驟:

  • 步驟 1:為 Primus 和 Secundus 銀行設定必要的雲端資源。這些雲端資源包括雲端儲存值區、KMS 金鑰、工作負載身分集區,以及 Primus 和 Secundus 銀行的服務帳戶。Primus Bank 和 Secundus Bank 會將客戶資料儲存在 Cloud Storage 值區中,並使用 Cloud Key Management Service 金鑰加密資料。
  • 步驟 2:建立工作負載 VM 將使用的 workload 服務帳戶。負責管理工作負載的 Secundus Bank 會啟動工作負載 VM。Primus Bank 會編寫工作負載程式碼。
  • 步驟 3:建立工作負載,其中包含兩個 CLI 指令,一個用於計算指定位置的客戶人數,另一個用於找出 Primus 和 Secundus Bank 的共同客戶。Primus Bank 會編寫工作負載,並將其封裝為 Docker 映像檔。這個 Docker 映像檔會發布至 Artifact Registry
  • 步驟 4:授權工作負載。Primus Bank 會使用工作負載身分集區,根據執行工作負載的使用者、工作負載的功能和執行工作負載的位置等屬性,授權工作負載存取客戶資料。
  • 步驟 5:工作負載執行時,會透過提供含有工作負載和環境宣告的 Attestation Verifier 服務權杖,要求存取資料合作夥伴 (Primus Bank 和 Secundus Bank) 的雲端資源。如果憑證中的測量工作負載要求與 Primus 和 Secundus 銀行工作負載身分集區中的屬性條件相符,則會傳回具有存取相應雲端資源權限的服務帳戶存取權杖。只有在 Confidential Space 中執行的工作負載可以存取雲端資源。
  • 步驟 5(a):執行第一個工作負載,計算特定地區的 Primus Bank 客戶人數。對於這個工作負載,Primus Bank 會是資料協作者和工作負載作者,會將加密的客戶名單提供給在機密空間中執行的工作負載。Secundus Bank 會成為工作負載作業管理員,並在機密空間中執行工作負載。
  • 步驟 5(b):執行第二個工作負載,找出 Primus 和 Secundus 銀行的共同客戶。對於這項工作負載,Primus Bank 和 Secundus Bank 都是資料協作者。他們會將已加密的客戶名單提供給在 Confidential Space 中執行的工作負載。Secundus Bank 再次成為工作負載運算子。這項工作負載也需要取得 Secundus Bank 的授權,因為它需要存取 Secundus Bank 的加密客戶名單,才能找出共同客戶。在這種情況下,Secundus Bank 會根據執行工作負載的人員、工作負載的功能,以及工作負載執行的位置等屬性,授權工作負載存取客戶資料,如 Primus Bank 在步驟 4 所述。

fdef93a6868a976.png

2. 設定雲端資源

事前準備

  • 使用下列指令複製 這個存放區,取得用於本程式碼研究室的必要指令碼。
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
  • 變更這個程式碼研究室的目錄。
cd confidential-space/codelabs/bank_data_analysis_codelab/scripts
  • 請確認您已設定必要的專案環境變數,如下所示。如要進一步瞭解如何建立 GCP 專案,請參閱 這個程式碼研究室。您可以參考這篇文章,瞭解如何擷取專案 ID,以及專案 ID 與專案名稱和專案編號的差異。
export PRIMUS_PROJECT_ID=<GCP project id of Primus bank>
export SECUNDUS_PROJECT_ID=<GCP project id of Secundus bank>
gcloud services enable \
    cloudapis.googleapis.com \
    cloudkms.googleapis.com \
    cloudresourcemanager.googleapis.com \
    cloudshell.googleapis.com \
    container.googleapis.com \
    containerregistry.googleapis.com \
    iam.googleapis.com \
    confidentialcomputing.googleapis.com
  • 請使用這個指令,為資源名稱設定變數,如下所述。您可以使用這些變數 (例如 export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket') 覆寫資源名稱
  • 您可以使用 Primus 專案中現有的雲端資源名稱設定下列變數。如果變數已設好,系統會使用 Primus 專案中對應的現有雲端資源。如果未設定變數,系統會根據 project-name 產生雲端資源名稱,並在下列項目中建立新的雲端資源:

$PRIMUS_INPUT_STORAGE_BUCKET

儲存 Primus Bank 客戶資料檔案的值區。

$PRIMUS_WORKLOAD_IDENTITY_POOL

Primus Bank 用來驗證要求的工作負載身分集區 (WIP)。

$PRIMUS_WIP_PROVIDER

Primus Bank 的工作負載身分集區提供者,其中包含授權條件,可用於由認證驗證服務簽署的權杖。

$PRIMUS_SERVICE_ACCOUNT

Primus Bank 的服務帳戶,$PRIMUS_WORKLOAD_IDENTITY_POOL 會使用這個帳戶存取受保護的資源。在這個步驟中,它有權查看儲存在 $PRIMUS_INPUT_STORAGE_BUCKET 儲存桶中的客戶資料。

$PRIMUS_ENC_KEY

用於為 Primus Bank 加密 $PRIMUS_INPUT_STORAGE_BUCKET 中儲存的資料的 KMS 金鑰。

$PRIMUS_ENC_KEYRING

用於為 Primus Bank 建立加密金鑰 $PRIMUS_ENC_KEY 的 KMS 金鑰環。

$PRIMUS_ARTIFACT_REPOSITORY

工作負載 Docker 映像檔將推送至的構件存放區。

  • 您可以使用 Secundus 專案中現有的雲端資源名稱設定下列變數。如果變數已設定,系統就會使用 Secundus 專案中對應的現有雲端資源。如果未設定變數,系統會根據專案名稱產生雲端資源名稱,並在以下情況下建立新的雲端資源:

$SECUNDUS_INPUT_STORAGE_BUCKET

儲存 Secundus Bank 客戶資料檔案的值區

$SECUNDUS_WORKLOAD_IDENTITY_POOL

驗證要求的 Secundus Bank Workload Identity Pool (WIP)。

$SECUNDUS_WIP_PROVIDER

Secundus Bank 的 Workload Identity Pool 提供者,其中包含授權條件,可用於由驗證服務簽署的權杖。

$SECUNDUS_SERVICE_ACCOUNT

$SECUNDUS_WORKLOAD_IDENTITY_POOL 用來存取受保護資源的 Secundus Bank 服務帳戶。在這個步驟中,它有權查看儲存在 $SECUNDUS_INPUT_STORAGE_BUCKET 儲存桶中的客戶資料。

$SECUNDUS_ENC_KEY

用於加密 Secundus Bank 在 $SECUNDUS_INPUT_STORAGE_BUCKET 中儲存的資料的 KMS 金鑰。

$SECUNDUS_ENC_KEYRING

用於為 Secundus Bank 建立加密金鑰 $SECUNDUS_ENV_KEY 的 KMS 金鑰環。

$SECUNDUS_RESULT_STORAGE_BUCKET

儲存工作負載結果的值區。

$WORKLOAD_IMAGE_NAME

工作負載容器映像檔名稱。

$WORKLOAD_IMAGE_TAG

工作負載容器映像檔的標記。

$WORKLOAD_SERVICE_ACCOUNT

服務帳戶具備執行工作負載的機密 VM 存取權。

  • 本程式碼研究室中會使用一些構件,如下所述:
  • primus_customer_list.csv:包含 Primus Bank 客戶資料的檔案。這裡是本程式碼研究室使用的範例檔案。
  • secundus_customer_list.csv:包含 Secundus Bank 客戶資料的檔案。這裡是本程式碼研究室使用的範例檔案。
  • 您必須具備這兩個專案的特定權限:
  • 針對 $PRIMUS_PROJECT_ID,您需要具備 Cloud KMS 管理員、儲存空間管理員、Artifact Registry 管理員、服務帳戶管理員、IAM Workload Identity 集區管理員。
  • 針對 $SECUNDUS_PROJECT_ID,您需要具備 Compute 管理員、儲存空間管理員、服務帳戶管理員、Cloud KMS 管理員、IAM Workload Identity 集區管理員、安全性管理員 (選用)。
  • 執行下列指令碼,將剩餘的變數名稱設為資源名稱的值,並根據專案 ID 進行設定。
source config_env.sh

為 Primus Bank 設定雲端資源

Primus Bank 需要下列雲端資源。執行這個指令碼,為 Primus Bank 設定資源:

  • Cloud Storage 值區 ($PRIMUS_INPUT_STORAGE_BUCKET),用於儲存 Primus Bank 的加密客戶資料檔案。
  • KMS 中的加密金鑰 ($PRIMUS_ENC_KEY) 和密鑰環 ($PRIMUS_ENC_KEYRING),用於加密 Primus Bank 的客戶資料檔案。
  • Workload Identity Pool ($PRIMUS_WORKLOAD_IDENTITY_POOL),可根據提供者下所設定的屬性條件驗證要求。
  • 已連結至上述工作負載身分集區 ($PRIMUS_WORKLOAD_IDENTITY_POOL) 的服務帳戶 ($PRIMUS_SERVICE_ACCOUNT) 可使用 KMS 金鑰解密資料 (使用 roles/cloudkms.cryptoKeyDecrypter 角色)、讀取 Cloud Storage 值區的資料 (使用 objectViewer 角色),以及將服務帳戶連結至工作負載身分集區 (使用 roles/iam.workloadIdentityUser)。
./setup_primus_bank_resources.sh

為 Secundus Bank 設定雲端資源

對於 Secundus Bank,您需要下列雲端資源。執行這個指令碼,設定 Secundus Bank 資源。在這個步驟中,系統會建立下列資源:

  • Cloud Storage 值區 ($SECUNDUS_INPUT_STORAGE_BUCKET),用於儲存 Secundus Bank 的加密客戶資料檔案。
  • KMS 中的加密金鑰 ($SECUNDUS_ENC_KEY) 和密鑰圈 ($SECUNDUS_ENC_KEYRING),用於加密 Secundus Bank 的資料檔案。
  • Workload Identity Pool ($SECUNDUS_WORKLOAD_IDENTITY_POOL),可根據提供者下所設定的屬性條件驗證要求。
  • 已連結至上述工作負載身分識別資料集區 ($SECUNDUS_WORKLOAD_IDENTITY_POOL) 的服務帳戶 ($SECUNDUS_SERVICE_ACCOUNT) 可使用 KMS 金鑰 (使用 roles/cloudkms.cryptoKeyDecrypter 角色) 解密資料、讀取雲端儲存值區的資料 (使用 objectViewer 角色),以及將服務帳戶連結至工作負載身分識別資料集區 (使用 roles/iam.workloadIdentityUser 角色)。
  • Cloud Storage 值區 ($SECUNDUS_RESULT_STORAGE_BUCKET),用於儲存 Secundus Bank 執行工作負載的結果。
./setup_secundus_bank_resources.sh

3. 建立工作負載

建立工作負載服務帳戶

接下來,您將為工作負載建立服務帳戶,並設定下列必要的角色和權限。執行下列指令碼,即可在 Secundus Bank 專案中建立工作負載服務帳戶。執行工作負載的 VM 會使用這個服務帳戶。

這個工作負載服務帳戶 ($WORKLOAD_SERVICE_ACCOUNT) 將具備下列角色:

  • confidentialcomputing.workloadUser 角色授予工作負載服務帳戶。這可讓使用者帳戶產生認證權杖。
  • logging.logWriter 角色指派給工作負載服務帳戶權限。這樣一來,機密空間環境就能將記錄寫入 Cloud Logging 和序列控制台,讓您在 VM 終止後也能存取記錄。
  • objectViewer 可讀取 $PRIMUS_INPUT_STORAGE_BUCKET Cloud Storage 值區中的資料。
  • objectViewer 可讀取 $SECUNDUS_INPUT_STORAGE_BUCKET Cloud Storage 值區中的資料。
  • objectAdmin 將工作負載結果寫入 $SECUNDUS_RESULT_STORAGE_BUCKET Cloud Storage 值區。
./create_workload_service_account.sh

建立工作負載

在這個步驟中,您將為本程式碼研究室中使用的負載建立 Docker 映像檔。工作負載是簡單的 GoLang 應用程式,其功能如下:

  • 計算指定地理區域內的顧客人數。
  • 從 Primus 和 Secundus Bank 各自的雲端儲存空間值區中,找出兩家銀行的共同客戶。

執行下列指令碼,建立工作負載,並執行下列步驟:

  • 建立 Primus Bank 擁有的 Artifact Registry ($PRIMUS_ARTIFACT_REPOSITORY),用於發布工作負載。
  • 產生程式碼,並使用必要的資源名稱更新程式碼。您可以在這裡找到本程式碼研究室中使用的負載程式碼。
  • 建構程式碼,並將其封裝至 Docker 映像檔。如需對應的 Dockerfile,請參閱這篇文章
  • 將 Docker 映像檔發布至 Primus Bank 擁有的 Artifact Registry ($PRIMUS_ARTIFACT_REGISTRY)。
  • 授予服務帳戶 $WORKLOAD_SERVICE_ACCOUNT 對 Artifact Registry ($PRIMUS_ARTIFACT_REGISTRY) 的讀取權限。
./create_workload.sh

4. 授權並執行工作負載

授權工作負載

Primus Bank 希望授權工作負載,根據下列資源的屬性存取客戶資料:

  • What:已驗證的程式碼
  • 地點:安全的環境
  • Who:可信任的運算子

Primus 會使用 Workload Identity 聯盟,根據這些規定強制執行存取權政策。

您可以透過 Workload Identity 聯盟指定屬性條件。這些條件會限制哪些身分可以透過工作負載身分集區 (WIP) 進行驗證。您可以將認證驗證服務新增至 WIP,做為工作負載身分集區供應商,以呈現評估結果並強制執行政策。

在雲端資源設定步驟中,我們已先建立 Workload Identity 集區。Primus Bank 會建立新的 OIDC 工作負載身分集區提供者。指定的 --attribute-condition 會授予工作負載容器的存取權。它需要:

  • 內容:最新的 $WORKLOAD_IMAGE_NAME 已上傳至 $PRIMUS_ARTIFACT_REPOSITORY 存放區。
  • 適用範圍:在受全面支援的機密空間 VM 映像檔上執行機密空間受信任執行環境。
  • :Secundus Bank $WORKLOAD_SERVICE_ACCOUNT 服務帳戶。
gcloud config set project $PRIMUS_PROJECT_ID
gcloud iam workload-identity-pools providers create-oidc $PRIMUS_WIP_PROVIDER \
  --location="global" \
  --workload-identity-pool="$PRIMUS_WORKLOAD_IDENTITY_POOL" \
  --issuer-uri="https://confidentialcomputing.googleapis.com/" \
  --allowed-audiences="https://sts.googleapis.com" \
  --attribute-mapping="google.subject='assertion.sub'" \
  --attribute-condition="assertion.swname == 'CONFIDENTIAL_SPACE' && 
   'STABLE' in assertion.submods.confidential_space.support_attributes &&
   assertion.submods.container.image_reference == 'us-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG' && 
'$WORKLOAD_SERVICE_ACCOUNT@$SECUNDUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"

與為 Primus Bank 建立的 WIP 類似,Secundus Bank 也想根據以下條件授權工作負載存取客戶資料:

  • 內容:工作負載。
  • 位置:機密空間環境。
  • Who:執行工作負載的帳戶 ($WORKLOAD_SERVICE_ACCOUNT)。

Primus Bank 會使用包含圖片標記的 image_reference 權利要求,判斷是否應授權存取權。他們會控管遠端存放區,因此可以確保只標記不會洩漏資料的圖片。

相較之下,Secundus Bank 無法控制取得圖片的存放區,因此無法安全地做出這項假設。而是選擇根據工作負載的 image_digest 授權存取權。與 image_reference 不同,Primus Bank 無法變更 image_digest 指向其他圖片,只能指向 Secundus Bank 在前一個步驟中檢查的圖片。

在建立工作負載身分集區提供者之前,我們會收集工作負載容器映像檔的 image_digest,並用於提供者的屬性條件。

export WORKLOAD_IMAGE_DIGEST=$(gcloud artifacts docker images describe ${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG  --format="value(image_summary.digest)" --project ${PRIMUS_PROJECT_ID})
gcloud config set project $SECUNDUS_PROJECT_ID
gcloud iam workload-identity-pools providers create-oidc $SECUNDUS_WIP_PROVIDER \
  --location="global" \
  --workload-identity-pool="$SECUNDUS_WORKLOAD_IDENTITY_POOL" \
  --issuer-uri="https://confidentialcomputing.googleapis.com/" \
  --allowed-audiences="https://sts.googleapis.com" \
  --attribute-mapping="google.subject='assertion.sub'" \
  --attribute-condition="assertion.swname == 'CONFIDENTIAL_SPACE' && 
'STABLE' in assertion.submods.confidential_space.support_attributes && 
assertion.submods.container.image_digest == '${WORKLOAD_IMAGE_DIGEST}' &&
 assertion.submods.container.image_reference == '${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG' && 
'$WORKLOAD_SERVICE_ACCOUNT@$SECUNDUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"

執行工作負載

在這個步驟中,Secundus Bank 會在機密空間中執行工作負載。這個工作負載會從 Primus 和 Secundus 的工作負載身分集區取得存取權權杖,分別讀取及解密 Primus Bank 和 Secundus Bank 的客戶資料。

系統會使用中繼資料標記傳遞必要的 TEE 引數。工作負載容器的引數會透過旗標的「tee-cmd」部分傳遞。工作負載執行結果會發布至 $SECUNDUS_RESULT_STORAGE_BUCKET

執行第一個工作負載

在執行第一個工作負載時,工作負載會從工作負載容器引數中提供的位置計算 Primus Bank 的客戶。如以下所示,第一個工作負載會執行「count-location」指令,結果會儲存在 $SECUNDUS_RESULT_STORAGE_BUCKET/seattle-result

gcloud compute instances create ${WORKLOAD_VM1} \
 --project=${SECUNDUS_PROJECT_ID} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=MIGRATE \
 --scopes=cloud-platform \
 --zone=${SECUNDUS_PROJECT_ZONE} \
 --image-project=confidential-space-images \
 --image-family=confidential-space \
--service-account=${WORKLOAD_SERVICE_ACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com \
 --metadata "^~^tee-image-reference=${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}~tee-restart-policy=Never~tee-cmd="[\"count-location\",\"Seattle\",\"gs://${SECUNDUS_RESULT_STORAGE_BUCKET}/seattle-result\"]""

查看結果

在 Secundus 專案中,查看第一個工作負載的結果。等待 3 到 5 分鐘,讓工作負載完成執行,並在雲端儲存空間值區中顯示結果。

gcloud config set project $SECUNDUS_PROJECT_ID
gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/seattle-result

結果應為 3,因為這是 primus_customer_list.csv 檔案中列出的西雅圖居民人數!

執行第二個工作負載

在執行第二項工作負載時,我們會找出 Primus Bank 和 Secundus Bank 的共同客戶。如以下所示,第二個工作負載會執行「list-common-customers」指令,結果會儲存在 $SECUNDUS_RESULT_STORAGE_BUCKET/list-common-count 中。

gcloud compute instances create ${WORKLOAD_VM2} \
 --project=${SECUNDUS_PROJECT_ID} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=MIGRATE \
 --scopes=cloud-platform \
 --zone=${SECUNDUS_PROJECT_ZONE} \
 --image-project=confidential-space-images \
 --image-family=confidential-space \
--service-account=${WORKLOAD_SERVICE_ACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com \
  --metadata "^~^tee-image-reference=${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}~tee-restart-policy=Never~tee-cmd="[\"list-common-customers\",\"gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result\"]""

查看結果

在 Secundus 專案中,查看第二個工作負載的結果。等待 3 到 5 分鐘,讓工作負載完成執行,並在雲端儲存空間值區中顯示結果。

gcloud config set project $SECUNDUS_PROJECT_ID
gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result

結果應為以下清單,因為這些是 Primus 和 Secundus Bank 之間的共同客戶。

輸出:

Eric
Clinton
Ashley
Cooper

執行未授權的工作負載

Primus Bank 的合約到期,該合約允許 Secundus Bank 存取其資料。因此,Primus Bank 更新了屬性條件,允許使用新合作夥伴 Tertius Bank 的服務帳戶建立 VM。

Primus Bank 修改 Workload Identity 集區提供者

$PRIMUS_PROJECT_ID 中,更新認證驗證人身分驗證器提供者的屬性條件,以便在新的地點授權工作負載。

  1. 將專案設為 $PRIMUS_PROJECT_ID。
gcloud config set project $PRIMUS_PROJECT_ID
  1. 使用下列指令匯出 Tertius Bank 的 GCP 專案 ID。之後,Primus Bank 會使用這個值更新工作負載身分集區提供者的屬性條件。Primus 銀行不會停止授權 Secundus Bank 工作負載服務帳戶。現已開放 Tertius Bank 工作負載服務帳戶。
export TERTIUS_PROJECT_ID=<GCP project-id of Tertius Bank>
  1. 更新工作負載身分集區中的 OIDC 提供者。此處的 '$WORKLOAD_SERVICE_ACCOUNT@$SECUNDUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts 已變更為 '$WORKLOAD_SERVICE_ACCOUNT@$TERTIUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts.,現在系統將授權 Tertius Bank 的負載服務帳戶,而非授權 Secundus Bank 的負載服務帳戶。
gcloud iam workload-identity-pools providers update-oidc $PRIMUS_WIP_PROVIDER \
  --location="global" \
  --workload-identity-pool="$PRIMUS_WORKLOAD_IDENTITY_POOL" \
  --issuer-uri="https://confidentialcomputing.googleapis.com/" \
  --allowed-audiences="https://sts.googleapis.com" \
  --attribute-mapping="google.subject='assertion.sub'" \
  --attribute-condition="assertion.swname == 'CONFIDENTIAL_SPACE' && 
   'STABLE' in assertion.submods.confidential_space.support_attributes &&
   assertion.submods.container.image_reference == '${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG' && 
'$WORKLOAD_SERVICE_ACCOUNT@$TERTIUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"

重新執行工作負載

當 Secundus Bank 嘗試執行原始工作負載時,會失敗。如要查看錯誤,請刪除原始結果檔案和 VM 執行個體,然後再次嘗試執行工作負載。

刪除現有結果檔案和 VM 執行個體

  1. 將專案設為 $SECUNDUS_PROJECT_ID 專案。
gcloud config set project $SECUNDUS_PROJECT_ID
  1. 刪除結果檔案。
gsutil rm gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result
  1. 刪除機密 VM 執行個體。
gcloud compute instances delete ${WORKLOAD_VM2} --zone=${SECUNDUS_PROJECT_ZONE}

執行未授權的工作負載:

gcloud compute instances create ${WORKLOAD_VM2} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=MIGRATE \
 --scopes=cloud-platform \
 --zone=${SECUNDUS_PROJECT_ZONE}\
 --image-project=confidential-space-images \
 --image-family=confidential-space \
--service-account=${WORKLOAD_SERVICE_ACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com \
 --metadata "^~^tee-image-reference=${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}~tee-restart-policy=Never~tee-cmd="[\"list-common-customers\",\"gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result\"]""

查看錯誤

您會看到錯誤訊息 (The given credential is rejected by the attribute condition),而非工作負載的結果。

gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result

同樣地,如果 Primus Bank 秘密修改工作負載,將 Secundus Bank 的整個客戶名單傳送至 Primus Bank 擁有的資料集,由於惡意工作負載的摘要與 Secundus Bank 的工作負載身分池中授權的圖片摘要不同,因此這項嘗試會失敗。

5. 清除

這裡提供的程式碼可用於清除我們在本程式碼研究室中建立的資源。在本次清理作業中,系統會刪除下列資源:

  • Primus Bank 的輸入 Cloud Storage 值區 ($PRIMUS_INPUT_STORAGE_BUCKET))。
  • Primus Bank 的服務帳戶 ($PRIMUS_SERVICE_ACCOUNT)。
  • Primus Bank 的構件登錄檔,其中儲存了映像檔簽章 ($PRIMUS_COSIGN_REPOSITORY)。
  • Primus Bank($PRIMUS_WORKLOAD_IDENTITY_POOL) 的工作負載身分集區。
  • Secundus Bank ($WORKLOAD_SERVICE_ACCOUNT) 的工作負載服務帳戶。
  • 輸入 Secundus Bank 的 Cloud Storage 值區 ($SECUNDUS_INPUT_STORAGE_BUCKET))。
  • Secundus Bank ($SECUNDUS_SERVICE_ACCOUNT) 的服務帳戶。
  • 保存映像檔簽章 ($SECUNDUS_COSIGN_REPOSITORY) 的 Secundus Bank 構件登錄。
  • Secundus Bank($SECUNDUS_WORKLOAD_IDENTITY_POOL) 的工作負載身分集區。
  • Secundus Bank ($WORKLOAD_SERVICE_ACCOUNT) 的工作負載服務帳戶。
  • 工作負載運算執行個體。
  • Secundus Bank 的結果儲存值區 ($SECUNDUS_RESULT_STORAGE_BUCKET)。
  • Primus Bank 的構件存放區 ($PRIMUS_ARTIFACT_REPOSITORY)。
./cleanup.sh

如果您已完成探索,請考慮刪除專案。

  • 前往 Cloud Platform Console
  • 選取要關閉的專案,然後按一下頂端的「刪除」:這會排定專案的刪除作業。

恭喜

恭喜,您已順利完成本程式碼研究室!

您已瞭解如何使用機密空間,在保護共用資料機密性的同時確保資料安全。

後續步驟

查看一些類似的程式碼研究室…

其他資訊