已簽署容器映像檔程式碼研究室

1. 總覽

本程式碼研究室是建立在「Confidential Space 程式碼研究室」之上。已簽署的容器映像檔支援選項,可使用已認證的公開金鑰驗證容器,而非在 Workload Identity Pool (WIP) 政策中指定映像檔摘要。

Confidential Space 中已簽署容器映像檔支援功能的變更:

提升可用性:隨著簽署容器映像檔功能推出,我們現在可以從工作負載映像檔摘要方法,改為使用容器簽名方法,讓協作者/稽核人員授權映像檔。

  • 直接使用圖片摘要時,資源擁有者每次授權新圖片時,都必須使用圖片摘要更新政策。使用圖片簽章時,政策會包含公開金鑰指紋,而對應的私密金鑰則由協作者/審查者擁有,用於簽署已審查的圖片。
  • 對於某些安全性模型而言,參照信任的圖片簽署金鑰比更新新圖片摘要值清單更方便。

安全性不會倒退:信任邊界保持不變,因此這個容器簽章方法不會導致安全性倒退,在容器簽章方法中,資源擁有者會在 WIP 政策中指定信任的公開金鑰指紋,然後由認證驗證服務和 WIP 執行授權檢查作業;認證驗證服務會驗證簽章是否與執行中的工作負載相關聯,而 WIP 政策則會檢查服務聲明的公開金鑰是否經過政策授權。

強大的安全性:使用容器映像檔簽章可將一定程度的信任委派給映像檔簽署者。在認證政策中指定信任的簽署者公開金鑰指紋,資源擁有者即可授權該簽署者針對符合政策的容器映像檔做出認證。認證驗證器服務會驗證簽名是否與執行的工作負載相關聯,政策則會檢查建立簽名的公開金鑰是否經過政策授權。因此,圖片簽署功能提供的額外間接層,可確保機密空間的強大安全性。

這兩種方法唯一的差異在於,後者會使用額外的間接層,在該層中工作負載映像檔會使用簽署金鑰授權。信任範圍保持不變,因此不會引入任何新的安全漏洞。

課程內容

在本程式碼研究室中,您將瞭解如何使用容器映像檔簽章,授權存取受保護的資源:

  • 如何使用 cosign 為經過稽核的容器映像檔簽署
  • 如何將容器映像檔簽章上傳至 OCI 登錄檔,以便進行簽章探索和儲存
  • 如何設定執行機密空間所需的雲端資源
  • 如何在支援已簽署容器映像檔的機密空間中執行工作負載

本程式碼實驗室說明如何使用機密空間,對在 Google Compute Engine 上執行的受信任金鑰所簽署的容器映像檔進行遠端認證。

軟硬體需求

在機密空間中涉及已簽署容器映像檔的角色

在本程式碼研究室中,Primus Bank 將擔任稽核人員和資源擁有者,負責執行下列工作:

  1. 使用範例資料設定必要資源。
  2. 稽核工作負載程式碼。
  3. 使用 cosign 為工作負載映像檔簽署。
  4. 將簽名上傳至存放區。
  5. 設定 WIP 政策來保護客戶資料。

Secundus Bank 將擔任工作負載作者和操作員,並負責:

  1. 設定儲存結果所需的資源。
  2. 編寫工作負載程式碼。
  3. 發布工作負載映像檔。
  4. 在機密空間中執行工作負載,並支援已簽署的容器映像檔。

Secundus Bank 會開發並發布工作負載,用於查詢 Primus Bank 擁有的雲端儲存值區中儲存的客戶資料。Primus Bank 會稽核工作負載、簽署容器映像檔,並設定 WIP 政策,允許已核准的工作負載存取資料。執行工作負載的結果會儲存在 Secundus 銀行擁有的雲端儲存空間值區中。

機密聊天室設定涉及的資源

