コンテナは、アプリケーションのライフサイクルで一般的に使用されます。これは、コンテナを使用することで、コンピューティング環境が変わってもアプリケーションを確実に実行できるようになり、「自分のマシンでなら動作するのに」という問題が解決されるからです。コンテナセキュリティは、アプリ開発ライフサイクルのあらゆる段階でセキュリティ侵害からコンテナを保護することを目的としています。
この記事では、コンテナセキュリティの概念とその主な課題、および安全なコンテナ化アプリケーションを開発するためのベストプラクティスについて説明します。
コンテナセキュリティとは?
コンテナセキュリティとは、セキュリティコントロールを使用してコンテナ化環境をセキュリティリスクから保護する継続的なプロセスです。コンテナ化環境には、コンテナ自体やコンテナ内で実行されているアプリケーションだけでなく、コンテナランタイム、カーネル、ホストオペレーティングシステムなどの基盤となるインフラストラクチャも含まれます。
2021年のCNCF調査によると、93%の組織がすでに本番環境でコンテナを使用しているか、使用する予定があります。この傾向に伴い、企業はクラウドネイティブアーキテクチャに移行しており、より迅速なアプリケーションデリバリーの要求を満たす必要があります。つまり、DevOpsライフサイクル全体を通じてコンテナセキュリティのベストプラクティスを統合することは、安全なコンテナアプリケーションを確保し、重大なセキュリティ侵害とその影響を防ぐために重要です。
2023 Cloud Risk Report
Download this new report to find out which top cloud security threats to watch for in 2023, and learn how best to address them to stay protected through 2024.
Download Nowコンテナセキュリティの課題
コンテナは、アプリケーションデリバリーの高速化に多くの点で役立ちます。例えば、異なるプラットフォーム間での移植が可能な点や、自己完結型アプリケーションが(基盤となるカーネルを共有しながらも)隔離された環境でプロセスを実行できる点です。しかし、コンテナは独自のセキュリティ機能を持たず、ハードウェアへのアクセス権はホストOSを介して付与されます。また、単一のコンテナに基盤となる複数のコンテナイメージを含めることもできるため、さらに新たな攻撃対象領域が生じ、以下で説明するような、コンテナ特有のセキュリティ上の課題が生まれます。
コンテナの設定ミス
コンテナを使用して開発する際のよくある落とし穴は、一部の開発者の「設定さえしてしまえば後は気にする必要なし」という思考です。また、彼らが気づいていない、デフォルトの安全でない設定が存在する可能性もあります。セキュリティにおける一般的な設定ミスには、次のようなものがあります。
- 当該アプリケーションには不要な、安全でないポートが開かれている
- シークレットや認証情報(パスワードや認証トークンなど)が漏洩している
- コンテナのランタイム権限が過剰である(コンテナをrootとして実行するなど)
展開前にチェックを怠ると、これらの設定ミスにより、コンテナがセキュリティ侵害にさらされたり、権限昇格攻撃にさらされたりする可能性があります。
コンテナインフラストラクチャの脆弱性
コンテナインフラストラクチャスタックは、通常、アプリケーションコード、設定、ライブラリ、およびパッケージで構成されています。これらは、コンテナイメージに組み込まれ、ホストオペレーティングシステムカーネル上で、コンテナランタイムを介してコンテナ内で実行されます。
コンテナライフサイクルの各段階で、コンテナインフラストラクチャに、セキュリティ上の脆弱性がもたらされる可能性があります。これにより、ランタイムに悪用される攻撃対象領域が拡大する可能性があります。脆弱性は、コンテナイメージに組み込まれた外部依存関係から継承されることも、スタック内のホストやコンテナランタイムに存在することもあります。
コンテナイメージは、さらにアプリケーションの一部となっているオープンソースのライブラリやパッケージからもセキュリティの脆弱性を継承することがあり、攻撃を受けやすくなる可能性があります。開発者は、サードパーティのコンテナレジストリーの基本イメージを使用してコンテナイメージを構築する場合があります。これらの基本イメージは、意図しないセキュリティの脆弱性を含んでいる可能性や、ハッカーが意図的に侵害したイメージで置き換えられている可能性があります。
最後に、コンテナとホストに、脆弱性が含まれている可能性があります。これらは、コンテナがホストオペレーティングシステムのカーネルで実行されているときに、ネットワーク、ホスト、およびエンドポイントを介して悪用される可能性があります。特に、ホストカーネルとコンテナランタイムのコンテナエスケープの脆弱性は、ローカル権限昇格を利用した攻撃ベクトルを開くため、ホストの脆弱性を悪用してネットワークのラテラルムーブメントを実行し、クラウドインフラストラクチャ全体を侵害する可能性があります。
コンテナワークロードの可視化
コンテナセキュリティの第一の課題は、コンテナのワークロードの可視化です。コンテナのワークロードは非常に動的で、通常は一時的なものであるため、セキュリティチームがコンテナアクティビティの異常をモニタリングおよび追跡することが困難な場合があります。
コンテナが抱えるセキュリティ上の問題は、コンテナやアプリケーション全体に急速に伝播する可能性があります。そのため、コンテナとホストの両方のランタイム情報を可視化して、防御する人員がコンテナ化された環境の脆弱性を特定して軽減できるようにすることが重要です。
CI/CDパイプラインのセキュリティ保護に関する問題
コンテナのセキュリティでは、アプリケーションコードからコンテナのワークロードやインフラストラクチャまで、CI/CDパイプラインのすべてのフェーズを保護する必要があります。しかし、開発者は通常、アプリケーションライフサイクルの終盤にセキュリティを適用します。厳しいアプリケーションデリバリーのタイムラインに間に合わせるため、開発者はセキュリティのテストにほとんど時間を割くことができません。
コンテナセキュリティ7つのベストプラクティス
幸いなことに、上記の課題を克服して、コンテナ化された環境とアプリケーションのライフサイクルのセキュリティをあらゆる段階で最適化する方法が確立されています。
1. イメージを保護する
外部コンテナレジストリーからの基本イメージを使用してコンテナ化アプリケーションを開発する場合は、信頼できるソースからイメージをプルし、セキュリティで保護されたプライベートレジストリーに格納して、改ざんのリスクを最小限に抑えてください。それでもなお、攻撃者は信頼できるレジストリー内のイメージを侵害する可能性があるため、Notaryまたは同様のツールを使用してイメージの署名を確認してください。
また、イメージタグを変更することができます。例えば、さまざまな特定の時点で、複数のイメージに「最新」タグを付けることができます。イメージダイジェストなどの不変の固定イメージタグを使用して、一貫性のある自動ビルドを確保し、タグの可変性を利用した攻撃を防いでください。
2. シークレットを安全に管理する
シークレットと認証情報は、コードや設定ファイル(Dockerfileなど)に格納しないでください。格納すると、これらの機密データがコンテナにコピーされます。また、当該コンテナを削除しても中間コンテナレイヤーにキャッシュされたままになります。シークレットを安全に管理するための一般的なベストプラクティスは、VaultやAWS Secrets Managerなどの専用のシークレットマネージャーを使用して、シークレットと認証情報を保存および管理することです。
3. ランタイムのコンテナ権限を制限する
最小特権の原則とは、特定のタスクを実行するために必要な最小レベルのアクセス許可のみをユーザーに付与することを指します。これはセキュリティに関する重要な側面であり、ランタイムのコンテナセキュリティにも当てはまります。
通常、コンテナはroot権限を持つユーザーとして実行されているため、パッケージのインストールやシステム設定ファイルの読み取り/書き込み操作など、コンテナ内のさまざまなシステム操作が許可されています。しかし、root権限でコンテナを実行することは、コンテナランタイムが侵害された場合に攻撃者がコンテナ内の権限昇格を利用できるようになるという、大きなセキュリティリスクを伴います。
ホストカーネルとコンテナランタイムの脆弱性を軽減するために、ランタイムにおけるコンテナの権限を制限することが重要になります。これを実現するには、コンテナをルートレスモードで実行し、非ルートユーザーとしてコンテナを実行するようにします。または、既定の機能をすべて削除し、コンテナワークロードに必要な機能のみを追加する方法で、必要なLinuxカーネル機能のみに明示的に制限します。
4. セキュリティの設定ミスを特定して修正する
コンテナイメージの構築時にセキュリティ上の設定ミスを特定することで、コンテナ化アプリケーションを本番環境に展開する前に脆弱性を修正できます。このプロセスには、静的な設定分析による設定パラメーターのチェックが含まれますが、手作業で行うと面倒で人為的エラーが発生しやすくなります。
CrowdStrike Falcon Horizon™ Cloud Security Posture Management (CSPM) などのクラウドセキュリティツールは、設定をベンチマークと比較し、検出した設定ミスによるセキュリティリスクを開発者が軽減できるように、ガイド付きの修復を提供して、セキュリティ設定の管理を簡素化します。
5. 脆弱性のスキャンと管理を自動化する
CI/CDパイプラインで脆弱性のスキャンと管理を自動化することで、コンテナライフサイクルの各段階でセキュリティの脆弱性を検知し、セキュリティリスクをそれが発生する前に軽減できます。
コードスキャンは、アプリケーションコードを分析して、セキュリティの脆弱性やコーディングのバグを検知します。静的アプリケーションセキュリティテスト (SAST) は、アプリケーションコード内の脆弱性を検知します。一方、ソフトウェアコンポジション解析 (SCA) は、ソフトウェア部品表 (SBOM) を生成し、既知のオープンソース脆弱性データベースに対してコンポーネントを相互参照することで、アプリケーションビルド内のオープンソースコンポーネントを可視化します。
イメージスキャンは、コンテナイメージの内容とビルドプロセスを分析して脆弱性を検知します。これは、Clairなどの静的分析ツールを使用して、各レイヤーをスキャンして既知のセキュリティ脆弱性を検知することで実現できます。または、CrowdStrike Container Securityなどの動的分析ツールを使用して、実行中のコンテナの振る舞いを追跡してセキュリティリスクを検知します。
最後に重要なものを示しますが、ホストスキャンは、ホストカーネルやOSなどのコンテナホストコンポーネントにランタイムにおける脆弱性や設定ミスがないかを検査します。このために、開発者は、動的アプリケーションセキュリティテスト (DAST)、つまりコンテナ化アプリケーションに対する攻撃をシミュレートして脆弱性を検出するブラックボックステストを使用します。
6. リアルタイムのログ記録、モニタリング、アラートをセットアップする
コンテナワークロードの可視性を高めるには、コンテナ化環境の各コンポーネントの脆弱性をリアルタイムに記録、モニタリング、テストできるオブザーバビリティツールを使用する必要があります。コンテナスタック内のさまざまなソースからのログとメトリクスを監査し、コンテナの詳細とアクティビティを分析してシステム内の異常な振る舞いを検出することで、コンテナのセキュリティの脅威を検知できます。
リアルタイムのログ記録、モニタリング、アラートを設定することで、可視性、継続的な脅威検知、継続的なコンプライアンスモニタリングが可能になり、脆弱性や設定ミスが特定されたらすぐに修正できるようになります。
7. 「シフトレフト」セキュリティの採用
CI/CDパイプラインのセキュリティを後回しにする「シフトライト」アプローチを採用するのではなく、セキュリティをシフトレフトする、より積極的なアプローチを採用できます。
「シフトレフト」セキュリティとは、セキュリティをアプリケーション開発ライフサイクルの最も初期のフェーズにシフトする手法のことです。これにより、チームは問題や脆弱性を可能な限り早期に特定し、解決する時間を確保できるため、開発者はアプリケーション開発プロセスを遅らせることなく、安全なコンテナアプリケーションを提供できるようになります。CI/CDパイプラインの各段階に脆弱性スキャンを統合することで、本番環境になってからの問題が減ります。また、DevOpsとセキュリティを並行して進めることができるため、コンテナのセキュリティを損なうことなく、アプリケーションデリバリーを高速化できます。
まとめ
コンテナセキュリティのベストプラクティスを実装するには、アプリケーションコードに始まり、コンテナランタイムを超えて拡張される、コンテナライフサイクルのすべての段階を保護する必要があります。コンテナセキュリティは継続的なプロセスであり、セキュリティの脅威は時間の経過とともに進化します。クラウドストライクのコンテナセキュリティ製品とサービスを統合することで、これらの手法を段階的に実装できるようになります。