前言
eHSM(SGX Enclave Based Hardware Security Module)是基于 SGX Enclave 的硬件安全模块。
Cloud KMS(Key Management System)即云密钥管理系统是一个硬件-软件组合系统,为客户提供创建和管理加密密钥并控制其云服务使用的功能。
eHSM-KMS基于 Intel SGX(Software Guard eXtensions)技术,可提供几乎同等硬件保护级别的加密功能,包括密钥生成、SGX 飞地内的管理。可帮助客户建立一个定制的 KMS(密钥管理系统),该系统具有在其云环境中创建和管理加密密钥的功能。
Intel SGX的环境搭建
此步骤基于阿里云文档——构建SGX机密计算环境。介绍了如何在基于Intel® Software Guard Extensions(Intel® SGX)技术的ECS实例(下文简称为vSGX实例)中构建SGX机密计算环境,并演示如何运行示例代码以验证SGX功能。
注意:这里是只有主机支持sgx才可以进行配置,否则不能继续配置。这里如果是用阿里云的云服务器的话,则可参考阿里云官方文档——ECS实例规格族
本文采用的阿里云实例规格是ct7,安装ubuntu20.04系统,下面开始具体配置。
1.准备工作
这一步骤主要是确保系统支持且已经启用了SGX功能
1.1 检查系统是否已经开启了intel SGX
检查CPU信息
打开终端,并使用以下命令来查看CPU是否支持SGX,如果这个命令返回结果中包含"sgx"字样,那么您的CPU支持SGX技术。如果没有任何输出,那么可能不支持SGX。
cat /proc/cpuinfo | grep sgx
检查SGX模块是否已加载
SGX驱动需要在Linux内核中作为模块加载。您可以使用以下命令来检查SGX驱动模块是否已经在系统中加载,如果看到包含"sgx"的行,表示SGX模块已经加载。
lsmod | grep sgx
注意:此处只是为了检验系统中已经启用了SGX,并不能判断系统是否支持SGX。如果这里有输出则可跳过1.2,如果没有输出,那么得先考虑一下主机是支持SGX但未启用,还是根本就不支持SGX。
1.2 查看SGX的使能
1.2.1安装cpuid
sudo apt-get update && sudo apt-get install -y --no-install-recommends cpuid
cpuid是一个实用工具,它可以在命令行中显示处理器的详细信息,包括支持的特性(如SGX技术),处理器类型、型号、家族等。这对于需要精确了解其处理器功能和特性的用户非常有用,特别是在调试、系统优化或验证硬件支持特定功能时。
1.2.2检查SGX使能状态
cpuid -1 -l 0x7 |grep SGX
上图所示表示SGX已经被正确使能。SGX被正确使能后,运行SGX程序还需要SGX驱动。
说明:阿里云提供的专用镜像已经内置了SGX驱动,如果您没有使用专用镜像,请自行安装SGX驱动。
2.安装SGX驱动
SGX DCAP 是一套为数据中心和云环境设计的库和工具,主要用于支持SGX设备的远程证明(Remote Attestation)。这是一种验证技术,确保SGX enclave是真实且未被篡改的,特别适用于云服务提供者和大型企业环境。SGX DCAP 包括:
- 自定义证明和认证服务:与传统的SGX证明不同,DCAP 允许使用自定义的证明基础设施,而不是完全依赖Intel提供的服务。
- 灵活性和扩展性:DCAP 设计用于支持各种策略和安全要求,适应不同的企业和云环境。
- 密钥管理和加密服务:提供额外的安全服务,帮助管理enclave的密钥,并确保数据保密性和完整性。
SGX DCAP 适合需要在数据中心或云环境中实施定制和高级远程证明解决方案的开发者和企业。
2.1执行以下操作安装SGX驱动
a.执行以下命令,创建install_sgx_dcap.sh脚本文件
cat <<'EOF' > install_sgx_dcap.sh
#!/bin/bash
version_id=$(cat /etc/os-release|grep "VERSION_ID"|cut -d"=" -f2|tr -d "\"")
version_codename=$(cat /etc/os-release|grep "VERSION_CODENAME"|cut -d"=" -f2)
apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y build-essential dkms curl wget
if [ ! -e /dev/sgx/enclave -a ! -e /dev/sgx_enclave ]; then
dcap_version=$(curl -s https://download.01.org/intel-sgx/latest/version.xml |grep dcap| sed -r 's/.*>(.*)<.*/\1/')
dcap_files=$(curl -s https://download.01.org/intel-sgx/latest/dcap-latest/linux/SHA256SUM_dcap_${dcap_version}.cfg)
echo "${dcap_files}" | grep "ubuntu${version_id}-server" |grep "sgx_linux_x64_driver" | awk '{print $2}' | xargs -I{} curl -O -J https://download.01.org/intel-sgx/latest/dcap-latest/linux/{}
bash sgx_linux_x64_driver*.bin
else
echo "driver already installed"
fi
EOF
b.执行以下命令,运行脚本文件安装SGX驱动
sudo bash ./install_sgx_dcap.sh
2.2 检查SGX驱动安装情况
ls -l /dev/{sgx_enclave,sgx_provision}
上图所示表示已经安装SGX驱动
3 安装SGX-SDK工具
SGX SDK 是一套为开发者提供的工具和库,用于在支持SGX的硬件上开发、编译和运行SGX应用程序。SGX SDK 包括:
- 库和API:用于创建和管理SGX安全容器(称为enclaves),这些enclaves可以保护应用程序的敏感部分不受操作系统、驱动程序和其他应用程序的干扰。
- 编译器和工具链:帮助开发者将应用程序的敏感部分编译为在SGX enclave中运行的代码。
- 示例代码和文档:提供指导和参考,帮助开发者了解如何实现和利用SGX的保护特性。
SGX SDK 主要面向应用程序开发者,提供必要的工具和库来开发使用SGX技术的应用程序。使用SGX SDK,开发者可以为需要高安全性保护的数据和应用程序逻辑设计安全应用程序,这在处理金融数据、个人隐私信息等高度敏感信息时特别有用。
3.1执行以下命令,创建install_sgx_sdk.sh脚本文件
cat <<'EOF' > install_sgx_sdk.sh
#!/bin/bash
version_id=$(cat /etc/os-release|grep "VERSION_ID"|cut -d"=" -f2|tr -d "\"")
version_codename=$(cat /etc/os-release|grep "VERSION_CODENAME"|cut -d"=" -f2)
apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y build-essential dkms curl wget
dcap_version=$(curl -s https://download.01.org/intel-sgx/latest/version.xml |grep dcap| sed -r 's/.*>(.*)<.*/\1/')
linux_version=$(curl -s https://download.01.org/intel-sgx/latest/version.xml |grep linux| sed -r 's/.*>(.*)<.*/\1/')
dcap_files=$(curl -s https://download.01.org/intel-sgx/latest/dcap-latest/linux/SHA256SUM_dcap_${dcap_version}.cfg)
echo "${dcap_files}" | grep "ubuntu${version_id}-server" | awk '{print $2}' | xargs -I{} curl -O -J https://download.01.org/intel-sgx/latest/dcap-latest/linux/{}
# install sgx_sdk
bash sgx_linux_x64_sdk*.bin --prefix /opt/intel
source /opt/intel/sgxsdk/environment
# install psw
echo "deb [arch=amd64] https://download.01.org/intel-sgx/sgx_repo/ubuntu ${version_codename} main" | tee /etc/apt/sources.list.d/intelsgx.list
wget -qO - https://download.01.org/intel-sgx/sgx_repo/ubuntu/intel-sgx-deb.key | apt-key add -
apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y libsgx-launch libsgx-urts libsgx-epid libsgx-quote-ex libsgx-dcap-ql libsgx-dcap-ql-dev
systemctl enable --now aesmd.service
EOF
3.2 执行以下命令,运行脚本文件安装Intel® SGX SDK和PSW
SGX PSW(Platform Software),即“平台软件”,是指Intel SGX(Software Guard Extensions)技术中的一套运行时组件,这些组件在支持SGX的系统上提供基础的运行时和服务环境,使得SGX应用程序(特别是其安全容器,或称为enclaves)能够正常运行和交互。SGX PSW 主要包含以下几个关键部分:
- 启动服务(AE - Architectural Enclaves):这些是特殊的enclaves,负责初始化和验证其他用户创建的enclaves。例如,Launch Enclave 负责授权其他enclaves的启动和配置。
- 平台服务:提供对SGX特性的基本支持,如密钥管理和身份验证服务。这些服务允许enclaves安全地进行密钥交换、签名验证等操作。
- 驱动程序:一个内核级驱动程序,负责处理底层的硬件调用,包括内存管理和对安全enclave的访问控制。
SGX PSW 的主要功能是支持和简化在安全enclave内运行的代码的开发和执行。它处理与硬件的交互,包括内存分配和安全功能的调用,使得开发者可以专注于应用程序逻辑的实现而不必深入底层硬件操作。PSW 还负责管理和协调SGX的证明(attestation)过程,这对于确保enclave的真实性和安全性至关重要。
sudo bash ./install_sgx_sdk.sh
ehsm-kms的搭建
准备工作
安装依赖工具
sudo apt update
sudo apt install vim autoconf automake build-essential cmake curl debhelper git libcurl4-openssl-dev libprotobuf-dev libssl-dev libtool lsb-release ocaml ocamlbuild protobuf-compiler wget libcurl4 libssl1.1 make g++ fakeroot libelf-dev libncurses-dev flex bison libfdt-dev libncursesw5-dev pkg-config libgtk-3-dev libspice-server-dev libssh-dev python3 python3-pip reprepro unzip libjsoncpp-dev uuid-dev liblog4cplus-1.1-9 liblog4cplus-dev dnsutils
安装SGX SDK
wget https://download.01.org/intel-sgx/sgx-linux/2.23/as.ld.objdump.r4.tar.gz
tar -zxf as.ld.objdump.r4.tar.gz
sudo cp external/toolset/{current_distr}/* /usr/local/bin
wget https://download.01.org/intel-sgx/sgx-dcap/1.20/linux/distro/ubuntu20.04-server/sgx_linux_x64_sdk_2.23.100.2.bin
#choose to install the sdk into the /opt/intel
chmod a+x ./sgx_linux_x64_sdk_2.23.100.2.bin && sudo ./sgx_linux_x64_sdk_2.23.100.2.bin
source /opt/intel/sgxsdk/environment
安装DCAP
cd /opt/intel
wget https://download.01.org/intel-sgx/sgx-dcap/1.20/linux/distro/ubuntu20.04-server/sgx_debian_local_repo.tgz
tar xzf sgx_debian_local_repo.tgz
echo 'deb [trusted=yes arch=amd64] file:///opt/intel/sgx_debian_local_repo focal main' | sudo tee /etc/apt/sources.list.d/intel-sgx.list
wget -qO - https://download.01.org/intel-sgx/sgx_repo/ubuntu/intel-sgx-deb.key | sudo apt-key add -
sudo apt-get update
sudo apt-get install -y libsgx-enclave-common-dev libsgx-ae-qe3 libsgx-ae-qve libsgx-urts libsgx-dcap-ql libsgx-dcap-default-qpl libsgx-dcap-quote-verify-dev libsgx-dcap-ql-dev libsgx-dcap-default-qpl-dev libsgx-quote-ex-dev libsgx-uae-service libsgx-ra-network libsgx-ra-uefi
安装docker compose
sudo apt install docker-compose-plugin
docker compose --version
# Docker Compose version v2.21.0
目前这里出了些问题,我并不明白为什么intel的官方文档给出的指令出现了错误,可能是21年的文档太久远了,不过它的版本为啥会比我后面的版本高?
目前采取的安装方法如下,
sudo apt install docker-compose
docker-compose --version
# Docker Compose version v1.21.0
更新安装方法,参考Docker-从入门到实践
添加docker源
$ echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
安装
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
1.设置连接到PCCS的IP
vim /etc/sgx_default_qcnl.conf
复制下面的内容,注意修改PCCS_URL
# PCCS server address
PCCS_URL=https://1.2.3.4:8081/sgx/certification/v4/ (your pccs IP)
# To accept insecure HTTPS certificate, set this option to FALSE
USE_SECURE_CERT=FALSE
2.使用 Docker Compose 构建和运行 ehsm-kms
2.1 从github下载ehsm代码
git clone --recursive https://github.com/intel/ehsm.git ehsm && cd ehsm
2.2修改docker/.env的参数
vim docker/.env
# ======== docker/.env BEGIN ========
HOST_IP=1.2.3.4 # MUST modify it to your host IP.
PCCS_URL=https://1.2.3.4:8081 # MUST modify it to your pccs server url.
DOCKER_FILE=Dockerfile.ubuntu20 # MUST modify it to your docker file.
DKEYSERVER_PORT=8888 # (Optional) the default port of dkeyserver, modify it if you want.
KMS_PORT=9000 # (Optional) the default KMS port, modify it if you want.
TAG_VERSION=main # (Optional) the default code base is using the main latest branch, modify it to specific tag if you want.
# ======== docker/.env END ========
2.3修改docker/.env.pccs的参数
# (Optional) Modify the docker/.env.pccs configurations if PCCS service is needed
# Subscribe to Intel Provisioning Certificate Service and receive an API key
# Checkout https://api.portal.trustedservices.intel.com/provisioning-certification for more information
# ======== docker/.env.pccs BEGIN ========
API_KEY= # MUST modify it to your API key obtained from registry
# ======== docker/.env.pccs END ========
2.4开始构建并运行 docker 镜像(couchdb、dkeyserver、dkeycache、ehsm_kms_service)
cd docker && docker-compose up -d
# (Optional) If you want to start PCCS service as well, use `pccs` profile
docker-compose --profile=pccs up -d
问题1
ERROR: Invalid interpolation format for "image" option in service "ehsm_base": "${DOCKER_REPO}${DOCKER_REPO:+/}${IMAGE_NAME_EHSM_BASE}:${EHSM_VERSION_STR}"
查明应该是在~/ehsm/docker/.env中的变量未定义到环境中,所以手动配置一下
export DOCKER_REPO=intelccc
export IMAGE_NAME_EHSM_BASE=ehsm_base-dev
export EHSM_VERSION_STR=main
仍然报错,那么直接手动替换
/root/ehsm/docker/ docker-compose.yml
image: "intelccc/ehsm_base-dev:main"
#image: "${DOCKER_REPO}${DOCKER_REPO:+/}${IMAGE_NAME_EHSM_BASE}:${EHSM_VERSION_STR}"
这样可以解决但是太慢了,经过查询发现是不支持:+/的语法,所以把所有的这种用法修改为直接使用/的语法,问题解决。
image: "${DOCKER_REPO}${DOCKER_REPO:+/}${IMAGE_NAME_EHSM_BASE}:${EHSM_VERSION_STR}"
改为
image: "${DOCKER_REPO}/${IMAGE_NAME_EHSM_BASE}:${EHSM_VERSION_STR}"
#注意要把这重复的给删掉
问题2
ERROR: The Compose file './docker-compose.yml' is invalid because:
Unsupported config option for services.pccs: 'profiles'
找到/root/ehsm/docker/ docker-compose.yml中对应位置直接注释掉。
说明:在 docker-compose.yml 文件中,profiles 是 Docker Compose 版本 3.4 及以上版本引入的一个选项。它的作用是允许您定义组合(compose)文件中服务的运行配置组。通过指定 profiles,您可以控制哪些服务在执行 docker-compose up 命令时被启动,而无需启动文件中定义的所有服务。
这里是因为版本选择为3.3,后面或许可以继续改进,暂时先不管了。
问题3
pccs一直卡,先给注释掉
问题4
ehsm构建过程中有一个npm错误,安装包总是失败
在尝试多种网上的解决方案,均已失败结束后
我查找名为npm的文件时,发现似乎docker里有自己的npm了,于是就卸载了系统自带的npm。然后就构建成功了。然而它莫名其妙的,我认为不能复现成功
最终结果
更新npm问题的解决,
使用淘宝 NPM 镜像
由于国内直接使用 npm 的官方镜像是非常慢的,这里推荐使用淘宝 NPM 镜像。淘宝 NPM 镜像是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步。使用淘宝定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm。
以下命令在docker内进行,完成后记得保存到镜像
$
npm install -g cnpm --registry=https://registry.npmmirror.com
# 需要把/usr/local/nodejs/bin/cnpm链接到/usr/local/bin
$ ln -s /usr/local/nodejs/bin/cnpm /usr/local/bin
#这样就可以使用 cnpm 命令来安装模块了
$ cnpm install [name]
问题5
虽然镜像构建成功了,但是无法运行ehsm-kms服务,经过查看是sgx驱动没安装好,所以这里建议驱动还是找ehsm官方文档装吧。
查找发现是docekr里并没有成功复制到宿主机里的sgx设备,所以尝试手动复制
1.建立宿主机和docker的共享目录
docker run -v /host/file:/container/file image_name
2.将宿主机的sgx设备通过共享目录复制给docker的/dev下
3.以上尝试无效采取连接方式
docker run -i -t --device=/dev/sgx/enclave:/dev/sgx/enclave --device=/dev/sgx/provision:/dev/sgx/provision intelccc/ehsm_kms_service-dev:main
问题6:
couchdb无法连接问题
这里docker的couchdb我实在弄不明白了,所以打算直接在宿主机安装
参考如何在Ubuntu 20.04安装CouchDB
3. 调用api接口
3.1 注册 APPID 和 APIKey
curl [--insecure] https://1.2.3.4:9000/ehsm?Action=Enroll
问题
curl: (7) Failed to connect to 60.205.130.184 port 9000: Connection refused
其他
关于/usr/bin和/usr/local/bin的区别:Linux /usr/bin与/usr/local/bin使用区别
npm ERR! enoent ENOENT: no such file or directory, open ‘/opt/intel/ehsm/docker/package.json’
npm ERR! enoent This is related to npm not being able to find a file.
npm init #创建package.json文件
npm install
列出所有的容器 ID
docker ps -aq
停止所有的容器
docker stop $(docker ps -aq)
删除所有的容器
docker rm $(docker ps -aq)
删除所有的镜像
docker rmi $(docker images -q)