基于Docker使用Inclavare Containers机密容器

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

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机密容器运行环境

  1. 登录安全增强型实例。

    具体操作,请参见连接方式概述

  2. 安装rune。

    rune是符合OCI Runtime规范的命令行工具,用于在容器里创建和运行Enclave。更多信息,请参见runeruntime-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
  3. 运行以下命令,查看rune是否安装成功。

    which rune

    返回结果如下所示,表示rune已安装成功。

    /usr/local/bin/rune
  4. 运行以下命令,安装Occlum软件栈。

    Occlum是Inclavare Containers当前支持的Enclave运行时,而Inclavare Containers需要Enclave运行时的配合才能运行机密容器。更多信息,请参见occlum

    sudo yum install -y occlum-pal
  5. 运行以下命令,查看Occlum是否安装成功。

    ls /opt/occlum/build/lib

    返回结果如下所示,表示Occlum已安装成功。

    libocclum-pal.so.0.21.0

步骤二:为Docker配置OCI运行时rune

  1. 安装Docker。

    具体操作,请参见部署Docker

  2. 为Docker配置OCI运行时rune。

    1. 运行以下命令,在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
    2. 运行以下命令,重启Docker守护进程。

      警告

      默认情况下,当Docker守护进程终止时,它会关闭正在运行的容器。建议您在重启Docker守护进程之前,启用live restore功能以确保守护进程不可用时容器仍在运行。更多信息,请参见Keep containers alive during daemon downtime

      sudo systemctl restart docker
    3. 运行以下命令,检查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机密容器镜像

  1. 运行以下命令,启动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
  2. 运行以下命令,编写测试用的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
  3. 构建并打包Hello World可信应用。

    1. 运行以下命令,使用Occlum工具链编译程序。

      occlum-gcc -o hello_world hello_world.c
    2. 运行以下命令,初始化Occlum instance。

      occlum new occlum_instance
    3. 运行以下命令,生成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:
    4. 运行以下命令,设置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
    5. 运行以下命令,打包Hello World可信应用,并将可信应用拷贝到rune_workdir目录。

      occlum package occlum_instance.tar.gz && \
          cp occlum_instance.tar.gz /root/rune_workdir
  4. 构建机密容器镜像。

    1. 运行以下命令,退出Occlum开发镜像。

      exit
    2. 运行以下命令,编写Dockerfile。

      cd $HOME/rune_workdir && \
      sudo tee Dockerfile > /dev/null <<EOF
      FROM scratch
      ADD occlum_instance.tar.gz /
      ENTRYPOINT ["/bin/hello_world"]
      EOF
    3. 运行以下命令,构建机密容器镜像。

      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!