
# 密码学证明
#### QingTian Enclave证明
QingTian Enclave提供启动度量和远程证明能力。QingTian Enclave的度量值由通过标准的可信度量运算操作 (ExtendPCR) 得到的一组哈希值组成，这组哈希值保存在QTSM (QingTian Security Module) 的平台配置寄存器PCR中。QTSM可以支持最多32个PCR度量属性，PCR \[16\~31\]可以由Enclave应用程序进行自定义，PCR\[0\~15\]由QingTian系统预留，当前已支持的度量属性包括PCR0（QingTian Enclave镜像文件）、PCR3（IAM Agency URN）、PCR4（ECS Instance ID）、PCR8（QingTian Enclave镜像文件签名证书）。
Enclave应用程序可通过QTSM获取当前Enclave环境的一个可信证明文档 (Attestation Document)。证明文档包括PCR度量属性列表、QingTian PKI证书链、密码算法声明以及用户自定义参数。QingTian Enclave证明文档支持的用户自定义参数非常丰富，包括pubkey (由QTSM签署的用户自定义公钥)，nonce (避免重放攻击的一次性数据) 和 user_data (任意自定义数据)，它可以支持Enclave应用程序与外部实体之间运行多种自定义安全协议（eg，安全密钥协商、端到端加密）以实现复杂的应用安全解决方案。
华为云KMS服务、IAM服务内置了对QingTian Enclave Attestation协议的支持。租户IAM管理员可以通过设置条件授权策略来实现特定的安全控制目标，比如仅允许指定的Enclave应用程序才能调用指定的KMS API操作（比如生成随机数、加密、解密等）。下图展示了Enclave应用如何使用包含自定义pubkey参数的证明文档去访问KMS Decrypt API以实现密文数据解密的操作流程：
1. Enclave App首先随机产生一个RSA密钥对(prikey, pubkey)，使用pubkey作为参数调用QTSM API产生证明文档。
2. QTSM计算AttestationDoc（包含pubkey）并返回给Enclave应用。
3. Enclave App携带AttestationDoc和密文数据Blob，调用KMS Decrypt API。
4. KMS使用Verifier SDK来验证AttestationDoc有效性。
5. KMS将Verifier验证结果提供给IAM PDP（Policy Decision Point）进行访问控制决策。
6. KMS在访问控制策略检查通过后解密Blob，并使用AttestationDoc所携带的pubkey对解密结果进行重新加密封装后返回；Enclave App收到响应后，使用步骤[1]中产生的prikey解封装后得到明文。
图1密文数据解密过程   
![](https://support.huaweicloud.com/twp-ecs/zh-cn_image_0000002454261606.png "点击放大")
#### QingTian TPM证明
用户在创建ECS实例时可选择配置UEFI安全启动模式并使能QingTian-TPM。QingTian-TPM 是QingTian系统为ECS实例提供的一个虚拟设备，并遵循TPM 2.0技术规范。QingTian-TPM提供度量启动和远程证明，用户可以从QingTian-TPM获取签名的PCR值，并使用它们向远程实体证明ECS实例启动时的完整性。QingTian-TPM 还可以产生密钥并将其用于加密或签名，QingTian-TPM产生的密钥可以用于向依赖方提供设备身份证明。
#### ECS实例身份证明
- **使用实例身份文档**
  用户启动的每个ECS实例都有一个实例身份文档（Instance Identity Document），该文档提供有关实例本身的元数据信息，这些信息包括实例规格、实例ID、镜像ID、归属账号ID、私网IP地址、创建时间等。用户可以使用实例身份文档来验证实例相关的属性。运行在ECS实例中的应用程序可通过实例元数据服务IMDS (Instance Meta Data Service) 获取实例的实例身份文档以及针对实例身份文档的一个数字签名。当应用程序需要将实例身份文档发送给一个远程实体（依赖方）验证时，通常需要提供实例身份文档及其数字签名。从IMDS获取实例身份文档的数字签名时，用户可以提供自定义的audience参数（eg，通常为仅使用一次的挑战值）来避免重放攻击。
  实例身份文档及数字签名可看作是ECS服务为每个ECS实例提供的一个默认的"出生证"。当实例中的应用程序需要与远程实体进行交互时，该"出生证"可用于实例的初始身份证明。有了"出生证"之后，基于"可传递信任"安全原则，应用程序可使用该初始身份来获取应用相关的访问凭证，从而可以有效解决身份安全问题（eg, 在应用程序配置文件中硬编码静态凭证问题）。
  

- **使用实例IAM委托**
  用户在创建ECS实例时可选择配置一个IAM委托。实例IAM委托（IAM Agency for Instance）是IAM管理员创建的一个虚拟身份，在此场景中它用于代表用户的ECS实例访问云服务资源时所使用的IAM身份。IAM委托的一个安全优势是没有静态凭证，所以能有效消减静态凭证（或长期凭证）的泄露风险。运行在ECS实例中的应用程序可通过实例元数据服务IMDS (Instance Meta Data Service) 获取实例IAM委托的一个临时安全令牌，该安全令牌由IAM令牌服务STS( Security Token Service) 签发，它代表实例IAM委托的一个身份会话。实例IAM委托在获得IAM授权后，应用程序可以使用实例IAM委托的临时安全令牌去访问被授权的云服务资源（eg，OBS对象）。
  实例IAM委托可看作是租户IAM管理员为ECS实例提供的一个自定义"机器身份"，当实例中的应用程序需要访问被授权的华为云服务资源或API时，可以使用该"机器身份"的临时安全令牌直接访问，而不需要在应用程序代码或配置文件中硬编码静态凭证（如AK/SK），从而避免静态凭证泄露风险。
  ![](https://support.huaweicloud.com/twp-ecs/public_sys-resources/note_3.0-zh-cn.png)
  **推荐使用ECS IMDSv2协议访问实例元数据服务：**相比IMDSv1而言，IMDSv2使用"PUT方法"和"动态令牌"来初始化IMDS会话，可以有效消减租户Web应用可能存在的SSRF漏洞风险，以及因为错误配置WAF、反向代理、三层防火墙或NAT所导致的潜在安全风险。使用IMDSv2可以显著增强租户ECS实例的纵深安全防御能力。
  
 
