Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rustで実装された AWS Nitro Enclaves CLIを読む

Osuke
December 07, 2020

Rustで実装された AWS Nitro Enclaves CLIを読む

Osuke

December 07, 2020
Tweet

More Decks by Osuke

Other Decks in Programming

Transcript

  1. 1
    Rustで実装された
    AWS Nitro Enclaves CLIを読む
    Osuke Sudo
    2020/12/7
    @Rust LT Online #2

    View Slide

  2. 2
    @zoom_zoomzo
    Osuke
    ソフトウェアエンジニア@LayerX
    ● 暗号技術・TEEを用いたデータのプライバシー保護・改ざん
    耐性手法の研究開発(Confidential Computing)
    ● Anonifyの開発
    ○ https://github.com/LayerXcom/anonify

    View Slide

  3. 3
    アジェンダ
    ● AWS Nitro Enclacvesとは
    ● Enclave起動までの処理の流れ
    ● EIFイメージ展開とメモリ割り当て

    View Slide

  4. 4
    ● 高度にセキュアな情報を扱うことを想定し、AWS Nitro Systemにより提供される隔離保護された実行環境
    ○ 軽量なkvmベースのハイパーバイザ + ネットワーク・ストレージのオフロード + セキュリティチッ
    プなど
    ● それぞれのEnclaveには、EC2のメモリやCPUリソースを割り当てることができ、独立したカーネルOS上
    で動作
    ● Enclaveは親EC2とのvsockのみでやりとり可能(外部のネットワークやストレージに接続することはでき
    ず、admin IAM権限でもユーザーアクセスはできない)
    AWS Nitro Enclavesとは
    https://aws.amazon.com/jp/blogs/aws/aws-nitro-enclaves-isolated-ec2-environments-to-process-confidential-data/

    View Slide

  5. 5
    Nitro Enclacve CLI
    ● Nitro-cliでdocker imageからEIF(Enclave Image File)をビルド可能
    ● EIFと割り当てるメモリ、vCPUを指定しenclaveを起動

    View Slide

  6. 6
    enclave起動までの処理
    1. 親プロセス:CLIコマンドでコミュニケーションするためのEnclave用デーモンの生成
    2. デーモン:コマンドを受け取るためのevent loopを回す
    3. 親プロセス:socketにrun-enclaveコマンドを送信
    4. デーモン:nitroデバイスファイルへVM生成コマンド送信
    5. デーモン:メモリの割り当てとEIFをメモリに書き込み
    6. デーモン:vCPUの割り当て
    7. デーモン:nitroデバイスファイルを介しenclaveをスタート
    8. 親プロセス:enclaveからのレスポンスを処理し表示
    参考:
    Rustで実装されたAWS Nitro Enclaves CLIの実装を読む
    https://qiita.com/Osuke/items/81d928bd2a46fab46cbc

    View Slide

  7. 7
    init_memory(): メモリ領域の確保
    ● Run-enclaveコマンドの引数として渡したメ
    モリサイズ分だけメモリ領域を確保
    ● それぞれのregionがhuge-pageに対応し、
    libc::mmap()により割り当て

    View Slide

  8. 8
    init_memory(): EIFイメージの展開
    ● NE_GET_IMAGE_LOAD_INFOコマンドでioctlを呼
    び、EIFイメージを展開するメモリのオフセットを
    Nitro Systemから取得
    ● 確保したメモリ領域とイメージ展開オフセットから
    実際にEIFを書き込む
    ● ページごとにNE_SET_USER_MEMORY_REGIONコ
    マンドでioctlを呼び、デバイスドライバにセット
    ○ (KVMでいうところの
    KVM_SET_USER_MEMORY_REGIONで実行
    バイナリをVMにセットしているイメージ)

    View Slide

  9. 9
    ● Rustで実装されたAWS Nitro Enclaves CLIの実装を読む
    ○ https://qiita.com/Osuke/items/81d928bd2a46fab46cbc
    ● Nitro Enclaves Command Line Interface (Nitro CLI)
    ○ https://github.com/aws/aws-nitro-enclaves-cli
    ● Deep Dive Into AWS Nitro Enclaves - AWS Online Tech Talks
    ○ https://youtu.be/K5PRNHaEdOw
    ● AWS re:Invent 2019: Powering next-gen Amazon EC2: Deep dive into the Nitro system
    (CMP303-R2)
    ○ https://youtu.be/rUY-00yFlE4
    References

    View Slide