本文中含有需要您注意的重要提示信息,忽略該信息可能對您的業務造成影響,請務必仔細閱讀。
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!