依存関係
コンテナスキャン
コンテナスキャンは、コンテナイメージに既知の脆弱性、古いパッケージ、リスクのある設定がないかを検査します。イメージにはアプリケーションとベースOS、そしてその間のすべてがまとめられているため、スキャンの対象は自社の依存関係よりはるかに広くなります。一方で、スキャンが読むのは完成したイメージであり、それがどう作られたかについて知り得ることには限りがあります。
更新日
コンテナスキャンの仕組み
- イメージを展開する。スキャナーはイメージのレイヤーを実行せずに読み取ります。
-
内容を一覧化する。OSのパッケージデータベースや、イメージにコピーされた
package-lock.jsonなどのアプリケーションのマニフェストを読み取ります。 - データを照合する。パッケージを、ディストリビューションやアドバイザリデータベースの脆弱性データと比較します。
- 設定をチェックする。root権限での実行や、レイヤーに残されたシークレットなども指摘するツールがあります。
スキャンを実行する場所
| 段階 | 得られるもの | 限界 |
|---|---|---|
| CI(イメージのビルド後) | イメージをプッシュする前にビルドを失敗させる | その日のアドバイザリのスナップショットにすぎない |
| レジストリ | 新しいアドバイザリが出るたびに保存済みイメージを再スキャン | 問題が見つかるのはイメージの公開後 |
| Kubernetesのアドミッション | 未スキャンまたは不合格のイメージをデプロイ時にブロック | ポリシーと例外への対応方法が必要 |
| ランタイム | 現在稼働中のイメージと、読み込まれているものを表示 | クラスターにエージェントが必要 |
コンテナスキャンツール
- オープンソース:TrivyとGrypeが一般的な無料の選択肢で、どちらもCIに簡単に組み込めます。
- レジストリやプラットフォームに組み込み:Docker Scoutと主要なクラウドレジストリがスキャン機能を提供しています。
- 商用プラットフォーム:SnykとAnchoreは、ポリシー、レポート、ワークフローを追加します。
検出結果を減らす方法
- 小さなベースイメージから始める。slimやdistrolessのイメージはパッケージが少ないため、該当するアドバイザリも少なくなります。
- 定期的にリビルドする。ベースイメージにはパッチが当たります。3月にクリーンだったイメージが今もクリーンとは限りません。
- マルチステージビルドを使う。コンパイラーやビルドツールは最終イメージに含めないようにします。
- ベースイメージをダイジェストで固定する。タグは知らないうちに変わることがありますが、ダイジェストは変わりません。
- 優先順位を付ける。多くの検出結果にはまだ修正がないか、アプリケーションが使わないパッケージにあります。脆弱性の優先順位付けの方法をご覧ください。
同じ手段はイメージ以外にも当てはまります。脆弱性ノイズを減らす方法では、使用するすべてのスキャナーについて、それらを順に整理しています。
コンテナスキャンでは見えないもの
- コンパイル済みのコード。イメージ内のGoやRustのバイナリが持つメタデータは限られており、スキャナーは何が含まれたかを推定しなければなりません。
-
パッケージの記録がないファイル。
curlで追加したり、レイヤーにコピーしたりしたソフトウェアは、パッケージデータベースに登録されません。 - ビルドで使われ、イメージに残らなかったもの。マルチステージビルドでは、イメージを生成したツールは破棄されます。そのいずれかが侵害されていても、最終イメージにはその痕跡が残りません。
- 出どころ。スキャンが記述するのはイメージであり、それを生成したビルドではありません。
詳しくはDockerイメージのSBOMが見落とすものを、選択肢についてはおすすめのSBOMツールをご覧ください。
最近の例としてはPHP2Shellをご覧ください。公式のphpイメージはPHPをソースからコンパイルするため、ランタイムにはパッケージの記録がなく、イメージごとにバージョンを問い合わせる必要があります。
イメージのスキャンとビルドの記録
自社でビルドしていないイメージ、クラスター、設定に対しては、スキャナーが適したツールです。自社でビルドするイメージについては、CRACIは別のアプローチを取ります。GitHub Actionsのランナーとして、ベースイメージとそのOSレイヤーを含め、ビルドに入ってくるものを把握するため、後から推定するのではなく、入ったものを記録します。そのうえで、新しい脆弱性が公開されるたびにそれらのSBOMをチェックし続けます。
CRACIは、自社でビルドしていないイメージ、クラスター、VMイメージ、設定ミスはスキャンしません。Trivyはそれらをスキャンできるので、その用途にはTrivyを使い続けてください。CRACIとTrivyの比較をご覧ください。
コンテナスキャン:よくあるご質問
コンテナスキャンとは何ですか?
コンテナイメージに既知の脆弱性、古いパッケージ、リスクのある設定がないかを、通常はイメージを実行せずに検査するプロセスです。
コンテナイメージはいつスキャンすべきですか?
イメージのビルド後にCIで、そして新しいアドバイザリが出るたびにレジストリで再度スキャンします。一度しかスキャンしなければ、手元に残るのはすぐに古くなるスナップショットだけです。
おすすめの無料コンテナスキャナーは何ですか?
TrivyとGrypeが最も広く使われている無料の選択肢です。どちらもCIで実行でき、OSとアプリケーションのパッケージをカバーします。
イメージスキャンとSBOMの違いは何ですか?
SBOMはイメージの中身を一覧にしたもので、スキャンはその中身に既知の問題がないかをチェックするものです。多くのスキャナーは、まずSBOMを作成してからアドバイザリと照合します。
コンテナイメージの脆弱性が多いのはなぜですか?
主な原因はベースイメージで、OSのパッケージを持ち込むためです。小さなベースイメージと定期的なリビルドで、その大半を取り除けます。
コンテナスキャナーはコンパイル済みバイナリを読み取れますか?
部分的には可能です。GoやRustのバイナリには依存関係のメタデータが一部含まれることがありますが、多くのコンパイル済みコードは手がかりが少なく、スキャナーは何が含まれたかを推測しなければなりません。