QingTian Enclave-KMS接口调用和权限配置实践

测试智商的网站 14小时前 阅读数 8144 #在线测试

准备工作

  1. 购买一台c7t实例虚拟机,勾选Enclave选项

    目前Enclave只在上海一、新加坡、土耳其局点支持

  2. 下载必要外围组件
    yum install qingtian-tool virtio-qtbox qt-enclave-bootstrap -y

  • qingtian-tools用于管理enclave生命周期
  • virtio-qtbox 安装enclave相关驱动
  • qt-enclave-bootstrap 包含enclave镜像文件制作的必要文件
  1. 配置enclave隔离资源,并进行资源隔离
    vim /etc/qingtian/enclave/qt-enclave-env.conf

    建议一次性隔离出较大内存资源预留给Enclave使用,避免反复隔离,造成系统内存碎片化,隔离服务重启失败
    启动资源隔离服务:
    systemctl start qt-enclave-env
    如果出现隔离服务失败,无法申请到足够内存,可能存在内存碎片,推荐重启虚拟机,再执行隔离服务

  2. 安装必要python包
    pip3 install docker knack

  3. 安装docker和git
    yum install docker git -y

实践步骤

本次实践主要是测试enclave-kms接口,具体操作步骤如下:

从gitee仓库下载huawei-qingtian-enclave代码

git clone https://gitee.com/heathjay/huawei-qingtian.git
本实例以qtsm-java-sdk为例,请切到newjay-java-sdk分支
git checkout newjay-java-sdk
** 参考该实例测试**:

根据用例,获取相关参数:

参数名称 含义 获取方式
ak Access Key Id 参考获取AK、SK章节
sk Secret Access Key 参考获取AK、SK章节
project_id 项目ID
key_id KMS中的keyID
host KMS endpoint

上述参数需要填入测试文件中:
huawei-qingtian/enclave/qtsm-sdk-java/kms-cms-java/com/huawei/src/test/TestKmsCmsProxy.java

创建身份策略

出于权限最小化考虑,我们通常是在根账户下创建一个IAM新用户,然后获取其AK、SK凭证,然后通过后面的权限策略控制,使其权限最小化。
假设目前您在跟账号下操作

  1. 打开IAM服务

  2. 使用新版控制台

  3. 新建身份策略enclave-test-kms-api

    可以通过勾选的方式去配置权限策略,也可拷贝我下面的权限控制策略到策略json表达框中

{
  "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"
      ]
    }
  ]
}

Note: 其中PCR0和PCR8的值需要制作完Enclave镜像后,进行配置

比如我们在这里创建了enclave-test-kms-api的权限策略

创建用户并进行权限配置

  1. 新建用户enclave-test-kms-uers

  2. 权限配置:

    一个名为enclave-test-kms-uers用户创建成功;

  3. 获取enclave-test-kms-uers用户的AK、SK (仅做测试参考)

3.1 点击下载后,AK、SK就存在本地文件中:

  1. 将AK、SK赋值给测试程序的对应参数
    赋值给该文件huawei-qingtian/enclave/qtsm-sdk-java/kms-cms-java/com/huawei/src/test/TestKmsCmsProxy.java中对应的ak、sk字符串

获取kms的endpoint节点

可以使用该网站查询对应region的endpoint节点:

例如,博主的虚拟机在新加坡局点,则其kms endpoint为kms.ap-southeast-3.myhuaweicloud.com

kms.ap-southeast-3.myhuaweicloud.com赋值给该文件huawei-qingtian/enclave/qtsm-sdk-java/kms-cms-java/com/huawei/src/test/TestKmsCmsProxy.java中对应的host字符串变量:

获取projectID

将对应的projectID赋值给该文件huawei-qingtian/enclave/qtsm-sdk-java/kms-cms-java/com/huawei/src/test/TestKmsCmsProxy.java中对应的uriPrefix字符串变量:

获取KeyID

打开DEW服务

打开KMS服务,并创建密钥,获取keyid

将keyid赋值给该文件huawei-qingtian/enclave/qtsm-sdk-java/kms-cms-java/com/huawei/src/test/TestKmsCmsProxy.java中对应的uriPrefix字符串变量:

使用该key加密一段明文,如hello world!

并将密文填写到该文件huawei-qingtian/enclave/qtsm-sdk-java/kms-cms-java/com/huawei/src/test/TestKmsCmsProxy.java中对应的dataInputStr中:

构建镜像

进入到huawei-qingtian/enclave/qtsm-sdk-java/kms-cms-java/scripts目录,执行sh build_image.sh脚本

在该目录下就有了一个kms-demo.eif,其pcr0和pcr8的值为:

{
	"digest":	"SHA384",
	"PCR0":	"bb1a69bfe48a701a336a20fc5c9b678daebba4314b412b9574c2c2deb3a7a44ce03709122d5065f03b3bfe93ac05c870",
	"PCR8":	"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
}

生成镜像签名密钥和公钥

openssl ecparam -out private-key.pem -name secp384r1 -genkey
openssl req -new -key private-key.pem -out ssl.csr
openssl x509 -re1 -days 365 -in ssl.csr -signkey private-key.pem -out server.pem

启动proxy工具

/usr/local/bin/qingtian/enclave/qt_proxy -l 8000 -a kms.ap-southeast-3.myhuaweicloud.com -p 443 &

启动Enclave

qt enclave start --cpus 2 --mem 8192 --eif kms-demo.eif --cid 4

使用nc-vsock工具登录enclave,进行调试

因为该用例中,在enclave中启动了一个vsock的服务端(监听9999端口),所以可以从父虚拟机内通过vsock的客户端登陆到enclave中,执行命令(huawei-qingtian/enclave/qtsm-sdk-java/kms-cms-java/scripts/build_kms_demo.sh)进行调试。
使用nc-vsock进入enclave
huawei-qingtian/nc-vsock/nc-vsock 4 9999

在enclave里面执行:

cd /home/builder/enclave/qtsm-sdk-java/kms-cms-java/target
# We can perform it manually
java -cp .:../lib/lombok-1.18.26.jar:../lib/junit-4.13.1.jar -Djava.library.path=./lib com.huawei.src.test.TestKmsCmsProxy

直接执行的时候,会发现该用户无权限,所以得按照镜像的PCR0和PCR8修改策略

修改策略,大概30s-90s生效

重新执行命令,kms接口调通
解密接口:

生成数据密钥接口:

生成随机数接口:

  • 随机文章
  • 热门文章
  • 热评文章
热门