在Ubuntu18.04中安装sgx驱动以及开发者套件SDK并在docker中启用SGX

Ubuntu和docker中开发SGX程序

本文将详细总结2023年配置SGX环境, 使其在Ubuntu下的docker中正常运行的方法. 包括环境检查、Ubunt下SGX环境安装过程、Docker下环境安装过程、总结。其中在docker容器中使用enclave需要完成第二章节Ubuntu下SGX这一前置任务。其他非Ubuntu发行版本的Linux安装方法与Ubuntu并不完全一致,请谨慎参考。

1环境检查

克隆github上的环境检查库,

git clone https://github.com/ayeks/SGX-hardware.git
# 中文gitee地址https://gitee.com/Chiliad-Spring/SGX-hardware.git
cd SGX-hardware
gcc test-sgx.c -o test-sgx
./test-sgx

当且仅当,上述命令的运行结果与下图近似,特别是标红部分一摸一样的情况下,本文的后续步骤保证有效。其他情况本文建议你继续网上冲浪寻找解决办法

2Ubuntu下SGX驱动和SGX安装

uname -r 查看内核版本,若内核版本低于5.11;需要手动安装SGX Driver,建议升级内核版本到>=5.11方便进行下面的教程。另外在笔者升级Ubunt内核的过程中,发现Ubuntu的内核版本如果从一个很低的版本如笔者的(v4..)升级到>=5.12会出现linux-headers-5.12.0generic depends on libc6 (>= 2.33); however ** system is 2.27-3ubuntu1.6这样的依赖报错,为了避免这样的错误,经过多次实验,笔者将Ubunt18.04的系统升级到内核5.11.0. 下面为内核升级用到的工具与命令。

升级内核到5.11.0

升级内核的过程需要重启电脑,在计算机重启的过程中可以顺便检查一下电脑的BIOS有没有enable Intel SGX,如果没有enable可以趁机enable一下。
如果升级内核或者重启服务器实在不方便,可以采用手动安装SGX-DRIVER的方式,具体参考链接文章Intel_SGX_SW_Installation_Guide_for_Linux.

mkdir auto-upgrade && cd auto-upgrade/
git clone https://github.com/pimlie/ubuntu-mainline-kernel.sh.git
cd ubuntu-mainline-kernel.sh/
sudo mv ubuntu-mainline-kernel.sh /usr/local/bin/
sudo ubuntu-mainline-kernel.sh -i v5.11.0
# 该命令将重启计算机,请谨慎操作
sudo reboot
# 安装了错误的内核版本可以使用类似的方法卸载 
# sudo ubuntu-mainline-kernel.sh -u 5.12.0

安装DCAP驱动包

这个步骤的作用暂不清楚, 但是照做就对了. 具体信息参考intel-software-guard-extensions-data-center-attestation-primitives-quick-install-guide

mkdir ~/sgx/dcap && cd ~/sgx/dcap
wget https://download.01.org/intel-sgx/sgx-dcap/1.8/linux/distro/ubuntu18.04-server/sgx_linux_x64_driver_1.36.bin
sudo chmod 777 ./sgx_linux_x64_driver_1.36.bin
sudo ./sgx_linux_x64_driver_1.36.bin

安装PSW

SGX平台软件(PSW)是代码和实用程序的主体,大致实现以下功能:

  • 加载安全区内存映像。
  • 安全区映像的初始化。
  • 将 ECALL 执行到安全区映像中,以及由这些 ECALL 生成的任何 OCALL。
  • 实现对安全区异常条件的处理。
  • 实现对平台服务的请求。
  • 调解 EPID 私钥的预配。
  • 支持远程证明报价的传输和接收。
echo 'deb [arch=amd64] https://download.01.org/intel-sgx/sgx_repo/ubuntu bionic 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 install aptitude
sudo aptitude install libsgx-launch libsgx-urts
sudo aptitude install libsgx-epid libsgx-urts
sudo aptitude install libsgx-quote-ex libsgx-urts

安装SDK

mkdir -p /opt/intel/
wget 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 777 ./sgx_linux_x64_sdk_2.11.100.2.bin
./sgx_linux_x64_sdk_2.11.100.2.bin
vi ~/.bashrc

之后会打开vi编辑器,再打开窗口中任一空白行粘贴如下内容

export sgx_path=/opt/intel/
export SGX_SDK=${sgx_path}/sgxsdk
export PATH=$PATH:$SGX_SDK/bin:$SGX_SDK/bin/x64
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$SGX_SDK/pkgconfig
if [ -z "$LD_LIBRARY_PATH" ]; then
     export LD_LIBRARY_PATH=$SGX_SDK/sdk_libs
else
     export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$SGX_SDK/sdk_libs
fi

esc并:wq之后退出到命令行界面,使得该项环境变量更改在当前终端session中生效的命令为

source ~/.bashrc

验证安装是否成功

cd ${sgx_path}/sgxsdk/SampleCode/SampleEnclave
make && ./app

成功运行将输出
image

在docker中使用SGX

根据个人需求,笔者需要使用ego来利用go语言开发SGX程序,因此自行打包了ego-image:v0.1;使用命令为

sudo docker run -itd hangyuntang/ego-image:v0.1
sudo docker ps
# 通过docker ps查看ego-image运行的容器id。本例子中是818,需要你自行替换。
sudo docker exec -it 818 /bin/bash

接下来的命令将在docker中运行

cd ego/samples/helloworld
ego-go build
ego-go sign
ego sign helloworld
./helloworld 

命令成功运行将有如下输出
image
更多ego文档请参考ego-github主页

总结

Linux中国提供的Ubuntu内核更新方法就是坑爹,无论是apt upgrade .-generic还是手动更新都非常坑爹,会出现各种依赖报错(只能说感觉像是更新包没安装全)。建议使用如下方式

mkdir auto-upgrade && cd auto-upgrade/
git clone https://github.com/pimlie/ubuntu-mainline-kernel.sh.git
cd ubuntu-mainline-kernel.sh/
sudo mv ubuntu-mainline-kernel.sh /usr/local/bin/
sudo ubuntu-mainline-kernel.sh -i v5.11.0
posted @ 2023-02-23 20:50  Aibot  阅读(805)  评论(0编辑  收藏  举报