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

1. 概览

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

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

所需条件

学习内容

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

在本 Codelab 中,您将为 Primus 银行和 Secundus 银行设置一个 Confidential Space,以便确定它们的共同客户,而无需彼此共享完整的账号列表。这涉及以下步骤:

  • 第 1 步:为 Primus 银行和 Secundus 银行设置所需的云资源。这些云资源包括 Primus 银行和 Secundus 银行的 Cloud Storage 存储分区、KMS 密钥、工作负载身份池和服务账号。Primus Bank 和 Secundus Bank 将其客户数据存储在 Cloud Storage 存储分区中,并使用 Cloud Key Management Service 密钥对数据进行加密。
  • 第 2 步:创建将由工作负载虚拟机使用的服务账号。Secundus Bank 将成为工作负载的运营商,并启动工作负载虚拟机。Primus Bank 将编写工作负载代码。
  • 第 3 步:创建一个工作负载,其中包含两个 CLI 命令,一个用于统计指定地理位置的客户数量,另一个用于查找 Primus 银行和 Secundus 银行的共同客户。该工作负载将由 Primus Bank 编写,并打包为 Docker 映像。此 Docker 映像将发布到 Artifact Registry
  • 第 4 步:为工作负载授权。Primus Bank 会使用工作负载身份池,根据运行工作负载的人员、工作负载的用途以及工作负载的运行位置等属性,授权工作负载访问其客户数据。
  • 第 5 步:在工作负载运行时,它会提供包含工作负载和环境声明的认证验证器服务令牌,以请求访问数据协作者(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. 设置 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 项目中的相应现有云资源。如果未设置该变量,系统会根据 project-name 生成云资源名称,并在以下操作中创建新的 cloud-resource:

$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 映像的 artifact 代码库。

  • 您可以使用 Secundus 项目中的现有云资源名称设置以下变量。如果设置了该变量,则系统会使用 Secundus 项目中的相应现有云资源。如果未设置变量,系统会根据 project-name 生成云资源名称,并在以下操作中创建新的 cloud-resource:

$SECUNDUS_INPUT_STORAGE_BUCKET

用于存储 Secundus 银行客户数据文件的存储分区

$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 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

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

  • 此 Codelab 中使用了一些工件,如下所述:
  • primus_customer_list.csv:包含 Primus Bank 客户数据的文件。此处提供了本 Codelab 中使用的示例文件。
  • secundus_customer_list.csv:包含 Secundus Bank 客户数据的文件。此处提供了本 Codelab 中使用的示例文件。
  • 您需要对这两个项目拥有以下权限:
  • 对于 $PRIMUS_PROJECT_ID,您需要拥有 Cloud KMS Admin、Storage Admin、Artifact Registry Administrator、Service Account Admin、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 的客户数据文件。
  • Workload Identity 池 ($PRIMUS_WORKLOAD_IDENTITY_POOL),用于根据其提供方下配置的属性条件验证声明。
  • 附加到上述工作负载身份池 ($PRIMUS_WORKLOAD_IDENTITY_POOL) 的服务账号 ($PRIMUS_SERVICE_ACCOUNT) 有权使用 KMS 密钥解密数据(使用 roles/cloudkms.cryptoKeyDecrypter 角色)、从云端存储分区读取数据(使用 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 的数据文件。
  • Workload Identity 池 ($SECUNDUS_WORKLOAD_IDENTITY_POOL),用于根据其提供方下配置的属性条件验证声明。
  • 附加到上述工作负载身份池 ($SECUNDUS_WORKLOAD_IDENTITY_POOL) 的服务账号 ($SECUNDUS_SERVICE_ACCOUNT) 有权使用 KMS 密钥解密数据(使用 roles/cloudkms.cryptoKeyDecrypter 角色)、从 Cloud Storage 存储分区读取数据(使用 objectViewer 角色),以及将服务账号连接到工作负载身份池(使用 roles/iam.workloadIdentityUser 角色)。
  • Cloud Storage 存储分区 ($SECUNDUS_RESULT_STORAGE_BUCKET),用于存储 Secundus Bank 执行的工作负载结果。
./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 银行各自存储在 Cloud Storage 存储分区中的客户名单中,查找 Primus 银行和 Secundus 银行的共同客户。

运行以下脚本,创建一个执行以下步骤的工作负载:

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

4. 授权和运行工作负载

为工作负载授权

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

  • 什么:已验证的代码
  • 位置:安全的环境
  • Who:受信任的运营商

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

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

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

  • 内容:上传到 $PRIMUS_ARTIFACT_REPOSITORY 代码库的最新 $WORKLOAD_IMAGE_NAME
  • 条件: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 希望根据以下条件授权工作负载访问其客户数据:

  • 内容:工作负载。
  • 位置:Confidential Space 环境。
  • “谁”:运行工作负载的账号 ($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 将在 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 分钟,让工作负载完成执行,并在云端存储分区中显示结果。

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 银行的共同客户。

输出:

Eric
Clinton
Ashley
Cooper

运行未经授权的工作负载

Primus Bank 允许 Secundus Bank 访问其数据的合同到期。因此,Primus Bank 更新了其属性条件,以允许使用其新合作伙伴 Tertius Bank 的服务账号的虚拟机。

Primus Bank 修改了 Workload Identity 池提供程序

$PRIMUS_PROJECT_ID 中,更新 Attestation Verifier 身份提供方的属性条件,以便在新的地理位置授权工作负载。

  1. 将项目设置为 $PRIMUS_PROJECT_ID。
gcloud config set project $PRIMUS_PROJECT_ID
  1. 使用以下命令导出 Tertius Bank 的 GCP 项目 ID。Primus Bank 稍后会使用此 ID 更新工作负载身份池提供方的属性条件。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 的 artifact 注册表,用于存储映像签名 ($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 的 artifact 仓库 ($PRIMUS_ARTIFACT_REPOSITORY)。
./cleanup.sh

如果您已完成探索,请考虑删除您的项目。

  • 前往 Cloud Platform 控制台
  • 选择要关停的项目,然后点击顶部的“删除”:这会安排删除该项目。

恭喜

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

您了解了如何使用 Confidential Space 保护共享数据并确保其机密性。

后续操作

查看下列类似 Codelab…

深入阅读