Dockerコンテナを実用レベルにする方法のひとつに,不変(immutable)すなわち読み取り専用にすることがある。その他のコンテナをセキュアに運用する手段としては,攻撃面の最小化や,Linuxの標準的な堅牢化手順とコンテナ環境に特有の手法を併用するものなどがある。
起動時に --read-only フラグを渡せば,コンテナを読み取り専用モードで実行することが可能になる。これにより,すべてのプロセスによるファイルシステムへの書き込みが禁止され,書き込み処理に対してはエラーが返される。このような不変インフラストラクチャによる運用は,ソフトウェアデプロイメントパイプラインの他のベストプラクティスとも関係がある。
このような不変性は,悪意のあるスクリプトの実行や,コンテナ内で実行する他のソフトウェアに内在する脆弱性を介した変更の発生を防止できるはずだが,現実の世界において,このようなモードで実行可能なアプリケーションはどの程度あるのだろうか?アプリケーションがログファイルの生成やデータベースの使用を行なうには,書き込みが可能であることが必要なのだ。
ログに関して考えられるソリューションのひとつは,Elasticsearch/Logstash/Kibana (ELK)といった集中ログシステムを使用することだ。この構成では,すべてのログはエンドユーザが直接アクセスできない中央的な場所,通常は別のコンテナに収集される。他の方法として,コンテナ起動時に--log-drivergフラグを使って,コンテナ外部にログをエクスポートすることも可能だ。/tmpなどテンポラリディレクトリへの書き込みアクセスが必要なアプリケーションに対しては,このようなディレクトリ用として,コンテナにテンポラリファイルシステムをマウントするというソリューションがある。
データベースはエンドユーザが直接アクセスしないため,リスクとしては高くはないが,ユーザ側のアプリケーションを堅牢にしなければ,攻撃の可能性を排除することはできない。
書き込み可能なファイルシステムがどうしても必要な場合には,Dockerが変更監査およびロールバック機能を提供する。Dockerコンテナのファイルシステムは,いくつかのレイヤを積み上げたものだ。新たなコンテナが生成されると,書き込み可能なレイヤが新たに積み上げられる。Dockerストレージドライバが裏側でこれを隠蔽し,ユーザには通常のファイルシステムとして見せているのである。実行中のコンテナに対する書き込みは,この新たなレイヤに対して行われる。この仕組みは,一般的にコピーオンライト(COW)と呼ばれるものだ。
Dockerコンテナでは,コンフィギュレーションドリフト,あるいは予想されるコンフィギュレーションからの変更を検出することは難しくない。ファイルシステムに対するファイルの追加,削除,更新などの変更は,‘docker diff’コマンドによって表示することができる。
可能ならば読み取り専用コンテナを運用する,ということに加えて,セキュアなコンテナを運用するその他の推奨事項としては,次のような項目があげられる。
- Alpine Linuxなど最小限のイメージを実行すること。Alpine Linuxはセキュリティを考慮して設計されたLinuxで,カーネルにはgrsecurityの非公式パッチが適用されている。grsecurityはLinuxカーネルに対するセキュリティ拡張のセットで,脆弱性に基づいたアクセス制御とメモリ破壊による脆弱性の解消が含まれており,システムの攻撃方法を最小限に抑制する。
- DoS攻撃を防ぐための,リソース(CPU/RAM)制限の実施。
- オペレーティングシステム内のスレッドやプロセスの制限の設定。
- sysctlの堅牢化など,標準的なLinuxカーネル強化手段の適用。
- コンテナ毎に単一のアプリケーションを実行すること。これが推奨されるのは,コンテナの攻撃面を低減するためである。すなわち,コンテナで実行されるアプリケーションの脆弱性の数によって,そのコンテナに存在する可能性のある脆弱性の数も制限されるからだ。
この記事を評価
- 編集者評
- 編集長アクション