创建机密资源并授予对其的访问权限


数据协作者需要设置以下资源,以便工作负载能够访问其机密数据:

此外,数据协作者需要选择 Confidential Space 工作负载的结果存储位置,以及所呈现的数据是唯一数据还是共享数据。例如,您可以将相同的结果输出到每个数据协作者拥有的多个 Cloud Storage 存储分区。

存储数据

您可以使用任何存储数据的 Google Cloud 服务来托管机密数据。例如,您可以使用以下任一服务:

您应确保这些数据在静态时处于加密状态,无论是使用内置功能还是 Cloud Key Management Service (Cloud KMS) 等工具。

创建用于解密机密数据的服务账号

您可以通过服务账号将机密数据提供给 Confidential Space 工作负载,从而减少人为接触这些数据的风险。

例如,您可以使用 Cloud KMS 加密 Cloud Storage 中的机密文件,然后创建一个服务账号,授予该账号访问相应数据和用于解密数据的密钥的权限。

然后,将该服务账号关联到 WIP。然后,基于其他项目的已获授权 Confidential Space 工作负载可以使用该 WIP 来模拟解密数据、检索解密数据并对其进行处理的服务账号。

由于服务账号用来机密数据解密和处理,因此机密数据公开范围仅限于其所有者。由于该工作负载在机密虚拟机中运行,因此其基于硬件的内存加密功能可确保您的数据在使用时保持私密性。使用生产版 Confidential Space 映像的工作负载虚拟机上也停用了 SSH,这意味着在虚拟机运行期间,任何人都无法访问该虚拟机。

如需查看相关示例,请参阅创建您的第一个 Confidential Space 环境

创建 WIP 和提供程序以进行证明验证

为了帮助保护数据免遭不受信任的工作负载操作员的影响,Confidential Space 实现了证明流程,以检测对工作负载映像或其 TEE 的修改。该流程基于安全强化型虚拟机测量的启动和扩展运行时测量,并在虚拟可信平台模块 (vTPM) 设备中的受保护、仅扩展寄存器中捕获启动序列测量。

Confidential Space 证明服务生成 OpenID Connect (OIDC) 令牌,其中包括这些 vTPM 证明,其形式可以由 WIP 验证,而 WIP 根据作为属性条件添加到提供方的政策检查这些证明。这些令牌由 Google 签名(在过去一小时内),会自动刷新。

如果 WIP 授权工作负载,则该工作负载可以模拟项目中的服务账号来解密和检索机密数据。

如需设置 WIP 和提供方,请完成以下说明:

  1. 创建 WIP

  2. 将解密服务账号与具有 iam.workloadIdentityUser 角色的 WIP 相关联。

  3. 创建 OIDC 提供方,并提供以下详细信息:

    • https://confidentialcomputing.googleapis.com/ 的颁发者 URI。

    • 允许的受众群体为 https://sts.googleapis.com

    • google.subject 的提供方属性映射,值为 assertion.sub

    • 用于验证工作负载证明的属性条件。如需了解可用选项,请参阅创建认证政策

创建证明政策

在创建 WIP 的过程中,您需要添加属性条件,即工作负载必须满足才能访问数据的条件。对于 Confidential Space,这些属性条件构成了您的证明政策。

政策采用通用表达式语言 (CEL) 编写,并由一系列可使用 && 运算符链接的断言组成。

以下举例说明了如何使用 gcloud CLI 将提供方与用于定义政策的 attribute-condition 选项添加到工作负载身份池:

gcloud iam workload-identity-pools providers create-oidc attestation-verifier \
    --location=global \
    --workload-identity-pool=user-pool-name \
    --issuer-uri="https://confidentialcomputing.googleapis.com/" \
    --allowed-audiences="https://sts.googleapis.com" \
    --attribute-mapping="google.subject=assertion.sub" \
    --attribute-condition="assertion.submods.container.image_digest =='sha256:837ccb607e312b170fac7383d7ccfd61fa5072793f19a25e75fbacb56539b86b' \
&& 'service-account@my-project.iam.gserviceaccount.com' in assertion.google_service_accounts \
&& assertion.swname == 'CONFIDENTIAL_SPACE' \
&& 'STABLE' in assertion.submods.confidential_space.support_attributes"

