Security Hub [ECS.5] ECS コンテナは、ルートファイルシステムへのアクセスを読み取り専用に制限する必要があります

背景
AWS Security Hubの「AWS基礎セキュリティのベストプラクティススタンダード」で検知された、「[ECS.5] ECS コンテナは、ルートファイルシステムへの読み取り専用アクセスに制限する必要があります」の対応が必要になった。
概要
このコントロールは、Amazon ECS コンテナが、マウントされたルートファイルシステムへの読み取り専用アクセスに制限されているかどうかをチェックします。
readonlyRootFilesystem パラメータが false に設定されているか、タスク定義内のコンテナ定義にパラメータが存在しない場合、コントロールは失敗します。
このコントロールは、Amazon ECS タスク定義の最新のアクティブなリビジョンのみを評価します。
このオプションを有効にすると、ファイルシステムフォルダとディレクトリに対する明示的な読み取り/書き込み権限がない限り、コンテナインスタンスのファイルシステムへの改ざんや書き込みができないため、セキュリティ攻撃ベクトルを減らすことができます。
このコントロールは、最小特権の原則にも準拠しています。
DockerfileのvolumeをECSホストのルートファイルシステムにマウントしようとしている。
メリット
ReadonlyRootFilesystem を有効化すると、セキュリティ上、以下の利点があります。
- コンテナ内のプロセスが意図せずにルートファイルシステムの変更を防止できます。
- 不正なコンテナの攻撃やマルウェアの拡散を制限できます。
条件
ReadonlyRootFilesystem を有効するに、以下の条件を満たす必要があります。
- アプリケーション側でルートファイルシステムへの書き込みをしていないこと
- 各種ミドルウェアや利用しているソフトウェアエージェントがルートファイルシステムへの書き込みをしていないこと
- ECS Execを利用しないこと
- ReadonlyRootFilesystem を有効にしたコンテナでは、ECS Exec を利用することはできません。
- アプリケーションの動作に影響するため、有効化の際はStorageWriteBytesなどのメトリクスも確認しながら慎重に対応する必要があります。
検討事項
- 運用でECS Execを使用しないでいられるか?
- アプリケーション、ミドルウェア等でルートファイルシステムへの書き込みはされない確証はあるか?
- 実装したアプリケーションでルートファイルシステムへの書き込みをしていなくても、一時ファイル、PID生成、ソケットファイル生成などの挙動があるためルートファイルシステムへの書き込みは避けられない?
- 特にWebサーバーだと書き込みが必要になってくる?
ルートファイルシステムへの書き込み箇所の調査方法
- 設定ファイルやDockerfileから書き込みそうな場所を探す
- read only外した状態で動かして docker diff で書き込まれた場所を探る
- 簡単だが処理後にファイルを消されれてしまうと分からない
- それでも駄目ならstraceで調べる
修正
ルートファイルシステムへの書き込みなしの場合:ReadonlyRootFilesystemの有効化
コンテナ定義をルート filesystems への読み取り専用アクセスに制限します
- Amazon ECS クラシックコンソール (https://console.aws.amazon.com/ecs/) を開きます。
- 左側のナビゲーションペインで、[タスク定義] をクリックします。
- 更新の必要なコンテナ定義を含むタスク定義をクリックします。それぞれ、以下のステップを完了します。
- ドロップダウンから、[JSON を使用した新しいリビジョンの作成] を選択します。
- readonlyRootFilesystem パラメータを追加し、タスク定義内のコンテナ定義で true に設定します。
- [Create] (作成) を選択します。
ルートファイルシステムへの書き込みなしの場合:特定パスのみ書き込み許可
ルートファイルシステムへの書き込みが必要な場合は、例えば以下の方法を使用して特定のパスのみ書き込みを許可できます。
- Dockerfile に Volume を記述してマウントする
- タスク定義の Bind mount を使用してマウントする
- EFS を利用してマウントする
可能な限り対応することが望ましいですが、アプリケーションやエージェントの仕様によっては、ファイルシステムへの書き込みが避けられず、対応しない場合も考慮する必要があります。
補足
- イメージビルド段階は書き込み可能(要はDockerfile内の処理は影響ない)
- プログラム実行時に書き込みが発生するかどうかが問題
参考

ECS Exec
- /var/lib/amazon/ssm にECS Exec時にファイル書き込みが発生する。
- readonlyRootFilesystemを有効化すると書き込みができなくなり失敗する。
- デバッグ用なので、パッチ充てる等のメンテナンスには向いていない。
- あくまで人がコンテナに入って見るためのもの。
- 代わりにSSHを立ち上げる。