工作流程
相关角色
在这个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实例创建的相关流程。
- 安全员在数据加密服务的密钥管理子服务中创建KMS密钥。详细内容,请参见创建密钥。
- 安全员使用KMS密钥加密一段敏感数据(例如银行卡信息)。详细信息可以参考数据加密服务帮助文档中API参考章节中的应用示例:加解密小量数据。
- 安全员使用obsutil命令行工具将加密后的密文上传到对象存储服务(OBS)的一个桶中。详细信息可以参考对象存储服务帮助文档工具指南章节: 上传对象。
- 安全员编写并打包QingTian Enclave开发程序:制作Docker镜像,然后使用qt命令行工具将Docker镜像转换成QingTian Enclave镜像文件。可以参考QingTian Enclave镜像文件制作。并记录创建QingTian Enclave镜像文件时生成的PCR0和PCR8。
- 安全员将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镜像时确定,且同时支持多个值。
- 父虚拟机管理员启动父虚拟机并设置启动qt-proxy服务,用于转发QingTian Enclave KMS网络请求,然后使用QingTian Enclave镜像启动QingTian Enclave。
其中,KMS在不同区域的终端节点可通过地区和终端节点获取。
远程证明和数据解密
下面我们将概述在QingTian Enclave应用程序的执行流程。
- 通过qproxy服务,QingTian Enclave应用程序将密文从OBS桶中下载到QingTian Enclave实例中。
- Enclave应用程序产生一对RSA公私钥(pubKey, priKey),用于建立与KMS服务之间的端到端数据加密(它并不需要依赖HTTPS)。然后使用QingTian Enclave SDK调用KMS提供的支持AttestationDocument(证明文档)作为入参的kms-decrypt API。证明文档中包括QingTian Enclave的PCR值和应用程序产生的加密公钥(pubKey)。
- KMS接收并验证证明文档是否由QingTianAttestation PKI签发。在kms-decrypt API的访问控制检查中,会将证明文档中的PCR值与IAM授权策略中的PCR值进行比较,如果匹配成功则允许调用该接口,否则拒绝访问。
- KMS将数据解密后,然后用AttestationDocument提供的pubKey对数据进行重新加密后发送回QingTian Enclave应用程序。QingTian Enclave应用程序使用priKey对接收到的密文数据进行解密。
示例代码可以参考:https://gitee.com/HuaweiCloudDeveloper/huawei-qingtian/tree/master/enclave/qtsm-sdk-c/samples。