在此示例中,尝试模拟关联到工作负载身份池的服务账号的外部身份,必须证明以下详细信息,且其值与以下详细信息匹配:

  • 工作负载容器的映像摘要

  • 关联到工作负载虚拟机的服务账号的地址

  • CONFIDENTIAL_SPACE 是指在虚拟机上运行的软件,具有其所有内置安全保证

  • 生产 Confidential Space 映像支持特性

证明断言

下表详细介绍了构建证明政策的可用断言。它们可以验证 Confidential Space 映像、工作负载容器和虚拟机所做的断言。

图片断言

断言 类型 说明

assertion.dbgstat

与以下各项互动

已定义的字符串

验证 Confidential Space 映像是调试版本还是生产版本。

有效值包括:

  • enable:检查是否使用了调试映像。
  • disabled-since-boot:检查是否使用了正式版映像。
示例

以下代码用于验证是否使用了调试版本的 Confidential Space 映像:

assertion.dbgstat == "enable"

以下代码用于验证是否使用了生产版本的 Confidential Space 映像:

assertion.dbgstat == "disabled-since-boot"
assertion.submods.confidential_space.support_attributes 字符串数组

验证 TEE 的安全版本是否为生产 Confidential Space 映像。调试 Confidential Space 映像没有设置支持特性。

有三种支持特性:

  • LATEST:这是最新版本的映像,受支持。LATEST 映像同时也是 STABLEUSABLE
  • STABLE:此版本的映像受支持,并且我们会监控其漏洞情况。STABLE 映像同时也是 USABLE
  • USABLE:仅包含此属性的映像已不再受支持,并且我们不会再监控其漏洞情况。使用时需自行承担风险。
示例

以下代码用于验证是否使用了稳定版本的 Confidential Space 映像:

"STABLE" in assertion.submods.confidential_space.support_attributes
assertion.swname 已定义的字符串

验证在证明实体上运行的软件。值始终为 CONFIDENTIAL_SPACE

示例
assertion.swname == "CONFIDENTIAL_SPACE"
assertion.swversion 字符串数组

验证 Confidential Space 映像的软件版本。我们建议改用 assertion.submods.confidential_space.support_attributes 来定位映像的最新版本。

示例
int(assertion.swversion[0]) == 230103

容器断言

断言 类型 说明

assertion.submods.container.cmd_override

与以下各项互动

字符串数组

验证工作负载映像中使用的 CMD 命令和参数。

示例

以下代码用于验证工作负载映像的 CMD 是否未被覆盖:

size(assertion.submods.container.cmd_override) == 0

以下代码会验证 program 是 CMD 替换项中的唯一内容:

assertion.submods.container.cmd_override == ['program']

assertion.submods.container.env

与以下各项互动

JSON 对象

验证环境变量及其值是否已明确传递给容器。

示例

以下代码用于验证环境变量 example-env-1 是否设置为 value-1,以及 example-env-2 是否设置为 value-2

assertion.submods.container.env == {"example-env-1": "value-1", "example-env-2": "value-2"}

assertion.submods.container.env_override

与以下各项互动

字符串

验证工作负载 operator 是否覆盖了容器中的环境变量。

示例

以下代码用于验证工作负载运算符是否替换了 example 环境变量:

!has(assertion.submods.container.env_override.example)

以下代码用于验证工作负载运算符是否未覆盖任何环境变量:

size(assertion.submods.container.env_override) == 0
assertion.submods.container.image_digest 字符串

验证工作负载容器的映像摘要。指定此条件可让多方就允许访问其数据的授权工作负载达成共识。

