基本情報
AWS Nitroは、AWS EC2インスタンスの基盤となる革新的な技術 のスイートです。Amazonによってセキュリティ、パフォーマンス、信頼性を向上させるために 導入され、Nitroはカスタムハードウェアコンポーネントと軽量ハイパーバイザー を活用しています。従来の仮想化機能の多くを専用のハードウェアとソフトウェアに抽象化し、攻撃面を最小限に抑え 、リソース効率を改善します。仮想化機能をオフロードすることで、NitroはEC2インスタンスにほぼベアメタルのパフォーマンス を提供し、リソース集約型アプリケーションに特に有益です。さらに、Nitroセキュリティチップはハードウェアとファームウェアのセキュリティを確保 し、その堅牢なアーキテクチャをさらに強化します。
Nitro Enclaves
AWS Nitro Enclaves は、Amazon EC2インスタンス内にある安全で隔離されたコンピューティング環境 を提供し、特に高度に機密性の高いデータの処理のために設計されています。AWS Nitroシステムを活用することで、これらのエンクレーブは堅牢な隔離とセキュリティ を確保し、PIIや財務記録などの機密情報を扱う のに理想的です。ミニマリスト環境を特徴としており、データ漏洩のリスクを大幅に低減します。さらに、Nitro Enclavesは暗号的証明をサポートしており、ユーザーが認可されたコードのみが実行されていることを確認できるため、厳格なコンプライアンスとデータ保護基準を維持するために重要です。
Nitro EnclaveイメージはEC2インスタンス内から実行され 、AWSウェブコンソールからはEC2インスタンスがNitro Enclaveでイメージを実行しているかどうかは確認できません。
Nitro Enclave CLIのインストール
すべての指示に従ってくださいドキュメントから 。ただし、最も重要なものは次のとおりです:
Copy # Install tools
sudo amazon-linux-extras install aws-nitro-enclaves-cli -y
sudo yum install aws-nitro-enclaves-cli-devel -y
# Config perms
sudo usermod -aG ne $USER
sudo usermod -aG docker $USER
# Check installation
nitro-cli --version
# Start and enable the Nitro Enclaves allocator service.
sudo systemctl start nitro-enclaves-allocator.service && sudo systemctl enable nitro-enclaves-allocator.service
Nitro Enclave Images
Nitro Enclaveで実行できるイメージは、dockerイメージに基づいているため、次のようなdockerイメージからNitro Enclaveイメージを作成できます:
Copy # You need to have the docker image accesible in your running local registry
# Or indicate the full docker image URL to access the image
nitro-cli build-enclave --docker-uri < docker-im g > : < ta g > --output-file nitro-img.eif
Nitro Enclave イメージは拡張子 eif
(Enclave Image File) を使用しています。
出力は次のようになります:
Copy Using the locally available Docker image...
Enclave Image successfully created.
{
"Measurements": {
"HashAlgorithm": "Sha384 { ... }",
"PCR0": "e199261541a944a93129a52a8909d29435dd89e31299b59c371158fc9ab3017d9c450b0a580a487e330b4ac691943284",
"PCR1": "bcdf05fefccaa8e55bf2c8d6dee9e79bbff31e34bf28a99aa19e6b29c37ee80b214a414b7607236edf26fcb78654e63f",
"PCR2": "2e1fca1dbb84622ec141557dfa971b4f8ea2127031b264136a20278c43d1bba6c75fea286cd4de9f00450b6a8db0e6d3"
}
}
Run an Image
ドキュメント によると、エンクレーブイメージを実行するには、eif
ファイルのサイズの少なくとも4倍のメモリを割り当てる必要があります 。ファイル内でそれに与えるデフォルトリソースを構成することが可能です。
Copy /etc/nitro_enclaves/allocator.yaml
常に親EC2インスタンスのためにいくつかのリソースを予約する必要がある ことを忘れないでください!
イメージに与えるリソースを知り、設定ファイルを変更した後、次のコマンドでエンクレーブイメージを実行することが可能です:
Copy # Restart the service so the new default values apply
sudo systemctl start nitro-enclaves-allocator.service && sudo systemctl enable nitro-enclaves-allocator.service
# Indicate the CPUs and memory to give
nitro-cli run-enclave --cpu-count 2 --memory 3072 --eif-path hello.eif --debug-mode --enclave-cid 16
エンクレーブの列挙
EC2ホストを侵害した場合、次のコマンドで実行中のエンクレーブイメージのリストを取得することができます:
Copy nitro-cli describe-enclaves
それは実行中のエンクレーブイメージ内でシェルを取得することは不可能 です。なぜなら、それがエンクレーブの主な目的だからです。しかし、--debug-mode
パラメータを使用した場合、次のコマンドでそのstdout を取得することが可能です:
Copy ENCLAVE_ID = $( nitro-cli describe-enclaves | jq -r ".[0].EnclaveID" )
nitro-cli console --enclave-id ${ENCLAVE_ID}
Terminate Enclaves
攻撃者がEC2インスタンスを侵害した場合、デフォルトではその中にシェルを取得することはできませんが、次のコマンドで終了させる ことができます:
Copy nitro-cli terminate-enclave --enclave-id ${ENCLAVE_ID}
Vsocks
エンクレーブ で実行されているイメージと通信する唯一の方法は、vsocks を使用することです。
バーチャルソケット (vsock) は、Linuxで特に設計されたソケットファミリーで、仮想マシン (VMs ) とその ハイパーバイザー 、またはVM同士の 通信 を促進します。Vsockは、ホストのネットワーキングスタックに依存せずに効率的な 双方向通信 を可能にします。これにより、ネットワーク構成がなくてもVM同士が通信でき、32ビットのコンテキストID (CID) とポート番号 を使用して接続を識別および管理します。vsock APIは、TCPおよびUDPに似たストリームおよびデータグラムソケットタイプの両方をサポートし、仮想環境におけるユーザーレベルのアプリケーションにとって多用途なツールを提供します。
したがって、vsockアドレスは次のようになります:<CID>:<Port>
エンクレーブ で実行されているイメージの CIDs を見つけるには、次のコマンドを実行して EnclaveCID
を取得できます:
Copy nitro-cli describe-enclaves
[
{
"EnclaveName" : "secure-channel-example" ,
"EnclaveID" : "i-0bc274f83ade02a62-enc18ef3d09c886748" ,
"ProcessID" : 10131,
"EnclaveCID" : 16,
"NumberOfCPUs" : 2,
"CPUIDs" : [
1,
3
],
"MemoryMiB" : 1024,
"State" : "RUNNING" ,
"Flags" : "DEBUG_MODE" ,
"Measurements" : {
"HashAlgorithm" : "Sha384 { ... }" ,
"PCR0" : "e199261541a944a93129a52a8909d29435dd89e31299b59c371158fc9ab3017d9c450b0a580a487e330b4ac691943284" ,
"PCR1" : "bcdf05fefccaa8e55bf2c8d6dee9e79bbff31e34bf28a99aa19e6b29c37ee80b214a414b7607236edf26fcb78654e63f" ,
"PCR2" : "2e1fca1dbb84622ec141557dfa971b4f8ea2127031b264136a20278c43d1bba6c75fea286cd4de9f00450b6a8db0e6d3"
}
}
]
Vsockサーバー/リスナー
ここにいくつかの例があります:
シンプルなPythonリスナー```python #!/usr/bin/env python3
From
https://medium.com/@F.DL/understanding-vsock-684016cf0eb0
import socket
CID = socket.VMADDR_CID_HOST PORT = 9999
s = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) s.bind((CID, PORT)) s.listen() (conn, (remote_cid, remote_port)) = s.accept()
print(f"Connection opened by cid={remote_cid} port={remote_port}")
while True: buf = conn.recv(64) if not buf: break
print(f"Received bytes: {buf}")
Copy </details>
```bash
# Using socat
socat VSOCK-LISTEN:<port>,fork EXEC:"echo Hello from server!"
Vsock クライアント
例: