通过 Confidential Space 保护使用中的共享数据

1. 概览

Confidential Space 可实现安全的多方数据共享和协作,同时让组织能够保留其数据的机密性。这意味着,组织可以相互协作,同时仍能掌控自己的数据并防止未经授权的访问。

Confidential Space 可解锁以下场景:您希望通过汇总和分析敏感(通常是受监管的)数据获得相互价值,同时保留对这些数据的完全控制权。借助 Confidential Space,组织可以通过汇总和分析敏感数据(例如个人身份信息 [PII]、受保护健康信息 [PHI]、知识产权和加密密钥)获得相互价值,同时保留对这些数据的完全控制权。

所需条件

学习内容

  • 如何配置运行 Confidential Space 所需的 Cloud 资源
  • 如何在运行 Confidential Space 虚拟机映像的机密虚拟机中运行工作负载
  • 如何根据工作负载代码的属性(什么)、保密空间环境(哪里)以及运行工作负载的账号()授权访问受保护的资源。

在此 Codelab 中,您将设置 Primus 和 Secundus Bank 之间的保密空间,以确定它们的共同客户,而无需相互共享完整的客户名单。这涉及以下步骤:

  • 第 1 步:为 Primus Bank 和 Secundus Bank 设置所需的云资源。这些云资源包括 Primus Bank 和 Secundus Bank 的 Cloud Storage 存储分区、KMS 密钥、工作负载身份池和服务账号。Primus Bank 和 Secundus Bank 将客户数据存储在 Cloud Storage 存储分区中,并使用 Cloud Key Management Service 密钥对数据进行加密。
  • 第 2 步:创建工作负载服务账号,该账号将由工作负载虚拟机使用。Secundus Bank(工作负载的运营方)将启动工作负载虚拟机。Primus Bank 将编写工作负载代码。
  • 第 3 步:创建一个工作负载,其中包含两个 CLI 命令,一个用于统计指定位置的客户,另一个用于查找 Primus Bank 和 Secundus Bank 的共同客户。工作负载将由 Primus Bank 编写,并打包为 Docker 映像。此 Docker 映像将发布到 Artifact Registry
  • 第 4 步:为工作负载授权。Primus Bank 会使用工作负载身份池,根据运行工作负载的人员的属性、工作负载的用途以及工作负载的运行位置,授权工作负载访问其客户数据。
  • 第 5 步:工作负载运行时,会通过提供包含工作负载和环境声明的 Attestation Verifier 服务令牌,请求访问数据协作者(Primus Bank 和 Secundus Bank)的云资源。如果令牌中的工作负载衡量声明与 Primus Bank 和 Secundus Bank 的工作负载身份池中的属性条件相匹配,则返回有权访问相应云资源的服务账号访问令牌。云资源将仅供在 Confidential Space 内运行的工作负载访问。
  • 第 5 步(a):运行第一个工作负载,该工作负载用于统计特定位置的 Primus Bank 客户。对于此工作负载,Primus Bank 将成为数据协作者和工作负载作者,向在 Confidential Space 中运行的工作负载提供加密的客户名单。Secundus Bank 将成为工作负载操作员,并在 Confidential Space 中运行工作负载。
  • 第 5 步(b):运行第二个工作负载,查找 Primus Bank 和 Secundus Bank 的共同客户。对于此工作负载,Primus Bank 和 Secundus Bank 都是数据协作方。它们会将加密的客户名单提供给在 Confidential Space 中运行的工作负载。Secundus Bank 将再次成为工作负载运营商。此工作负载也会获得 Secundus Bank 的授权,因为该工作负载需要访问 Secundus Bank 的加密客户名单,才能找到共同客户。在这种情况下,Secundus Bank 会根据运行工作负载的人员的属性、工作负载的用途以及工作负载的运行位置(如 Primus Bank 的第 4 步中所述)授权工作负载访问其客户数据。

fdef93a6868a976.png

2. 设置 Cloud 资源

准备工作

  • 使用以下命令克隆 此代码库,以获取此 Codelab 中使用的必需脚本。
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
  • 更改此 Codelab 的目录。
cd confidential-space/codelabs/bank_data_analysis_codelab/scripts
  • 确保您已设置必需的项目环境变量,如下所示。如需详细了解如何创建 GCP 项目,请参阅 此 Codelab。您可以参阅这篇文章,详细了解如何检索项目 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 客户数据文件的存储分区。

$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_INPUT_STORAGE_BUCKET 中的 Primus Bank 数据的 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 的工作负载身份池 (WIP),用于验证声明。

$SECUNDUS_WIP_PROVIDER

Secundus Bank 的工作负载身份池提供方,其中包含用于由证明验证器服务签名的令牌的授权条件。

$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

用于存储工作负载结果的存储分区。

$WORKLOAD_IMAGE_NAME

工作负载容器映像名称。

$WORKLOAD_IMAGE_TAG

工作负载容器映像的标记。

$WORKLOAD_SERVICE_ACCOUNT

有权访问运行工作负载的保密虚拟机的服务账号。

  • 此 Codelab 中使用的制品很少,如下所述:
  • primus_customer_list.csv:包含 Primus Bank 客户数据的文件。点击此处可查看此 Codelab 中使用的示例文件。
  • secundus_customer_list.csv:包含 Secundus Bank 客户数据的文件。点击此处可查看此 Codelab 中使用的示例文件。
  • 您需要对这两个项目拥有某些权限:
  • 对于 $PRIMUS_PROJECT_ID,您需要 Cloud KMS 管理员、存储管理员、Artifact Registry 管理员、服务账号管理员、IAM Workload Identity Pool Admin。
  • 对于 $SECUNDUS_PROJECT_ID,您需要 Compute Admin、Storage Admin、Service Account Admin、Cloud KMS Admin、IAM Workload Identity Pool Admin、Security Admin(可选)。
  • 运行以下脚本,根据您的项目 ID 为资源名称设置剩余的变量名称值。
source config_env.sh

为 Primus Bank 设置云资源

