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

1. 總覽

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

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

軟硬體需求

課程內容

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

在本程式碼研究室中,您將在 Primus 和 Secundus 銀行之間設定機密空間,以便在不互相分享完整帳戶清單的情況下,找出共同客戶。其中包含下列步驟:

  • 步驟 1:為 Primus 和 Secundus 銀行設定必要的雲端資源。這些雲端資源包括雲端儲存空間 bucket、KMS 金鑰、工作負載身分集區,以及 Primus 和 Secundus Bank 的服務帳戶。Primus Bank 和 Secundus Bank 將客戶資料儲存在 Cloud Storage 值區中,並使用 Cloud Key Management Service 金鑰加密資料。
  • 步驟 2:建立工作負載服務帳戶,供工作負載 VM 使用。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 會是資料協作者和工作負載作者,負責將加密的客戶名單提供給 Confidential Space 中執行的工作負載。Secundus Bank 是工作負載運算子,會在 Confidential Space 中執行工作負載。
  • 步驟 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>
  • 為專案啟用帳單
  • 兩個專案啟用 Confidential Computing API 和下列 API。
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 專案中對應的現有雲端資源。如未設定變數,系統會根據專案名稱產生雲端資源名稱,並在下列項目中建立新的雲端資源:

$PRIMUS_INPUT_STORAGE_BUCKET

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

$PRIMUS_WORKLOAD_IDENTITY_POOL

Primus Bank 的 Workload Identity Pool (WIP),用於驗證聲明。

$PRIMUS_WIP_PROVIDER

Primus Bank 的 Workload Identity Pool 提供者,其中包含授權條件,可用於 Attestation Verifier Service 簽署的權杖。

$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 建立加密金鑰的 KMS 金鑰環。$PRIMUS_ENC_KEY

$PRIMUS_ARTIFACT_REPOSITORY

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

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

$SECUNDUS_INPUT_STORAGE_BUCKET

儲存 Secundus Bank 顧客數位資料檔案的 bucket

$SECUNDUS_WORKLOAD_IDENTITY_POOL

Secundus Bank 的 Workload Identity Pool (WIP),用於驗證聲明。

$SECUNDUS_WIP_PROVIDER

Secundus Bank 的 Workload Identity Pool 提供者,其中包含授權條件,可用於 Attestation Verifier Service 簽署的權杖。

$SECUNDUS_SERVICE_ACCOUNT

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

$SECUNDUS_ENC_KEY

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

$SECUNDUS_ENC_KEYRING

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

$SECUNDUS_RESULT_STORAGE_BUCKET

儲存工作負載結果的 bucket。

$WORKLOAD_IMAGE_NAME

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

$WORKLOAD_IMAGE_TAG

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

$WORKLOAD_SERVICE_ACCOUNT

有權存取執行工作負載的 Confidential VM 的服務帳戶。

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