示例
assertion.submods.container.image_digest == "sha256:837ccb607e312b170fac7383d7ccfd61fa5072793f19a25e75fbacb56539b86b"
assertion.submods.container.image_id 字符串

验证工作负载容器的映像 ID。

示例
assertion.submods.container.image_id == "sha256:652a44b0e911271ba07cf2915cd700fdfa50abd62a98f87a57fdebc59843d93f"

assertion.submods.container.image_reference

与以下各项互动

字符串

验证在 Confidential Space 映像上运行的工作负载容器的位置。

示例
assertion.submods.container.image_reference == "us-docker.pkg.dev/PROJECT_ID/WORKLOAD_CONTAINER:latest"

assertion.submods.container.image_signatures

与以下各项互动

JSON 对象

验证映像是否具有特定签名或是否由公钥和签名算法签名。指定此条件可让多方就允许访问其数据的授权工作负载达成共识。

断言可以包含以下元素:

  • key_id:公钥的十六进制指纹。如需获取指纹,您可以运行以下命令:

    openssl pkey -pubin -in public_key.pem -outform DER | openssl sha256

    其中,public_key.pem 是 PEM 格式的公钥。

  • signature:与已签名容器关联且遵循 简易签名格式的载荷签名。
  • signature_algorithm:用于对密钥进行签名的算法。以下项之一:

    • RSASSA_PSS_SHA256(使用 SHA-256 摘要的 RSASSA-PSS)
    • RSASSA_PKCS1V15_SHA256(使用 SHA-256 摘要的 RSASSA-PKCS1 v1_5)
    • ECDSA_P256_SHA256(具有 SHA-256 摘要的 P-256 曲线上的 ECDSA)
示例
assertion.swname == 'CONFIDENTIAL_SPACE' && ['ECDSA_P256_SHA256:PUBLIC_KEY_FINGERPRINT'].exists(fingerprint, fingerprint in assertion.submods.container.image_signatures.map(sig, sig.signature_algorithm+':'+sig.key_id)) && 'serviceaccount.iam.gserviceaccount.com' in assertion.google_service_accounts"

assertion.submods.container.restart_policy

与以下各项互动

已定义的字符串

验证容器启动器在工作负载停止时的重启政策。

有效值包括:

  • Never(默认)
  • Always
  • OnFailure
示例
assertion.submods.container.restart_policy == "Never"

虚拟机断言

断言 类型 说明

assertion.google_service_accounts

与以下各项互动

字符串数组

用于验证指定的服务账号是否已连接到运行工作负载的虚拟机,或者是否已使用虚拟机元数据中的 tee-impersonate-service-accounts 列出。

示例
workload-service-account@my-project.iam.gserviceaccount.com in assertion.google_service_accounts
assertion.hwmodel 字符串

验证底层机密计算技术。支持的平台如下:

示例
assertion.hwmodel == "GCP_AMD_SEV"

assertion.submods.confidential_space.monitoring_enabled

与以下各项互动

布尔值

验证证明实体的监控状态。

示例
assertion.submods.confidential_space.monitoring_enabled.memory == true
assertion.submods.gce.instance_id 字符串

验证虚拟机实例 ID。

示例
assertion.submods.gce.instance_id == "0000000000000000000"
assertion.submods.gce.instance_name 字符串

验证虚拟机实例的名称。

示例
assertion.submods.gce.instance_name == "workload-vm"
assertion.submods.gce.project_id 字符串

验证虚拟机是否正在运行具有指定项目 ID 的 Google Cloud 项目。

示例
assertion.submods.gce.project_id == "project-id"
assertion.submods.gce.project_number 字符串

验证虚拟机是否在具有指定项目编号的 Google Cloud 项目中运行。

示例
assertion.submods.gce.project_number == "00000000000"

assertion.submods.gce.zone

与以下各项互动

  • 工作负载操作员 --zone 值。
字符串

验证虚拟机是否正在指定可用区中运行。

示例
assertion.submods.gce.zone == "us-central1-a"