Amazon Web Services ブログ

AWS Nitro Enclaves – 分離された EC2 環境で機密データを処理する

AWS Nitro システムご紹介したとき、私は次のように説明しました。

Nitro システムはさまざまな方法で組み立てることができる構成ブロックが豊富なコレクションで、コンピューティング、ストレージ、メモリ、ネットワーキングのこれまでにないほど大きな選択肢から EC2 インスタンスタイプを設計し、短期間で提供できる柔軟性をもたらします。

これまで、これらの構成ブロックを活用してこの約束を果たし、インスタンスを開始しました。いくつか例を挙げると、M5C5R5T3I3A1P3dnz1dHigh Memory インスタンスなどです。急拡大しているインスタンスのコレクションは、同様に拡大しているお客様のニーズや要件に対応できるように設計されています。

分離に関する新しい課題
金融サービス、防衛、メディア、エンターテイメント、ライフサイエンスなど、さまざまな業界からの AWS のお客様は、機密性の高いデータを AWS クラウドで日常的に処理しています。その際、社内外の脅威からクラウドを保護する必要があります。また、相互に信頼できない複数のパートナー、ベンダー、顧客、従業員が関与する複雑な状況にも対処する必要があります。今日、お客様は VPC を使用して、制御かつ制限された接続で、制限されたユーザーのみがアクセスできる、高度に分離された環境を構築しています。

Nitro Enclaves
本日より、AWS Nitro Enclaves を開始し、こうした重要なニーズに対処できるようになりました。これを使用して、Nitro システムによって稼働している任意の EC2 インスタンスで、分離された環境を切り出すことができます。Nitro システムでは、同じハードウェアで実行している複数の EC2 インスタンスを既に分離しています。Nitro Enclaves は、単一の「親」EC2 インスタンスの CPU とメモリを分離することでさらに分離し、同じインスタンスで実行している他のユーザーまたはアプリケーションから機密性の高いデータを保護します。環境はセキュアで、親 EC2 インスタンスで実行している他のアプリケーション、ユーザー、処理にはアクセスできません。極めて柔軟性が高く、要求の厳しい本番ワークロードのニーズを満たすように設計されており、分離された環境に割り当てられるメモリ容量と処理能力を完全に制御できます。

EC2 インスタンスごとに 1 つのエンクレーブを作成するためのサポートを開始しました。将来的には、複数のエンクレーブのサポートを追加する予定です。インスタンスのコアの 1 つ(ハイパースレッドプロセッサを使用するインスタンスでは 2 つの vCPU)を除くすべてと、エンクレーブ用メモリのほぼすべてを使用できます。

各エンクレーブは独立したカーネルを実行し、メモリと CPU リソースに排他的にアクセスします。エンクレーブには外部ネットワーク接続も永続的なストレージもなく、(完全な IAM アクセス許可があっても)ユーザーアクセスもありません。エンクレーブに出入りするすべてのデータは、EC2 インスタンスで終了するローカル仮想ソケット (vsock) 接続を介して移動します。

Nitro Hypervisor は、各 Nitro Enclave を作成する際に、構成証明ドキュメントを作成および署名します。このドキュメントには、暗号的に適切なブート処理の測定値を提供する一連のプラットフォーム構成レジスタ (PCR) が(主に)含まれています。これらの値は、KMS キーポリシーにアタッチされると、想定されるイメージ、OS、アプリケーション、IAM ロール、インスタンス ID がエンクレーブの作成に使用されたことを確認するために使用します。KMS はこの検証手順を実行した後、エンクレーブで実行しているコードが要求した API アクション(復号化、データキーの生成、またはランダム値の生成)を実行します。

エンクレーブの作成と使用
インスタンスは、新しい Nitro CLI を含む AMI を実行している必要があります。これらのツールは、エンクレーブをホストするインスタンスで実行するように設計されています。インスタンス自体を enclave-enabled オプションを有効にして起動する必要があります。

$ aws ec2 run-instances ...  --enclave-options Enabled=true

便宜を図って、Docker イメージを Enclave イメージ (*.eif) のベースとして使用できます。Nitro CLI リポジトリの hello の例を使用して、Docker イメージを構築します。

$ docker build hello -t hello

次に、EIF を作成します。

$ nitro-cli build-enclave --docker-uri hello:latest --output-file hello.eif

先ほど説明したように、PCR は、想定されるイメージ、カーネル、アプリケーションがエンクレーブで実行していることを確認するために使用します。EIF を構築するときに生成される 3 つの PCR を、次に示します。

  • PCR0 – イメージの SHA384 ハッシュ。
  • PCR1 – OS カーネルとブートストラップ処理の SHA384 ハッシュ。
  • PCR2 – アプリケーションの SHA384 ハッシュ。
