本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
Inclavare Containers是工业界首个面向机密计算场景的开源容器运行时,它在基于硬件的可信执行环境中启动受保护的容器,以防止不受信任的实体(例如:云服务商)访问您的敏感数据。在基于SGX的机密计算环境中,您可以基于Inclavare Containers灵活、便捷地部署机密容器。本文主要为您介绍如何在Docker中基于Inclavare Containers部署和使用机密容器(简称Inclavare Containers机密容器)。
前提条件
已创建一台使用Alibaba Cloud Linux镜像的安全增强型实例。
创建安全增强型实例时,您需要选择特定的镜像以生效安全特性。更多信息,请参见创建可信实例。例如,创建ECS实例时,实例规格选择安全增强型ecs.g7t、公共镜像选择Alibaba Cloud Linux 3.2104 64位 UEFI版进行创建。
在已创建的安全增强型实例中构建SGX加密计算环境。具体操作,请参见构建SGX加密计算环境。
背景信息
在Docker中虽然可以使用常规技术部署和使用机密容器,但需要您掌握机密计算领域的专业知识,并按照SGX SDK应用开发规范开发和构建镜像。而Inclavare Containers能帮您省去这些复杂过程,降低机密计算的使用门槛,灵活对接不同类型的Enclave运行时形态,同时保持和普通容器一样的使用体验。更多信息,请参见inclavare-containers。
操作步骤
步骤一:搭建Inclavare Containers机密容器运行环境
登录安全增强型实例。
具体操作,请参见连接方式概述。
安装rune。
rune是符合OCI Runtime规范的命令行工具,用于在容器里创建和运行Enclave。更多信息,请参见rune和runtime-container。
不同发行版的Alibaba Cloud Linux安装命令也不同,具体说明如下:
如果您使用的是Alibaba Cloud Linux 2.1903 LTS 64位 UEFI版操作系统,需运行以下命令安装rune:
sudo yum-config-manager --add-repo https://mirrors.openanolis.cn/inclavare-containers/alinux2-repo && \ sudo rpm --import https://mirrors.openanolis.cn/inclavare-containers/alinux2-repo/RPM-GPG-KEY-rpm-sign && \ sudo yum install -y rune
如果您使用的是Alibaba Cloud Linux 3.2104 64位 UEFI版操作系统,需运行以下命令安装rune:
sudo yum-config-manager --add-repo https://mirrors.openanolis.cn/inclavare-containers/alinux3-repo && \ sudo rpm --import https://mirrors.openanolis.cn/inclavare-containers/alinux3-repo/RPM-GPG-KEY-rpm-sign && \ sudo yum install -y rune
运行以下命令,查看rune是否安装成功。
which rune
返回结果如下所示,表示rune已安装成功。
/usr/local/bin/rune
运行以下命令,安装Occlum软件栈。
Occlum是Inclavare Containers当前支持的Enclave运行时,而Inclavare Containers需要Enclave运行时的配合才能运行机密容器。更多信息,请参见occlum。
sudo yum install -y occlum-pal
运行以下命令,查看Occlum是否安装成功。
ls /opt/occlum/build/lib
返回结果如下所示,表示Occlum已安装成功。
libocclum-pal.so.0.21.0
步骤二:为Docker配置OCI运行时rune
安装Docker。
具体操作,请参见部署Docker。
为Docker配置OCI运行时rune。
运行以下命令,在Docker配置文件中添加rune的相关配置。
例如,系统内的Docker配置文件/etc/docker/daemon.json。
sudo mkdir -p /etc/docker && \ sudo tee /etc/docker/daemon.json > /dev/null <<EOF { "runtimes": { "rune": { "path": "/usr/local/bin/rune", "runtimeArgs": [] } } } EOF
运行以下命令,重启Docker守护进程。
警告默认情况下,当Docker守护进程终止时,它会关闭正在运行的容器。建议您在重启Docker守护进程之前,启用live restore功能以确保守护进程不可用时容器仍在运行。更多信息,请参见Keep containers alive during daemon downtime。
sudo systemctl restart docker
运行以下命令,检查rune容器运行时是否成功配置。
sudo docker info | grep rune
如果您使用的是Alibaba Cloud Linux 2.1903 LTS 64位 UEFI版操作系统,返回结果如下所示,表示rune容器运行时成功配置。
Runtimes: rune io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
如果您使用的是Alibaba Cloud Linux 3.2104 64位 UEFI版操作系统,返回结果如下所示,表示rune容器运行时成功配置。
Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc rune
步骤三:构建Inclavare Containers机密容器镜像
运行以下命令,启动Occlum开发镜像。
该操作是为了确保后续构建机密容器镜像的步骤都在Occlum开发镜像里进行。关于Occlum开发镜像的更多信息,请参见occlum 0.21.0。
sudo mkdir "$HOME/rune_workdir" && \ sudo docker run -it --privileged \ -v /dev/sgx_enclave:/dev/sgx/enclave \ -v /dev/sgx_provision:/dev/sgx/provision \ -v "$HOME/rune_workdir":/root/rune_workdir \ occlum/occlum:0.21.0-ubuntu18.04
运行以下命令,编写测试用的Hello World代码。
cd /root/rune_workdir && \ cat << EOF > hello_world.c #include <stdio.h> #include <unistd.h> void main(void) { while (1) { printf("Hello World!\n"); fflush(stdout); sleep(5); } } EOF
构建并打包Hello World可信应用。
运行以下命令,使用Occlum工具链编译程序。
occlum-gcc -o hello_world hello_world.c
运行以下命令,初始化Occlum instance。
occlum new occlum_instance
运行以下命令,生成Occlum FS image和Occlum SGX Enclave。
cd occlum_instance && \ cp ../hello_world image/bin/ && \ openssl genrsa -aes128 -out occlum_key.pem -3 3072 && \ occlum build --sign-key occlum_key.pem
运行命令后,请根据如下提示信息设置合适的保护密码,密码将用于加密保护签名私钥。
Enter pass phrase for occlum_key.pem: Verifying - Enter pass phrase for occlum_key.pem:
运行以下命令,设置Production Enclave。
Occlum默认会生成Debug Enclave,因此在实际业务环境中,你需要参考以下命令将Enclave设置为Production Enclave。关于Debug Enclave和Production Enclave的区别,请参见debugging-intel-sgx-enclaves-in-windows-737361.pdf。
sed -i 's/"debuggable": true/"debuggable": false/g' Occlum.json
当您运行以上命令修改Occlum.json配置文件后,您还需要重新执行以下命令生成Production Enclave。
occlum build --sign-key occlum_key.pem
运行以下命令,打包Hello World可信应用,并将可信应用拷贝到rune_workdir目录。
occlum package occlum_instance.tar.gz && \ cp occlum_instance.tar.gz /root/rune_workdir
构建机密容器镜像。
运行以下命令,退出Occlum开发镜像。
exit
运行以下命令,编写Dockerfile。
cd $HOME/rune_workdir && \ sudo tee Dockerfile > /dev/null <<EOF FROM scratch ADD occlum_instance.tar.gz / ENTRYPOINT ["/bin/hello_world"] EOF
运行以下命令,构建机密容器镜像。
sudo docker build . -t occlum-app
步骤四:使用Inclavare Containers机密容器
运行以下命令,运行Inclavare Containers机密容器,并查看容器运行日志。
sudo docker run -it --rm --runtime=rune \
-e ENCLAVE_TYPE=intelSgx \
-e ENCLAVE_RUNTIME_PATH=/opt/occlum/build/lib/libocclum-pal.so.0.21.0 \
-e ENCLAVE_RUNTIME_ARGS=occlum_instance \
-e ENCLAVE_RUNTIME_LOGLEVEL="off" \
-e OCCLUM_RELEASE_ENCLAVE=1 \
occlum-app
以上命令中相关参数说明如下:
ENCLAVE_TYPE:指定要使用的Enclave硬件类型,当前验证环境请选择类型为intelSgx。
ENCLAVE_PATH:指定要启动的Enclave运行时PAL的路径。
ENCLAVE_ARGS:指定Enclave运行时PAL的特定参数。如果有多个参数,需用半角逗号(,)分隔。
ENCLAVE_RUNTIME_LOGLEVEL:指定Enclave运行时的日志等级。
OCCLUM_RELEASE_ENCLAVE:指定Enclave类型。设置为0表示为Debug Enclave,设置为1表示为Production Enclave。
输出结果如下所示,如果容器日志每隔5s打印一行Hello World!
,则表示Inclavare Containers环境安装成功且机密容器也被正常运行。
Hello World!
Hello World!
Hello World!