Ubuntu 18.04 与 Docker 环境下的 Intel SGX 开发配置指南
硬件兼容性检测
在部署 Intel SGX 环境之前,必须确认物理 CPU 支持 SGX 指令集,并且主板的 BIOS 设置中已开启 SGX 功能。为了避免依赖第三方仓库,可以直接编写 C 程序调用 CPUID 指令来检测硬件支持情况。
#include <stdio.h>
#include <cpuid.h>
int main() {
unsigned int eax, ebx, ecx, edx;
// 检查 SGX 支持状态 (Leaf 07h, Sub-leaf 0)
if (__get_cpuid_count(7, 0, &eax, &ebx, &ecx, &edx)) {
if (ebx & (1 << 2)) {
printf("当前 CPU 支持 Intel SGX 技术。\n");
} else {
printf("当前 CPU 不支持 Intel SGX 技术。\n");
}
}
return 0;
}
编译并执行该检测程序:
gcc -o verify_sgx verify_sgx.c
./verify_sgx
若输出支持信息,即可继续后续环境配置。
操作系统内核升级
Linux 内核从 5.11 版本开始原生内置了对 SGX 的支持。若当前 Ubuntu 18.04 系统的内核版本低于 5.11,需进行升级。直接使用常规的包管理器升级可能会遇到复杂的依赖冲突,推荐使用主线内核更新脚本。
WORK_DIR=$(mktemp -d)
cd "$WORK_DIR"
git clone https://github.com/pimlie/ubuntu-mainline-kernel.sh.git kernel_upgrader
cd kernel_upgrader
sudo install -m 755 ubuntu-mainline-kernel.sh /usr/local/bin/sys-kernel-upgrader
sudo sys-kernel-upgrader -i v5.11.0
sudo reboot
系统重启后,可通过 uname -r 确认内核版本已成功切换至 5.11.0。
部署 DCAP 驱动与平台软件 (PSW)
虽然高版本内核自带 SGX 驱动,但在数据中心场景下,通常还需要安装数据中心证明原语 (DCAP) 相关组件。创建独立目录并下载驱动安装包:
DRIVER_DIR="$HOME/sgx_drivers"
mkdir -p "$DRIVER_DIR" && cd "$DRIVER_DIR"
DCAP_URL="https://download.01.org/intel-sgx/sgx-dcap/1.8/linux/distro/ubuntu18.04-server/sgx_linux_x64_driver_1.36.bin"
wget -O dcap_driver_installer.bin "$DCAP_URL"
chmod +x dcap_driver_installer.bin
sudo ./dcap_driver_installer.bin
接下来配置 Intel SGX APT 软件源并安装平台软件 (PSW)。为了保证系统安全性,这里采用现代化的 GPG 密钥管理方式替代已废弃的 apt-key:
echo "deb [arch=amd64] https://download.01.org/intel-sgx/sgx_repo/ubuntu bionic main" | sudo tee /etc/apt/sources.list.d/intel-sgx-psw.list
wget -qO - https://download.01.org/intel-sgx/sgx_repo/ubuntu/intel-sgx-deb.key | gpg --dearmor | sudo tee /usr/share/keyrings/intel-sgx-archive-keyring.gpg > /dev/null
sudo sed -i 's/deb \[arch=amd64\]/deb \[arch=amd64 signed-by=\/usr\/share\/keyrings\/intel-sgx-archive-keyring.gpg\]/' /etc/apt/sources.list.d/intel-sgx-psw.list
sudo apt-get update
sudo apt-get install -y libsgx-launch libsgx-urts libsgx-epid libsgx-quote-ex
配置 SGX SDK 开发环境
下载 SGX 软件开发套件 (SDK) 并将其部署到自定义目录中。通过管道输入实现静默安装:
SDK_BASE="/opt/sgx_development"
sudo mkdir -p "$SDK_BASE"
wget -O sgx_sdk_installer.bin "https://download.01.org/intel-sgx/sgx-dcap/1.8/linux/distro/ubuntu18.04-server/sgx_linux_x64_sdk_2.11.100.2.bin"
chmod +x sgx_sdk_installer.bin
echo -e "no\n$SDK_BASE" | ./sgx_sdk_installer.bin
将 SDK 的二进制路径和库路径注入系统环境变量:
cat << 'EOF' >> ~/.bashrc
export SGX_SDK_ROOT="/opt/sgx_development/sgxsdk"
export PATH="$PATH:$SGX_SDK_ROOT/bin:$SGX_SDK_ROOT/bin/x64"
export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$SGX_SDK_ROOT/pkgconfig"
export LD_LIBRARY_PATH="${LD_LIBRARY_PATH:-}:$SGX_SDK_ROOT/sdk_libs"
EOF
source ~/.bashrc
编译官方示例代码以验证 SDK 环境配置无误:
cd "$SGX_SDK_ROOT/SampleCode/SampleEnclave"
make
./app
Docker 容器内构建 SGX 应用
在容器环境中运行 SGX 程序,必须将宿主机的 SGX 字符设备以及 AESM 守护进程套接字映射至容器内部。本例使用包含 Ego 框架的基础镜像来开发基于 Go 语言的 SGX 应用。
docker run -itd --name sgx_golang_env \
--device=/dev/sgx_enclave \
--device=/dev/sgx_provision \
-v /var/run/aesmd/aesm.socket:/var/run/aesmd/aesm.socket \
golang:1.19-buster /bin/bash
docker exec -it sgx_golang_env /bin/bash
进入容器后,使用 ego-go 工具链编译、签名并执行目标程序:
cd /workspace/secure_application
ego-go build -o enclave_app main.go
ego sign enclave_app
./enclave_app