すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Linux:Dockerコンテナ内のInclavareコンテナに基づく機密コンテナの使用

最終更新日:Aug 30, 2024

Inclavare Containersは、業界で初めて機密コンピューティングを目的としたオープンソースのコンテナランタイムです。 Inclavare Containersを使用すると、ハードウェアベースの信頼できる実行環境 (TEE) 内で保護されたコンテナを起動して、信頼できないクラウドサービスプロバイダー (CSP) などの信頼できないエンティティが機密データにアクセスするのを防ぐことができます。 ソフトウェアガード拡張機能 (SGX) の暗号化されたコンピューティング環境内で、Inclavareコンテナに基づいて機密コンテナをデプロイできます。 このトピックでは、DockerコンテナのInclavareコンテナに基づいて機密コンテナをデプロイして使用する方法について説明します。

前提条件

  • Alibaba Cloud Linuxイメージを使用するセキュリティ強化されたElastic Compute Service (ECS) インスタンスが作成されます。

    セキュリティ強化インスタンスを作成するときは、セキュリティ機能を使用する特定のイメージを選択する必要があります。 詳細については、「信頼できるインスタンスの作成」をご参照ください。 たとえば、ecs.g7tインスタンスタイプとAlibaba Cloud Linux 3.2104 64ビット (UEFI) パブリックイメージを選択して、セキュリティ強化されたECSインスタンスを作成できます。

  • SGX暗号化コンピューティング環境がセキュリティ強化インスタンス上に作成されます。 詳細については、「SGX機密コンピューティング環境の構築」をご参照ください。

背景情報

従来の方法を使用して、Dockerコンテナに機密コンテナをデプロイおよび使用できます。 ただし、この方法では、機密コンピューティングの専門知識と、Intel SGX SDKを使用してイメージを開発および作成する必要があります。 Inclavareコンテナは、前述の要件を排除し、機密コンピューティングに簡単にアクセスできます。 Inclavare Containersは、さまざまなタイプのエンクレーブランタイムと互換性があり、標準コンテナと機密コンテナ間で一貫したユーザーエクスペリエンスを提供します。 詳細については、inclavare-containersをご覧ください。

手順

手順1: ランタイム環境を構築して機密コンテナを実行

  1. セキュリティ強化されたECSインスタンスにログインします。

    詳細については、「接続方法の概要」をご参照ください。

  2. ルーンをインストールします。

    runeは、Open Container Initiative (OCI) ランタイム仕様に準拠したコマンドラインツールで、エンクレーブの作成と実行に使用されます。 詳細については、「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
  3. 次のコマンドを実行して、runeがインストールされているかどうかを確認します。

    which rune

    次のサンプルコマンド出力は、runeがインストールされていることを示します。

    /usr/local/bin/rune
  4. 次のコマンドを実行して、Occlumソフトウェアスタックをインストールします。

    Occlumは、Inclavare Containersによってサポートされるエンクレーブランタイムです。 機密コンテナを実行するには、Inclavareコンテナをエンクレーブランタイムと組み合わせる必要があります。 詳細については、occlmをご覧ください。

    sudo yum install -y occlm-pal
  5. 次のコマンドを実行して、Occlumがインストールされているかどうかを確認します。

    ls /opt/occlum/build/lib

    次のサンプルコマンド出力は、Occlumがインストールされていることを示します。

    libocclum-pal.so.0.21.0

手順2: DockerコンテナーのOCI準拠のランタイムルーンの設定

  1. Dockerをインストールします。

    詳細については、「LinuxインスタンスにDockerをインストールして使用する」トピックの「LinuxインスタンスにDockerをインストールして使用する」セクションをご参照ください。

  2. DockerコンテナのOCI準拠のランタイムルーンを設定します。

    1. 次のコマンドを実行して、rune設定をDocker設定ファイルに追加します。

      サンプル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デーモンを再起動する前に、ライブ復元機能を有効にすることを推奨します。 ライブ復元機能を使用すると、Dockerデーモンが終了してもコンテナは存続します。 詳細については、「ライブ復元」をご参照ください。

      sudo systemctl restart docker
    3. 次のコマンドを実行して、runeコンテナランタイムが設定されているかどうかを確認します。

      sudo docker info | grep rune
      • Alibaba Cloud Linux 2.1903 LTS 64ビット (UEFI) オペレーティングシステムの場合、次のサンプルコマンド出力は、ルーンコンテナランタイムがインストールされていることを示します。

         Runtimes: rune io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
      • Alibaba Cloud Linux 3.2104 64ビット (UEFI) オペレーティングシステムの場合、次のサンプルコマンド出力は、ルーンコンテナランタイムがインストールされていることを示します。

         Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc rune

ステップ3: 機密コンテナのイメージを作成する

  1. 次のコマンドを実行して、Occlum Dockerイメージを開始します。

    この操作により、機密コンテナのイメージを作成する後続の手順が、Occlum Dockerイメージに対して確実に実行されます。 Occlum Dockerイメージの詳細については、「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インスタンスを初期化します。

      occlum new occlum_instance
    3. 次のコマンドを実行して、Occlum FSイメージとOcclum SGXエンクレーブを生成します。

      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. 次のコマンドを実行して、本番エンクレーブを設定します。

      デフォルトでは、OcclumはDebug 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構成ファイルを変更した後、次のコマンドを実行して本番エンクレーブを生成します。

      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 Dockerイメージを終了します。

      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 occlm-app 

ステップ4: 機密コンテナを使用する

次のコマンドを実行して機密コンテナを実行し、機密コンテナの操作ログを確認します。

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 \
  occlm-app 

上記のコマンドのパラメータ:

  • ENCLAVE_TYPE: エンクレーブのハードウェアタイプを指定します。 この例では、このパラメーターはintelSgxに設定されています。

  • ENCLAVE_RUNTIME_PATH: エンクレーブランタイムPlatform Abstraction Layer (PAL) の開始パスを指定します。

  • ENCLAVE_RUNTIME_ARGS: エンクレーブランタイムPALの特定のパラメータを指定します。 複数のパラメーターはコンマ (,) で区切ります。

  • ENCLAVE_RUNTIME_LOGLEVEL: エンクレーブランタイムのログレベルを指定します。

  • OCCLUM_RELEASE_ENCLAVE: エンクレーブタイプを指定します。 このパラメーターを0に設定すると、Debug Enclaveタイプのエンクレーブが照会されます。 このパラメーターを1に設定すると、Production Enclaveタイプのエンクレーブが照会されます。

次のコマンド出力が返されます。 Inclavare Containers環境がインストールされ、機密コンテナが期待どおりに実行される場合、Hello World! は5秒ごとにコンテナログに表示されます。

Hello World!
Hello World!
Hello World!