# 工作流程
#### 相关角色
在这个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. 安全员在DEW的密钥管理子服务中创建KMS密钥。详细内容，请参见[创建密钥](https://support.huaweicloud.com/usermanual-dew/dew_01_0178.html#section3)。
2. 安全员使用KMS密钥加密一段敏感数据（例如银行卡信息）。详细信息可以参考DEW帮助文档中API参考章节中的应用示例：[加解密小量数据](https://support.huaweicloud.com/api-dew/dew_02_0317.html)。
3. 安全员使用obsutil命令行工具将加密后的密文上传到OBS的一个桶中。详细信息可以参考OBS帮助文档工具指南章节： [上传对象](https://support.huaweicloud.com/utiltg-obs/obs_11_0013.html)。
4. 安全员编写并打包QingTian Enclave开发程序：制作Docker镜像，然后使用qt命令行工具将Docker镜像转换成QingTian Enclave镜像文件。可以参考QingTian Enclave镜像文件制作。并记录创建QingTian Enclave镜像文件时生成的PCR0和PCR8。
5. 安全员将PCR0和PCR8设置为IAM访问控制策略的条件键（控制kms-decrypt API）。 在IAM控制台，使用管理员权限账号创建自定义身份策略，详细操作，请参见[创建自定义策略](https://support.huaweicloud.com/usermanual-iam/iam_01_0605.html)。
   要配置的自定义身份策略内容如下：
   ```
   {
     "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在不同区域的终端节点可通过[地区和终端节点](https://console.huaweicloud.com/apiexplorer/#/endpoint/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>。
   
 
