AWS Security Hubを有効化したら、ECSのタスク定義まわりでセキュリティリスクが何点か検知されました。
今回はその中から、「コンテナのルートファイルシステムに対する読み取り専用アクセスが設定されていない」という問題を対応しました。
問題の内容
Security Hubで検出されたセキュリティリスクの内容は以下の通りです。
ECS containers should be limited to read-only access to root filesystems
This control checks if ECS containers are limited to read-only access to mounted root filesystems. This control fails if the ReadonlyRootFilesystem parameter in the container definition of ECS task definitions is set to ‘false’.
解説
この警告では、ECSタスク定義のReadonlyRootFilesystem
パラメータがfalse
に設定されていることが指摘されています。この設定が原因で、コンテナのルートファイルシステムが書き込み可能になっている状態です。
ルートファイルシステムが書き込み可能だと、以下のようなリスクがあります。
- システム設定ファイルの改ざん
- 例:
/etc/hosts
や/etc/passwd
が攻撃者によって書き換えられ、DNS解決やユーザー情報が不正に変更される
- 例:
- 実行可能ファイルの改ざん
- 例:
/usr/bin/node
や/bin/sh
が改ざんされると、意図しないコードが実行される
- 例:
- 不適切な書き込みによるリソース圧迫
- 例:
/var/log
や/dev/shm
に過剰なログや一時ファイルが書き込まれることで、メモリやストレージを使い果たしてしまう
- 例:
解決策
1. ReadonlyRootFilesystem
を有効にする
ECSタスク定義のcontainerDefinitions
セクションに以下を追加します。
"readonlyRootFilesystem": true
これにより、コンテナ全体のルートファイルシステムが読み取り専用になり、不正な書き込みや改ざんを防ぐことができます。
2. 一時ファイルへの対応
一部のアプリケーションでは、ログの出力や一時データの処理のために書き込みが必要な場合があります。このような場合、特定のディレクトリだけ書き込み可能にする設定を追加します。
ECSタスク定義で以下のようにvolumes
とmountPoints
を設定します。
まずはボリュームを定義します。Fargate環境ではhostオプションは空にします(自動的に一時ストレージが使用される)。
"volumes": [
{
"name": "temp-storage",
"host": {}
}
]
先ほど定義したボリュームを、コンテナ内の/tmp
ディレクトリにマウントします。
"mountPoints": [
{
"sourceVolume": "temp-storage",
"containerPath": "/tmp",
"readOnly": false
}
]
これにより、/tmp
ディレクトリだけが書き込み可能となり、他のルートファイルシステム部分は引き続き読み取り専用のままとなります。
注意点
アプリケーションが特定の場所(例: /var/log
や/data
)に書き込みを行っている場合は、その書き込み先を/tmp
に変更する必要があります。