更新时间:2025-08-20 GMT+08:00
分享

工作流程

相关角色

在这个QingTian Enclave使用场景里,涉及到了以下几个角色:

  • 安全员:拥有对机密数据和KMS密钥的控制权限。作为华为云账号的所有者,他具有最高权限,例如他可以创建IAM用户并为其设置最小权限,创建加密密钥和加密敏感数据等。在本场景中,我们还假设安全员同时承担了Enclave镜像构建的工作,他获得预期的Enclave镜像度量值PCR0和PCR8,并在IAM授权策略中使用这些度量值作为条件键。
  • 父虚拟机管理员:作为被安全员授权的运维人员,他拥有父虚拟机实例的访问权限,并能管理QingTian Enclave实例的生命周期。他使用安全员构建好的QingTian Enclave镜像文件来启动QingTian Enclave实例。
  • QingTian Enclave应用程序开发人员:开发在QingTian Enclave中运行的应用程序。在该案例中,该应用程序需要从OBS服务的Bucket1获取密文对象,然后调用kms-decrypt接口对密文进行解密,进行数据处理后,最后将结果输出到Bucket2。

    在指定目录下,下载huawei qingtian enclave源码:

    cd /home
    git clone https://gitee.com/HuaweiCloudDeveloper/huawei-qingtian.git

数据和环境准备

接下来,我们将概述一下关于数据加密、证明设置和QingTian Enclave实例创建的相关流程。

  1. 安全员在数据加密服务的密钥管理子服务中创建KMS密钥。详细内容,请参见创建密钥
  2. 安全员使用KMS密钥加密一段敏感数据(例如银行卡信息)。详细信息可以参考数据加密服务帮助文档中API参考章节中的应用示例:加解密小量数据
  3. 安全员使用obsutil命令行工具将加密后的密文上传到对象存储服务(OBS)的一个桶中。详细信息可以参考对象存储服务帮助文档工具指南章节: 上传对象
  4. 安全员编写并打包QingTian Enclave开发程序:制作Docker镜像,然后使用qt命令行工具将Docker镜像转换成QingTian Enclave镜像文件。可以参考QingTian Enclave镜像文件制作。并记录创建QingTian Enclave镜像文件时生成的PCR0和PCR8。
  5. 安全员将PCR0和PCR8设置为IAM访问控制策略的条件键(控制kms-decrypt API)。

    在IAM控制台,使用管理员权限账号创建自定义身份策略,详细操作,请参见创建自定义策略

    要配置的自定义身份策略内容如下:

    {
      "Version": "5.0",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "kms::generateRandom",
            "kms:cmk:createDataKey",
            "kms:cmk:decryptData",
            "kms:cmk:decryptDataKey"
          ],
          "Condition": {
            "StringEqualsIgnoreCase": {
              "kms:RecipientAttestation/PCR0": [
                "8f2cbfb3930e59c6de5c4caff0a3f4c0457e8956bfb4556a7ca1f5f4614a741eeee39ae10447eb5baee48d49e6c1cb6c",
                "ff7ba807a385b49fc1c3346bb47215aef503dee6df22d32f733e22b90a9bc4b22424ca7de1a3537ac9608d7ebe461d67",
                "a28e765550d6ad1188860d30167b1fdb9e29c8da825543861bc76ef1e8427fac6b444ec6a1847fc2c22deae8170c2e67"
              ],
              "kms:RecipientAttestation/PCR8": [
                "a9add94b0ecbbd992baded2176370ecf3bfed2cb39b2ec547512b5174279799f2036fa0b8577bdaf503836178bd11ee2"
              ]
            }
          }
        },
        {
          "Effect": "Allow",
          "Action": [
            "kms:cmk:encryptData",
            "kms:cmk:encryptDataKey"
          ]
        }
      ]
    }

    在自定义身份策略示例中,配置了如下参数:

    • kms::generateRandom:生成随机数
    • kms::cmk:createDataKey:创建数据密钥
    • kms:cmk:decryptData:解密数据
    • kms:cmk:decryptDataKey:解密数据密钥
    • kms:cmk:encryptDataKey:加密数据密钥
    • kms:cmk:encryptData:加密数据

    其中,kms:RecipientAttestation/PCR0和kms:RecipientAttestation/PCR8的条件键,在制作QingTian Enclave镜像时确定,且同时支持多个值。

  6. 父虚拟机管理员启动父虚拟机并设置启动qt-proxy服务,用于转发QingTian Enclave KMS网络请求,然后使用QingTian Enclave镜像启动QingTian Enclave。

    其中,KMS在不同区域的终端节点可通过地区和终端节点获取。

远程证明和数据解密

下面我们将概述在QingTian Enclave应用程序的执行流程。

  1. 通过qproxy服务,QingTian Enclave应用程序将密文从OBS桶中下载到QingTian Enclave实例中。
  2. Enclave应用程序产生一对RSA公私钥(pubKey, priKey),用于建立与KMS服务之间的端到端数据加密(它并不需要依赖HTTPS)。然后使用QingTian Enclave SDK调用KMS提供的支持AttestationDocument(证明文档)作为入参的kms-decrypt API。证明文档中包括QingTian Enclave的PCR值和应用程序产生的加密公钥(pubKey)。
  3. KMS接收并验证证明文档是否由QingTianAttestation PKI签发。在kms-decrypt API的访问控制检查中,会将证明文档中的PCR值与IAM授权策略中的PCR值进行比较,如果匹配成功则允许调用该接口,否则拒绝访问。
  4. KMS将数据解密后,然后用AttestationDocument提供的pubKey对数据进行重新加密后发送回QingTian Enclave应用程序。QingTian Enclave应用程序使用priKey对接收到的密文数据进行解密。

    示例代码可以参考:https://gitee.com/HuaweiCloudDeveloper/huawei-qingtian/tree/master/enclave/qtsm-sdk-c/samples

相关文档