Primus Bank 需要以下云资源。运行此脚本以设置 Primus Bank 的资源:

  • 用于存储 Primus Bank 加密客户数据文件的 Cloud Storage 存储分区 ($PRIMUS_INPUT_STORAGE_BUCKET)。
  • KMS 中的加密密钥 ($PRIMUS_ENC_KEY) 和密钥环 ($PRIMUS_ENC_KEYRING),用于加密 Primus Bank 的客户数据文件。
  • 工作负载身份池 ($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 资源。在此步骤中,您将创建以下资源:

  • 用于存储 Secundus Bank 加密客户数据文件的 Cloud Storage 存储分区 ($SECUNDUS_INPUT_STORAGE_BUCKET)。
  • KMS 中的加密密钥 ($SECUNDUS_ENC_KEY) 和密钥环 ($SECUNDUS_ENC_KEYRING),用于加密 Secundus Bank 的数据文件。
  • 工作负载身份池 ($SECUNDUS_WORKLOAD_IDENTITY_POOL),用于根据其提供方下配置的属性条件验证声明。
  • 附加到上述工作负载身份池 ($SECUNDUS_WORKLOAD_IDENTITY_POOL) 的服务账号 ($SECUNDUS_SERVICE_ACCOUNT) 具有以下权限:使用 KMS 密钥解密数据(使用 roles/cloudkms.cryptoKeyDecrypter 角色)、从 Cloud Storage 存储分区读取数据(使用 objectViewer 角色)以及将服务账号连接到工作负载身份池(使用 roles/iam.workloadIdentityUser 角色)。
  • 用于存储 Secundus Bank 执行工作负载的结果的 Cloud Storage 存储分区 ($SECUNDUS_RESULT_STORAGE_BUCKET)。
./setup_secundus_bank_resources.sh

3. 创建工作负载

创建工作负载服务账号

现在,您将为工作负载创建一个具有所需角色和权限的服务账号,如下所述。运行以下脚本,在 Secundus Bank 项目中创建工作负载服务账号。运行工作负载的虚拟机会使用此服务账号。

此工作负载服务账号 ($WORKLOAD_SERVICE_ACCOUNT) 将具有以下角色:

  • confidentialcomputing.workloadUser 角色授予工作负载服务账号。这样,用户账号便可生成证明令牌。
  • 向工作负载服务账号授予 logging.logWriter 角色权限。这样一来,除了串行控制台之外,Confidential Space 环境还可以将日志写入 Cloud Logging,因此在虚拟机终止后,日志仍然可用。
  • 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

创建工作负载

在此步骤中,您将为本 Codelab 中使用的工作负载创建 Docker 映像。该工作负载是一个简单的 GoLang 应用,它:

  • 统计指定地理位置的客户数量。
  • 从 Primus 和 Secundus Bank 各自的云存储分区中存储的客户名单中查找共同客户。

运行以下脚本以创建工作负载,其中执行以下步骤:

  • 创建由 Primus Bank 拥有的 Artifact Registry ($PRIMUS_ARTIFACT_REPOSITORY),工作负载将发布到该注册表中。
  • 生成代码并使用所需的资源名称更新代码。您可以在此处找到此 Codelab 中使用的工作负载代码。
  • 构建代码并将其封装在 Docker 映像中。您可以在此处找到相应的 Dockerfile。
  • 将 Docker 映像发布到 Primus Bank 拥有的 Artifact Registry ($PRIMUS_ARTIFACT_REGISTRY)。
  • 向服务账号授予对 Artifact Registry ($PRIMUS_ARTIFACT_REGISTRY) 的 $WORKLOAD_SERVICE_ACCOUNT 读取权限。
./create_workload.sh

4. 授权并运行工作负载

授权工作负载

Primus Bank 希望授权工作负载根据以下资源的属性访问其客户数据:

  • 内容:已通过验证的代码
  • 地点:安全的环境
  • Who:受信任的运营商

Primus 使用工作负载身份联合来根据这些要求强制执行访问政策。

借助工作负载身份联合,您可以指定特性条件。这些条件用于限制哪些身份可以使用工作负载身份池 (WIP) 进行身份验证。您可以将证明验证器服务作为工作负载身份池提供方添加到 WIP,以提供测量结果并强制执行政策。

工作负载身份池已在之前作为云资源设置步骤的一部分创建。现在,Primus Bank 将创建一个新的 OIDC 工作负载身份池提供方。指定的 --attribute-condition 授权对工作负载容器的访问权限。它需要:

  • 内容:最新 $WORKLOAD_IMAGE_NAME 已上传到 $PRIMUS_ARTIFACT_REPOSITORY 代码库。
  • 其中:Confidential Space 可信执行环境在完全受支持的 Confidential Space 虚拟机映像上运行。
  • Who: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 希望授权工作负载基于以下条件访问其客户数据:

  • 内容:工作负载。
  • 位置:Confidential Space 环境。
  • :运行工作负载的账号 ($WORKLOAD_SERVICE_ACCOUNT)。

Primus Bank 使用 image_reference 声明(包含图片标记)来确定是否应授权访问。他们控制着远程代码库,因此可以确保只标记不会泄露其数据的映像。

相比之下,Secundus Bank 无法控制其获取映像的代码库,因此无法安全地做出该假设。而是选择根据工作负载的 image_digest 授权对该工作负载的访问权限。与 image_reference 不同的是,Primus Bank 可以更改 image_reference 以指向其他图片,但不能让 image_digest 指向 Secundus Bank 在上一步中审核的图片以外的图片。

在创建工作负载身份池提供方之前,我们会收集工作负载容器映像的 image_digest,该 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 的服务账号的虚拟机。

Primus Bank 修改了工作负载身份池提供方

$PRIMUS_PROJECT_ID 中,更新证明验证器身份提供方的属性条件,以授权新位置的工作负载。

  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. 更新工作负载身份池中的 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 尝试运行原始工作负载时,会失败。如需查看错误,请删除原始结果文件和虚拟机实例,然后尝试再次运行工作负载。

删除现有结果文件和虚拟机实例

  1. 将项目设置为 $SECUNDUS_PROJECT_ID 项目。
gcloud config set project $SECUNDUS_PROJECT_ID
  1. 删除结果文件。
gsutil rm gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result
  1. 删除机密虚拟机实例。
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. 清理

点击此处可查看用于清理我们在本 Codelab 中创建的资源的脚本。在此清理过程中,系统将删除以下资源:

  • 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 Bank 的制品注册表,用于存储映像签名 ($SECUNDUS_COSIGN_REPOSITORY)。
  • 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 控制台
  • 选择要关停的项目,然后点击顶部的“删除”:系统会安排删除该项目。

恭喜

恭喜,您已成功完成此 Codelab!

您已了解如何使用 Confidential Space 来保护共享数据,同时保留其机密性。

后续操作

不妨查看以下类似 Codelab…

深入阅读