本程式碼研究室參照了多個變數,您應將這些變數設為 GCP 專案的適當值。本程式碼研究室中的指令假設這些變數已設定。(例如,export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket' 可用於設定 Primus 銀行的輸入儲存值區名稱)。如果未設定資源名稱的變數,系統會根據 GCP 專案 ID 產生變數。

在 Primus 專案中設定下列項目:

  • $PRIMUS_INPUT_STORAGE_BUCKET:儲存客戶資料檔案的值區。
  • $PRIMUS_WORKLOAD_IDENTITY_POOL:驗證要求的工作負載身分集區 (WIP)。
  • $PRIMUS_WIP_PROVIDER:Workload Identity Pool 提供者,其中包含授權條件,用於驗證方驗證服務簽署的權杖。
  • $PRIMUS_SERVICEACCOUNT$PRIMUS_WORKLOAD_IDENTITY_POOL 用來存取受保護資源的服務帳戶。在這個步驟中,它有權查看儲存在 $PRIMUS_INPUT_STORAGE_BUCKET 儲存桶中的客戶資料。
  • $PRIMUS_ENC_KEY:用來加密 $PRIMUS_INPUT_STORAGE_BUCKET 中儲存資料的 KMS 金鑰。

本程式碼研究室新增的資源:

  • $PRIMUS_COSIGN_REPOSITORY:Artifact Registry,用於儲存工作負載映像檔簽章。
  • $PRIMUS_SIGNING_KEY:稽核人員/資料協作者 (例如本例中的 Primus Bank) 用來簽署工作負載映像檔的 KMS 金鑰。

在 Secundus 專案中設定下列項目:

  • $SECUNDUS_ARTIFACT_REGISTRY:要推送工作負載 Docker 映像檔的構件登錄檔。
  • $WORKLOAD_IMAGE_NAME:工作負載 Docker 映像檔的名稱。
  • $WORKLOAD_IMAGE_TAG:工作負載 Docker 映像檔的代碼。
  • $WORKLOAD_SERVICEACCOUNT:服務帳戶,具有執行工作負載的機密 VM 存取權。
  • $SECUNDUS_RESULT_BUCKET:儲存工作負載結果的 bucket。

其他資源:

  • primus_customer_list.csv 包含客戶資料。我們會將這項資料上傳至 $PRIMUS_INPUT_STORAGE_BUCKET,並建立可查詢這項資料的工作負載。

現有工作流程

在機密空間中執行工作負載時,系統會使用已設定的資源執行下列程序:

  1. 工作負載會要求 WIP 的 $PRIMUS_SERVICEACCOUNT 一般 Google 存取權杖。這項服務會提供具有工作負載和環境宣告的認證驗證服務權杖。
  2. 如果驗證聲明服務權杖中的負載量評估聲明與 WIP 中的屬性條件相符,則會傳回 $PRIMUS_SERVICEACCOUNT. 的存取權杖。
  3. 工作負載會使用與 $PRIMUS_SERVICEACCOUNT 相關聯的服務帳戶存取權杖,存取 $PRIMUS_INPUT_STORAGE_BUCKET 值區中的客戶資料。
  4. 工作負載會對該資料執行作業。
  5. 工作負載會使用 $WORKLOAD_SERVICEACCOUNT 服務帳戶,將該作業的結果寫入 $SECUNDUS_RESULT_STORAGE_BUCKET 值區。

支援已簽署容器的新工作流程

如以下所示,已簽署容器支援功能將整合至現有工作流程。在支援已簽署容器映像檔的機密空間中執行工作負載時,系統會使用已設定的資源執行下列程序:

  1. Confidential Space 會找出與目前執行中工作負載映像檔相關的任何容器簽章,並將這些簽章傳送給認證驗證工具。認證驗證器會驗證簽名,並在認證宣告中加入任何有效的簽名。
  2. 工作負載會要求 WIP 的 $PRIMUS_SERVICEACCOUNT 一般 Google 存取權杖。這項服務會提供具有工作負載和環境宣告的 Attestation Verifier 服務權杖。
  3. 如果認證驗證服務權杖中的容器簽章聲明與 WIP 中的屬性條件相符,則會傳回 $PRIMUS_SERVICEACCOUNT 的存取權杖
  4. 工作負載會使用與 $PRIMUS_SERVICEACCOUNT 相關聯的服務帳戶存取權權杖,存取 $PRIMUS_INPUT_STORAGE_BUCKET 值區中的客戶資料。
  5. 工作負載會對該資料執行作業。
  6. 工作負載會使用 $WORKLOAD_SERVICEACCOUNT 將該作業的結果寫入 $SECUNDUS_RESULT_STORAGE_BUCKET 值區。

2. 設定雲端資源

在設定機密空間時,您必須先在 Primus 和 Secundus 銀行的 GCP 專案中建立必要的雲端資源。以下是這個程式碼研究室的新資源:

在 Primus 專案中:

  • 在稽核程式碼後,用於簽署 Secundus 工作負載的 KMS 簽署金鑰。
  • 用於儲存 Cosign 簽名的構件登錄機制存放區。

Secundus 專案中沒有任何新資源。這些資源設定完成後,您就可以為工作負載建立服務帳戶,並設定必要的角色和權限。接著,您會建立工作負載映像檔,而稽核人員 Primus bank 會為工作負載映像檔簽署。然後,資料協作者 (本程式碼研究室中的 Primus 銀行) 會授權工作負載,而工作負載操作員 (本例中的 Secundus 銀行) 會執行工作負載。

在設定機密空間時,您會在 Primus 和 Secundus GCP 專案中建立必要的雲端資源。

事前準備

  • 使用下列指令複製 這個存放區,取得本程式碼研究室所需的指令碼。
git clone https://github.com/GoogleCloudPlatform/confidential-space
  • 變更本程式碼研究室的目錄。
cd confidential-space/codelabs/signed_container_codelab/scripts
  • 請確認您已設定必要的專案,如下所示。
export PRIMUS_PROJECT_ID=<GCP project id of primus bank>
export SECUNDUS_PROJECT_ID=<GCP project id of secundus bank>
  • 請使用這項指令設定上述資源名稱的變數。您可以使用這些變數 (例如 export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket') 覆寫資源名稱
  • 執行下列指令碼,將其餘變數名稱設為資源名稱的值,並根據專案 ID 進行設定。
source config_env.sh

設定 Primus 銀行資源

在這個步驟中,您將為 Primus 銀行設定必要的雲端資源。執行下列指令碼,為 Primus 銀行設定資源。在這些步驟中,系統會建立下列資源:

  • Cloud Storage 值區 ($PRIMUS_INPUT_STORAGE_BUCKET),用於儲存 Primus 銀行的加密客戶資料檔案。
  • KMS 中的加密金鑰 ($PRIMUS_ENC_KEY) 和密鑰圈 ($PRIMUS_ENC_KEYRING),用於加密 Primus 銀行的資料檔案。
  • Workload Identity 工作負載集區 ($PRIMUS_WORKLOAD_IDENTITY_POOL),可根據提供者下所設定的屬性條件驗證要求。
  • 服務帳戶 ($PRIMUS_SERVICEACCOUNT) 已連結至上述工作負載身分池 ($PRIMUS_WORKLOAD_IDENTITY_POOL),並具備下列 IAM 存取權:
  • roles/cloudkms.cryptoKeyDecrypter 使用 KMS 金鑰解密資料。
  • objectViewer 讀取 Cloud Storage 值區中的資料。
  • roles/iam.workloadIdentityUser,用於將此服務帳戶連結至工作負載身分池。
./setup_primus_bank_resources.sh

設定 Secundus 銀行資源

在這個步驟中,您將為 Secundus 銀行設定必要的雲端資源。執行以下指令碼,為 Secundus 銀行設定資源。在這個步驟中,系統會建立下列資源:

  • Cloud Storage 值區 ($SECUNDUS_RESULT_STORAGE_BUCKET),用於儲存 Secundus 銀行執行工作負載的結果。
./setup_secundus_bank_resources.sh

3. 建立及簽署工作負載

建立工作負載服務帳戶

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

  • 這個工作負載服務帳戶 ($WORKLOAD_SERVICEACCOUNT) 將具備下列角色:
  • confidentialcomputing.workloadUser 取得認證權杖
  • logging.logWriter 將記錄檔寫入 Cloud Logging。
  • objectViewer 可讀取 $PRIMUS_INPUT_STORAGE_BUCKET Cloud Storage 值區中的資料。
  • objectAdmin 將工作負載結果寫入 $SECUNDUS_RESULT_STORAGE_BUCKET Cloud Storage 值區。
./create_workload_serviceaccount.sh

建立工作負載

在這個步驟中,您將建立工作負載 Docker 映像檔。本程式碼研究室中使用的負載是簡單的 CLI 導向 Go 應用程式,可計算引數中提供地理位置的客戶 (來自 Primus 銀行客戶資料)。執行下列指令碼,建立工作負載,並執行下列步驟:

  • 建立由 Secundus 銀行擁有的 Artifact Registry($SECUNDUS_ARTIFACT_REGISTRY)。
  • 請更新工作負載程式碼,加入必要的資源名稱。這裡是本程式碼研究室使用的負載程式碼。
  • 建構 Go 二進位檔,並建立 Dockerfile,以便建構工作負載程式的 Docker 映像檔。這裡是本程式碼研究室使用的 Dockerfile。
  • 建構 Docker 映像檔,並發布至 Secundus 銀行擁有的 Artifact Registry ($SECUNDUS_ARTIFACT_REGISTRY)。
  • $WORKLOAD_SERVICEACCOUNT 的讀取權限授予 $SECUNDUS_ARTIFACT_REGISTRY。這項設定是工作負載容器從 Artifact Registry 提取工作負載 Docker 映像檔所需。
./create_workload.sh

簽署工作負載

我們會使用 Cosign 簽署工作負載映像檔。Cosign 預設會將簽署的映像檔與簽署的簽名儲存在相同的存放區中。如要指定不同的簽名存放區,您可以設定 COSIGN_REPOSITORY 環境變數。

以下我們將以 Artifact Registry 為例。您也可以根據偏好選擇其他以 OCI 為基礎的登錄項,例如 Docker Hub、AWS CodeArtifact。

  1. 建立 Artifact Registry Docker 存放區。
gcloud config set project $PRIMUS_PROJECT_ID
gcloud artifacts repositories create $PRIMUS_COSIGN_REPOSITORY \
  --repository-format=docker --location=${PRIMUS_PROJECT_REPOSITORY_REGION}
  1. 在 KMS 下建立金鑰環和金鑰,用於簽署工作負載映像檔。
gcloud config set project $PRIMUS_PROJECT_ID
gcloud kms keyrings create $PRIMUS_SIGNING_KEYRING \
  --location=${PRIMUS_PROJECT_LOCATION}
gcloud kms keys create $PRIMUS_SIGNING_KEY \
  --keyring=$PRIMUS_SIGNING_KEYRING \
  --purpose=asymmetric-signing \
  --default-algorithm=ec-sign-p256-sha256 \
  --location=${PRIMUS_PROJECT_LOCATION}
  1. 對於 Artifact Registry,系統會預期完整的映像檔名稱,例如 $LOCATION/$PROJECT/$REPOSITORY/$IMAGE_NAME。您可以將任何容器映像檔上傳至存放區,以便儲存簽名。
export COSIGN_REPOSITORY=us-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_COSIGN_REPOSITORY}/demo
  1. $PRIMUS_COSIGN_REPOSITORY 存放區的「檢視者」角色授予 $WORKLOAD_SERVICEACCOUNT 服務帳戶。這樣一來,Confidential Space 就能偵測到上傳至 $PRIMUS_COSIGN_REPOSITORY 的所有容器映像檔簽章。
gcloud artifacts repositories add-iam-policy-binding ${PRIMUS_COSIGN_REPOSITORY} \
--project=${PRIMUS_PROJECT_ID} --role='roles/viewer' --location=us \
--member="serviceAccount:${WORKLOAD_SERVICEACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com"

Cosign 是一項強大的工具,提供多項簽署功能。在我們的用途中,Cosign 只需要使用金鑰組進行簽署。這項已簽署容器映像檔功能不支援共同簽署無金鑰簽署功能。

使用金鑰組簽署時,有兩種方式:

  1. 使用 Cosign 產生的本機金鑰組進行簽署。
  2. 使用儲存在其他位置 (例如 KMS) 的金鑰組簽署。
  1. 如果沒有金鑰組,請在 Cosign 中產生金鑰組。詳情請參閱「使用自行管理的金鑰進行簽署」一文。我們在此指定了兩種方式 (本機和使用 KMS 供應器) 來產生金鑰組合並簽署工作負載,請按照其中一種方式簽署工作負載容器。
// Set Application Default Credentials.
gcloud auth application-default login 
// Generate keys using a KMS provider.
cosign generate-key-pair --kms <provider>://<key>
// Generate keys using Cosign.
cosign generate-key-pair

將上方程式碼中的 <provider>://<key> 替換為 gcpkms://projects/$PRIMUS_PROJECT_ID/locations/global/keyRings/$PRIMUS_SIGNING_KEYRING/cryptoKeys/$PRIMUS_SIGNING_KEY/cryptoKeyVersions/$PRIMUS_SIGNING_KEYVERSION

  • <provider>:代表您使用的 KMS 解決方案
  • <key>:代表 KMS 中的金鑰路徑
  1. 擷取公開金鑰以供驗證。
// For KMS providers.
cosign public-key --key <some provider>://<some key> > pub.pem

// For local key pair signing.
cosign public-key --key cosign.key > pub.pem
  1. 使用 Cosign 簽署工作負載。對公開金鑰執行未填補的 Base64 編碼
PUB=$(cat pub.pem | openssl base64)
// Remove spaces and trailing "=" signs.
PUB=$(echo $PUB | tr -d '[:space:]' | sed 's/[=]*$//')
  1. 使用 Cosign 簽署工作負載,並附上匯出的公開金鑰和簽章演算法。
IMAGE_REFERENCE=us-docker.pkg.dev/$SECUNDUS_PROJECT_ID/$SECUNDUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG
// Sign with KMS support.
cosign sign --key <some provider>://<some key> $IMAGE_REFERENCE \
-a dev.cosignproject.cosign/sigalg=ECDSA_P256_SHA256 \
-a dev.cosignproject.cosign/pub=$PUB
// Sign with a local key pair.
cosign sign --key cosign.key $IMAGE_REFERENCE \
-a dev.cosignproject.cosign/sigalg=ECDSA_P256_SHA256 \
-a dev.cosignproject.cosign/pub=$PUB
  • --key [REQUIRED] 會指定要使用的簽署金鑰。如要參照由 KMS 供應商管理的金鑰,請遵循 Sigstore KMS 支援中的特定 URI 格式。如要參照 Cosign 產生的金鑰,請改用 cosign.key。
  • $IMAGE_REFERENCE [REQUIRED] 會指定要簽署哪個容器映像檔。IMAGE_REFERENCE 的格式可透過標記或圖片摘要識別。例如:us-docker.pkg.dev/$SECUNDUS_PROJECT_ID/secundus-workloads/workload-container:latest or us-docker.pkg.dev/$SECUNDUS_PROJECT_ID/secundus-workloads/workload-container[IMAGE-digest]
  • -a [REQUIRED] 可指定附加至簽名酬載的註解。對於機密空間簽署的容器映像檔,您必須將公開金鑰和簽名演算法附加至簽名酬載。
  • dev.cosignproject.cosign/sigalg ONLY 接受三個值:
  • RSASSA_PSS_SHA256:使用 PSS 填充演算法的 RSASSA 演算法,並搭配 SHA256 摘要。
  • RSASSA_PKCS1V15_SHA256:使用 PKCS#1 v1.5 填充和 SHA256 摘要的 RSASSA 演算法。
  • ECDSA_P256_SHA256:具有 SHA256 摘要的 P-256 曲線 ECDSA。這也是 Cosign 產生金鑰組的預設簽章演算法。
  1. 將簽名上傳至 Docker 存放區

共同簽署功能會自動將簽名上傳至指定的 COSIGN_REPOSITORY.

4. 授權及執行工作負載

授權工作負載

在這個步驟中,我們會在工作負載身分集區 ($PRIMUS_WORKLOAD_IDENTITY_POOL) 下設定工作負載身分提供者。系統會為工作負載身分設定屬性條件,如下所示。其中一個條件是驗證工作負載映像檔簽名的指紋,並與簽署公開金鑰的指紋進行比對。有了這個屬性條件,當 Secundus Bank 發布新的工作負載映像檔時,Primus Bank 就能稽核工作負載程式碼並簽署新的工作負載映像檔,而不需要使用映像檔摘要更新 WIP 政策。

gcloud config set project $PRIMUS_PROJECT_ID
PUBLIC_KEY_FINGERPRINT=$(openssl pkey -pubin -in pub.pem -outform DER | openssl sha256 | cut -d' ' -f2)
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
     && '${WORKLOAD_SERVICEACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com' in
     assertion.google_service_accounts
     && ['ECDSA_P256_SHA256:${PUBLIC_KEY_FINGERPRINT}']
       .exists(fingerprint, fingerprint in assertion.submods.container.image_signatures.map(sig,sig.signature_algorithm+':'+sig.key_id))"

執行工作負載

在這個步驟中,我們會在機密 VM 上執行工作負載。系統會使用中繼資料標記傳遞必要的 TEE 引數。工作負載容器的引數會透過旗標的「tee-cmd」部分傳遞。工作負載的程式碼會將結果發布至 $SECUNDUS_RESULT_STORAGE_BUCKET

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

查看結果

在 Secundus 專案中查看工作負載結果。

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

結果應為 3,因為 primus_customer_list.csv 檔案中列出了多少位來自西雅圖的使用者!

5. 清除

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

  • Primus 銀行的輸入儲存值區 ($PRIMUS_INPUT_STORAGE_BUCKET)。
  • Primus 銀行服務帳戶 ($PRIMUS_SERVICEACCOUNT)。
  • Primus Bank 的構件登錄檔,用於儲存圖片簽章 ($PRIMUS_COSIGN_REPOSITORY)。
  • Primus Bank workload identity pool ($PRIMUS_WORKLOAD_IDENTITY_POOL)。
  • Secundus Bank ($WORKLOAD_SERVICEACCOUNT) 的工作負載服務帳戶。
  • 工作負載運算執行個體。
  • Secundus Bank 的結果儲存值區 ($SECUNDUS_RESULT_STORAGE_BUCKET)。
  • Secundus Bank ($SECUNDUS_ARTIFACT_REGISTRY) 的 Artifact Registry。
  • Secundus Bank 的工作負載 VM ($WORKLOAD_VM)。
./cleanup.sh

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

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

恭喜

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

您已瞭解如何利用已簽署的容器映像檔功能,改善機密空間的可用性。

後續步驟

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

其他資訊