Start building the Enclave Image...
Start building the Enclave Image...
Enclave Image successfully created.
Enclave Image successfully created.
{
  "Measurements": {
    "HashAlgorithm": "Sha384 { ... }",
    "PCR0": "951f851181bb490bd112b8ab855e40e3ac60c0dcc31e408c5b8485f85c4db276b1753b401dcc0a787ff79c2fae81b3ae",
    "PCR1": "aca6e62ffbf5f7deccac452d7f8cee1b94048faf62afc16c8ab68c9fed8c38010c73a669f9a36e596032f0b973d21895",
    "PCR2": "242201df93225622132c9f3b0c315fbc85485c6aa7a2ced2491d5a290c015c053d5d5a7028b13f3a23a22c2e529d29de"
  }
}

次に、自分のエンクレーブを起動します(テスト用にデバッグモードを使用しています)。

$ nitro-cli run-enclave --eif-path hello.eif --memory 512 --cpu-count 2 --debug-mode
Start allocating memory...
Started enclave with enclave-cid: 21, memory: 512 MiB, cpu-ids: [1, 9]
{
  "EnclaveID": "i-070d1d4d2f0389aea-enc1755616f36f444b",
  "ProcessID": 4720,
  "EnclaveCID": 21,
  "NumberOfCPUs": 2,
  "CPUIDs": [
    1,
    9
  ],
  "MemoryMiB": 512
}

自分のエンクレーブを確認できます。

$ nitro-cli describe-enclaves
[
  {
    "EnclaveID": "i-070d1d4d2f0389aea-enc1755616f36f444b",
    "ProcessID": 4720,
    "EnclaveCID": 21,
    "NumberOfCPUs": 2,
    "CPUIDs": [
      1,
      9
    ],
    "MemoryMiB": 512,
    "State": "RUNNING",
    "Flags": "DEBUG_MODE"
  }
]

コンソールの出力を確認します(これはデバッグモードでのみ利用できます)。

$ nitro-cli console --enclave-id i-070d1d4d2f0389aea-enc1755616f36f444b
Connecting to the console for enclave 21...
Successfully connected to the console.
Command line: reboot=k panic=30 pci=off nomodules console=ttyS0 i8042.noaux i8042.nomux i8042.nopnp i8042.dumbkbd random.trust_cpu=on virtio_mmio.device=4K@0xd0000000:5 virtio_mmio.device=4K@0xd0001000:6
[    0.000000] x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers'
...

[   1] Hello from the enclave side!
[   2] Hello from the enclave side!
[   3] Hello from the enclave side!
[   4] Hello from the enclave side!
[   5] Hello from the enclave side!

実際の本番シナリオでは、エンクレーブアプリケーションコードを開始するようにイメージが設定されます。このコードは、Nitro Enclaves SDK を使って KMS と通信し、キーを取り込んで受信データを復号化します。また、KMS が提供するデータキーを使用して、データが処理された後にデータを暗号化します。

エンクレーブがすべて終わったら、終了します。

$ nitro-cli terminate-enclave --enclave-id i-070d1d4d2f0389aea-enc1755616f36f444b
Successfully terminated enclave i-070d1d4d2f0389aea-enc1755616f36f444b.
{
  "EnclaveID": "i-070d1d4d2f0389aea-enc1755616f36f444b",
  "Terminated": true
}

構成証明
以上で、エンクレーブをセットアップ、実行、最終的に終了する方法を解説しました。ここで、構成証明の重要な概念についてお話しましょう。簡単に言えば、エンクレーブで実行されているイメージ、オペレーティングシステム、アプリケーションコードが、不注意のため変更されたり、改ざんされたりしていないことを確認するための処理です。先ほど説明したように、PCR 値は暗号的に適切に各要素を表します。実際の環境では、条件ステートメントの一部として PCR 値を確認する KMS キーポリシーを作成します。

"Condition": {
        "StringEqualsIgnoreCase": {
          "kms:RecipientAttestation:ImageSha384": "ecfd7aa6d1dcca1e0bba646e7d49ede2761651c68f13cee68b1141c182cd836baae37d05dd8e6260aa847369a7b27e24"
        }

AWS Certificate Manager for Nitro Enclaves は、AWS Nitro Enclaves を使って EC2 インスタンスで実行しているウェブアプリケーションやウェブサーバーで無料のパブリックおよびプライベート SSL/TLS 証明書を使用できるようにするサンプルアプリケーションです。詳細については、Nitro Enclaves Application: AWS Certificate Manager for Nitro Enclaves をご覧ください。

今すぐご利用いただけます
現在、以下の各リージョンでの Intel および AMD ベースのプロセッサでエンクレーブを追加料金なしで作成および使用できます。米国東部 (バージニア北部)米国東部 (オハイオ)米国西部 (オレゴン)欧州 (フランクフルト)欧州 (アイルランド)欧州 (ロンドン)欧州 (パリ)欧州 (ストックホルム)アジアパシフィック (香港)アジアパシフィック (ムンバイ)アジアパシフィック (シンガポール)アジアパシフィック (シドニー)アジアパシフィック (東京)南米 (サンパウロ)。まもなく、さら多くのリージョンと Graviton ベースのプロセッサへのサポートを開始する予定です。EC2 インスタンスおよび KMS へのすべての呼び出しに対して、通常の料金をお支払いいただきます。

Jeff