為 Primus Bank 設定雲端資源

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

  • Cloud Storage bucket ($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 bucket 讀取資料 (使用 objectViewer 角色),以及將服務帳戶連結至工作負載身分集區 (使用 roles/iam.workloadIdentityUser)。
./setup_primus_bank_resources.sh

為 Secundus Bank 設定雲端資源

Secundus Bank 需要下列雲端資源。執行這個指令碼,設定 Secundus Bank 資源。按照下列步驟操作時,系統會建立下列資源:

  • Cloud Storage bucket ($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 角色)、從 Cloud Storage 值區讀取資料 (使用 objectViewer 角色),以及將服務帳戶連結至工作負載身分集區 (使用 roles/iam.workloadIdentityUser 角色)。
  • Cloud Storage bucket ($SECUNDUS_RESULT_STORAGE_BUCKET),用於儲存 Secundus Bank 執行工作負載的結果。
./setup_secundus_bank_resources.sh

3. 建立工作負載

建立工作負載服務帳戶

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

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

  • confidentialcomputing.workloadUser 角色授予工作負載服務帳戶。這樣使用者帳戶就能產生認證權杖。
  • logging.logWriter 角色授予工作負載服務帳戶權限。這項設定可讓 Confidential Space 環境將記錄寫入 Cloud Logging 和序列控制台,因此 VM 終止後仍可存取記錄。
  • objectViewer,從 $PRIMUS_INPUT_STORAGE_BUCKET 雲端儲存空間值區讀取資料。
  • objectViewer,從 $SECUNDUS_INPUT_STORAGE_BUCKET 雲端儲存空間值區讀取資料。
  • objectAdmin,將工作負載結果寫入 $SECUNDUS_RESULT_STORAGE_BUCKET 雲端儲存空間 bucket。
./create_workload_service_account.sh

建立工作負載

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

  • 計算指定地理位置的顧客人數。
  • 從各自雲端儲存空間 bucket 中儲存的顧客名單,找出 Primus 和 Secundus Bank 的共同顧客。

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

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

4. 授權並執行工作負載

授權工作負載

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

  • 內容:已驗證的代碼
  • 地點:安全無虞的環境
  • 對象:值得信賴的運算子

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

您可以透過 Workload Identity 聯盟指定屬性條件。這些條件會限制哪些身分可以透過workload identity pool (WIP) 進行驗證。您可以將 Attestation Verifier Service 新增至 WIP,做為工作負載身分集區供應商,以便呈現測量結果及強制執行政策。

您稍早已在設定雲端資源的步驟中建立 workload identity pool。現在,Primus Bank 會建立新的 OIDC 工作負載身分集區提供者。指定的 --attribute-condition 會授權存取工作負載容器。它需要:

  • 內容:最新 $WORKLOAD_IMAGE_NAME 已上傳至 $PRIMUS_ARTIFACT_REPOSITORY 存放區。
  • 位置:Confidential Space 受信任執行環境在完全支援的 Confidential Space 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 也想根據下列條件授權工作負載存取客戶資料:

  • 內容:工作負載。
  • 地點:機密空間環境。
  • 對象:執行工作負載的帳戶 ($WORKLOAD_SERVICE_ACCOUNT)。

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

相較之下,Secundus Bank 無法控管圖片來源的存放區,因此無法安全地做出這項假設。而是根據工作負載的 image_digest 選擇授權存取權。與 image_reference 不同,Primus Bank 可以變更 image_digest,指向其他圖片,但 Primus Bank 無法讓 image_digest 參照 Secundus Bank 在先前步驟稽核的圖片以外的圖片。

建立 workload identity pool 提供者之前,我們會收集工作負載容器映像檔的 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 會在 Confidential Space 執行工作負載。這項工作負載會從 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 分鐘,工作負載就會完成執行,結果也會顯示在 Cloud Storage 值區中。

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 分鐘,工作負載就會完成執行,結果也會顯示在 Cloud Storage 值區中。

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 Pool 提供者

$PRIMUS_PROJECT_ID 中,更新 Attestation Verifier 身分提供者的屬性條件,授權新位置的工作負載。

  1. 將專案設為 $PRIMUS_PROJECT_ID。
gcloud config set project $PRIMUS_PROJECT_ID
  1. 使用下列指令匯出 Tertius Bank 的 GCP 專案 ID。Primus Bank 稍後會使用這項資訊,更新工作負載身分集區提供者的屬性條件。Primus 銀行不會停止授權 Secundus 銀行工作負載服務帳戶。現在允許 Tertius Bank 工作負載服務帳戶。
export TERTIUS_PROJECT_ID=<GCP project-id of Tertius Bank>
  1. 更新 workload identity pool 中的 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 bucket ($PRIMUS_INPUT_STORAGE_BUCKET))。
  • Primus Bank 的服務帳戶 ($PRIMUS_SERVICE_ACCOUNT)。
  • Primus Bank 的構件登錄檔,其中包含映像檔簽章 ($PRIMUS_COSIGN_REPOSITORY)。
  • Primus Bank 的 workload identity pool($PRIMUS_WORKLOAD_IDENTITY_POOL)。
  • Secundus Bank 的工作負載服務帳戶 ($WORKLOAD_SERVICE_ACCOUNT)。
  • Secundus Bank 的輸入 Cloud Storage bucket ($SECUNDUS_INPUT_STORAGE_BUCKET))。
  • Secundus Bank 的服務帳戶 ($SECUNDUS_SERVICE_ACCOUNT)。
  • Secundus Bank 的構件登錄檔,其中包含映像檔簽章 ($SECUNDUS_COSIGN_REPOSITORY)。
  • Secundus Bank 的 workload identity pool($SECUNDUS_WORKLOAD_IDENTITY_POOL)。
  • Secundus Bank 的工作負載服務帳戶 ($WORKLOAD_SERVICE_ACCOUNT)。
  • 工作負載運算執行個體。
  • Secundus Bank 的結果儲存空間 bucket ($SECUNDUS_RESULT_STORAGE_BUCKET)。
  • Primus Bank 的構件存放區 ($PRIMUS_ARTIFACT_REPOSITORY)。
./cleanup.sh

探索完畢後,請考慮刪除專案。

  • 前往 Cloud Platform Console
  • 選取要關閉的專案,然後按一下頂端的「刪除」,系統就會排定刪除專案的時間。

恭喜

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

您瞭解如何使用 Confidential Space,在確保共用資料安全無虞的同時,維持資料機密性。

後續步驟

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

其他資訊