コンテナセキュリティの始め方 - Buildフェーズのセキュリティ (前編)
はじめに
コンテナセキュリティの全体像をテーマとした前回は、コンテナのライフサイクルである"Build - Ship - Run"の各フェーズにどのようなセキュリティ課題が存在するのかを包括的に解説しました。
続編である今回は、Buildフェーズのセキュリティに着目し、セキュリティ課題についてより詳しく触れると共に、その対応策についても解説します。
3行でわかる本記事のサマリ
- コンテナ運用のセキュリティは、ライフサイクルの初期段階であるBuildフェーズが重要。
- コンテナ内に含まれる構成要素はそれぞれがセキュリティ脆弱性を持つ可能性があることを認識し、そのアタックサーフェスを削減することが重要。
- コンテナイメージのセキュリティレベルを可視化するために、コンテナイメージスキャナーを活用することが重要。
目次
- Buildフェーズはコンテナのセキュリティ運用の要
- セキュリティ脆弱性とアタックサーフェス
- コンテナイメージの極小化
- コンテナイメージのセキュリティレベルを可視化する
- まとめ
Buildフェーズはコンテナのセキュリティ運用の要
アプリケーションコードを準備~コンテナイメージを生成~コンテナをデプロイする、という一連のプロセスを
セキュリティの視点で考察した場合、コンテナイメージの生成は最も重要なプロセスと位置づけられます。
セキュリティ・バイ・デザインやセキュリティのシフトレフトの考え方とも共通するように、
できるだけライフサイクルの初期段階でセキュリティ対策を実行することで、セキュリティ運用レベルのベースラインを大きく引き上げることができます。
コンテナイメージの生成を担うBuildフェーズは、正にコンテナ運用の初期段階であり、
Buildフェーズのセキュリティレベルがコンテナ運用全体のセキュリティレベルに大きく影響することを認識しておく必要があります。
セキュリティ脆弱性とアタックサーフェス
コンテナの内部で実行されるアプリケーションを細分化すると、
ベースイメージ、アプリケーションコード、モジュール、パッケージ、ライブラリ、設定ファイル等、多種多様な構成要素が確認できます。
Buildフェーズのセキュリティを理解する第一歩として、それら一つ一つがセキュリティ脆弱性を持つ可能性を認識することが重要です。
また、セキュリティ脆弱性をアタックサーフェスとして利用する攻撃手法は、
コンテナ運用においても多数確認されており、アタックサーフェスをいかに削減するかも重要なポイントです。
コンテナを使用しない従来からのコンピューティング手法で課題となってきた、セキュリティ脆弱性への対応とアタックサーフェスの削減はコンテナ運用においても変わらず必要ということです。
ただし、その対応策はコンテナ運用ならではの特徴を持っており、対応策を正しく理解し、適切に実行できることが求められます。
コンテナイメージの極小化
前項で解説したように、コンテナイメージの構成要素には脆弱性を持つ可能性があり、それらはアタックサーフェスとして攻撃に利用されるリスクがあります。
この事実に対して、コンテナイメージの構成要素を極小化することで、セキュリティ対策としての効果を期待することができます。
具体的なアプローチとして大きく2つの手法が考えられます。
1つ目は、アプリケーションの実行に最適化された、より軽量なベースイメージを選定することです。
コンテナビルドのベースイメージとして利用できるパブリックなイメージレポジトリには、
アプリケーションの種類に応じて多種多様なコンテナイメージが格納されています。
ベースイメージを選定する際、それらの中からビルドするコンテナイメージが必要とする
最低限の軽量イメージを選択することで、脆弱性のリスクを極小化することができます。
イメージタグにalpineやslimの名称が付与されているイメージや、より軽量なscratchイメージの活用が一般的です。
これらのベースイメージを使用する場合、アプリケーションによっては、
ビルドに必要なライブラリやバイナリが不足する可能性があり、必要に応じてスタティックに補う運用が必要ですが、セキュリティを優先に考えると、必要不可欠な手間であると判断できます。
2つ目は、マルチステージビルドによる構成要素の極小化です。
本来コンテナテクノロジーは、特定のアプリケーションプロセスのみを実行する目的で利用されるシーンがほとんどで、
アプリケーションの実行に必要な構成要素のみに最適化された運用スタイルが理想的とされています。
構成要素を最適化しないコンテナイメージビルドを実行した場合、
コンテナイメージ内にアプリケーションプロセスが本来必要としない成果物が存在する状態となり、それらに関連する脆弱性によるセキュリティリスクが高まります。
マルチステージビルドでコンテナイメージビルドを実行することで、アプリケーションビルドによって生成された中間成果物の中から、アプリケーションプロセスが必要とする最低限の構成要素のみを厳選し、最終的なコンテナイメージに実装することが可能です。
この一連のプロセスで、軽量でセキュリティリスクの少ない極小化されたコンテナイメージが生成されます。
コンテナイメージのセキュリティレベルを可視化する
コンテナイメージのセキュリティレベルを評価するための可視化ソリューションとして、コンテナイメージスキャナーを活用します。
コンテナのセキュリティ運用が一般化した昨今では、OSSとして提供される無償ツールから、コンテナセキュリティに特化した有償プロダクトまで多数の選択肢が用意されており、自社の運用スタイルに最適なソリューションを選択することができます。
下記の例では、Palo Alto Networks社が提供するPrisma Cloudが実装するコンテナイメージスキャナーを活用し、コンテナビルドにより生成されたコンテナイメージに対して、セキュリティスキャンを実行した結果を記載しています。
- 例1. 通常のコンテナイメージビルド
Dockerfile
スキャン結果
- 例2. マルチステージビルドによるコンテナイメージビルド
Dockerfile
スキャン結果
上記のスキャン結果から、通常のコンテナイメージビルドとマルチステージビルドによるコンテナイメージビルドでは、セキュリティレベルが大きく異なることが確認できます。
また、生成されたコンテナイメージの容量も大きく異なっています。
- 例3. docker-slimによるコンテナイメージビルド
参考として、軽量なコンテナイメージをビルドするためのOSSである、docker-slimを活用したコンテナイメージビルドを実行した場合のスキャン結果を記載します。
docker-slimではベースイメージにscratchイメージを使用することで、コンテナイメージの軽量化とセキュリティ脆弱性の削減を実現しています。
スキャン結果
更に上記に対して、アプリケーションビルドに使用するベースイメージを、node:10からnode:18へ最新化した場合のスキャン結果を記載します。
この例では、セキュリティ脆弱性0を実現しています。
スキャン結果
上記の例では、セキュリティ脆弱性0を実現していますが、実際のコンテナ運用では必ずしもセキュリティ脆弱性0を目指す必要はありません。
多くの場合、アプリケーションプロセスを正常稼働させるために、ある程度のセキュリティ脆弱性は許容した状態での運用が求められ、残存するセキュリティ脆弱性に対しては別の方法で対策をする必要性が生じます。
最も重要なのは、コンテナイメージスキャナーのようなセキュリティツールを活用し、セキュリティレベルを可視化できる状態を実現することです。
セキュリティスキャナーによるスキャン結果と自社の運用ポリシーを照合することで、セキュリティ脆弱性への対応方針の意思決定をスムーズに実行できます。
まとめ
コンテナ運用のライフサイクルである"Build - Ship - Run"をセキュリティの視点で考察する場合、Buildフェーズの重要度を正しく認識することが必要です。
Buildフェーズでセキュリティ脆弱性対策を適切に実行できることで、ライフサイクル全体のセキュリティレベルを大きく引き上げ、安定したコンテナ運用を実現します。
Buildフェーズのセキュリティ対策を担う、コンテナイメージスキャナーには様々な選択肢が提供されており、今回使用したPrisma Cloud以外にも、OSSとして無償で利用できるTrivyやClair等が存在します。
更に、セキュリティ脆弱性には今回取り上げた、パッケージやライブラリ等の構成要素に対するものだけでなく、ベストプラクティスやセキュリティスタンダードへの対応状況を評価するコンプライアンスに対するものも存在します。
実運用では、今回のようにBuildフェーズの中で管理者が手動でコンテナイメージスキャンを実行することはなく、自動化されたCIプロセスの中でコンテナイメージスキャンが実行されます。
次回は、Buildフェーズのセキュリティ (後編)として、コンプライアンス視点でのセキュリティ脆弱性対策とCIプロセスへのコンテナイメージスキャンの組込みについて解説し、Shipフェーズのセキュリティについても併せて解説します。
シリーズ記事のご紹介 【コンテナセキュリティの始め方】
関連資料のご紹介
『コンテナ環境をプラットフォームまるごと保護!今話題のCNAPPとは?』
コンテナセキュリティのベストプラクティスにあわせ、それらをホストするクラウドのセキュリティを、
ガートナー社が提唱する「CNAPP」の観点を用いてデモを交えて解説します。