この記事で理解してほしいこと
-
⚠️
imageScanOnPush: true(基本スキャン)だけでは、flaskやrequestsなどの Python ライブラリの脆弱性は検知されない。 見ているのは OS 層が中心。言語層まで見たいなら拡張スキャン(Inspector)が要る。 - ECR のスキャンが見るのは 自分が書いたコードのバグではなく、使っている「他人の部品」の既知の弱点。
- 検知対象は2層ある:OS の部品(ベースイメージの Linux ライブラリ)と、言語の部品(
flask,requestsなどの Python ライブラリ)。 - 照合先は CVE(既知の脆弱性の公開リスト)。「あなたのライブラリのバージョンが、リストに載っている弱点に該当するか」を突き合わせる。
- 自分のコードのロジックミス(SQL インジェクションを生む書き方など)は スキャンの対象外。そこは別ツールや人のレビューの担当。
はじめに
ECR にコンテナイメージを push すると、設定しだいで自動的に「脆弱性スキャン」が走ります。CDK だと、リポジトリ定義のこの一行です。
const repo = new ecr.Repository(this, 'MyRepo', {
repositoryName: 'my-python-app',
imageScanOnPush: true, // ← push のたびにスキャンする
});
でも、これを true にしたとき、具体的に何が検知されるのかは意外と知られていません。本記事では、身近な Python アプリのイメージを例に「スキャンは何を見ているのか」を整理します。
(スキャンの種別・料金・設定方法は変わる可能性があります。実装前に必ず公式ドキュメントで確認してください。)
大前提:スキャンが見るのは「自分のコード」ではない
まず誤解しやすい点から。push 時スキャンが見ているのは、あなたが書いた Python コードのバグではありません。
スキャンが見るのは、「あなたのコードが使っている、他人が作った部品(ライブラリや OS)に、すでに世の中で公表されている弱点(脆弱性)が無いか」です。
検品にたとえると、こうです。あなたが料理(アプリ)を作るために材料を仕入れる。スキャンは「その仕入れた材料の中に、リコールされた缶詰(既知の弱点があるライブラリ)が混ざっていないか」を、リコール情報リストと照らし合わせて検品してくれる係です。あなたの調理の腕(コードの書き方)を採点するわけではありません。
具体例:この requirements.txt で何が起きるか
たとえば、こんな依存関係を持つ Python アプリをイメージに含めたとします。
# requirements.txt
requests==2.19.0
flask==0.12.2
スキャンは、この古いバージョンを見て、こう教えてくれます。
このバージョンの
flask/requestsは、既知の脆弱性リストに該当するものがあります。
仕組みはシンプルで、世界中の脆弱性データベース(CVE = 既知の脆弱性の公開リスト)と、あなたのイメージに入っているライブラリのバージョンを突き合わせているだけです。「flask 0.12.2」という型番が、リコール情報リストに載っているか照合する、というイメージです。
(具体的にどのバージョンに何の脆弱性があるかは時期によって変わるため、ここでは「古いバージョンには報告済みの弱点がありうる」という例として捉えてください。)
⚠️ 最大の勘違い:imageScanOnPush: true だけでは flask / requests は検知されない
ここが本記事で一番伝えたい注意点です。
冒頭のコードをもう一度見てください。
const repo = new ecr.Repository(this, 'MyRepo', {
repositoryName: 'my-python-app',
imageScanOnPush: true, // ← これ「だけ」では Python ライブラリは見ていない
});
imageScanOnPush: true は 「基本スキャン」 を有効にする設定です。そして基本スキャンが見るのは、OS の部品(Linux パッケージ)が対象で、flask や requests のような Python ライブラリ(言語パッケージ)は検知の対象外です。
つまり、
imageScanOnPush: trueを入れただけだと、さきほどのrequirements.txtのflask==0.12.2やrequests==2.19.0の脆弱性はスキャンされません。
これは非常に誤解されやすいポイントです。「スキャンを有効にしたから、ウチの Python アプリの依存関係も当然チェックされている」と思い込みがちですが、実際にはベースイメージの OS 部分しか見ていない。「スキャンを入れたつもり」と「自分が気にしている脆弱性が検知される」は別なのです。
Python ライブラリまで検知したいなら「拡張スキャン」
flask や requests のような言語パッケージの脆弱性まで検知したいなら、拡張スキャン(Enhanced scanning / Amazon Inspector による) が必要です。両者の守備範囲はこう違います。
基本スキャン(imageScanOnPush: true) |
拡張スキャン(Amazon Inspector) | |
|---|---|---|
| OS パッケージ(Linux ライブラリ) | ✅ 検知する | ✅ 検知する |
言語パッケージ(flask, requests など) |
❌ 検知しない | ✅ 検知する |
| スキャンのタイミング | push 時(または手動) | push 時 + 継続的に |
| 設定する場所 | リポジトリ単位 | レジストリ単位(Inspector 有効化が必要) |
注意したいのは、拡張スキャンは imageScanOnPush: true のように「リポジトリに一行足す」だけでは有効になりません。Amazon Inspector を有効化し、レジストリ単位で拡張スキャンを設定する、という別の手順が必要です(CDK でもリポジトリ定義とは別に扱う)。
検知する範囲は「2層」ある
スキャンが見るのは requirements.txt のライブラリだけではありません。Python の Docker イメージには、ライブラリのほかに、その土台となる OS の部品も入っています。前述のとおり、どちらの層まで見えるかはスキャンの種類で変わります。
1. OS の部品(ベースイメージの Linux ライブラリ)
python:3.9 のようなベースイメージには、Linux の各種ライブラリ(openssl など)が含まれます。それらの古いバージョンに既知の穴があれば検知します。これは基本スキャンでも検知される層です。
2. 言語の部品(Python ライブラリ)
flask や requests のような Python ライブラリの既知の穴です。この層は拡張スキャンでないと検知されません(前述の勘違いポイント)。
検知されると、何が分かるのか
脆弱性が見つかると、こういう情報が出ます。
- どのパッケージの、どのバージョンに、どの脆弱性(CVE 番号)があるか
- 深刻度(CRITICAL / HIGH / MEDIUM / LOW など)
- (拡張スキャンなら)どのバージョンに上げれば直るかという修正情報
つまり、受け取る情報は「flask 0.12.2 に深刻度 HIGH の脆弱性。新しいバージョンに上げれば直る」といった、具体的で行動に移せるものになります。漠然と「危ないよ」ではなく、「どこを・どう直すか」まで分かるわけです。
検知してくれないもの(ここも大事)
誤解を防ぐために、スキャンが見ないものも押さえておきます。
- あなたが書いた Python コード自体のロジックミス
- 自分のコードの書き方が生む脆弱性(例:入力を検証せず SQL を組み立ててしまう、など)
- 設定ミスや、秘密情報のハードコード
これらは push 時スキャンの対象外です。スキャンが見るのは「既知の脆弱性が公表されている、他人の部品」であって、「あなたのコードが安全に書けているか」ではありません。自分のコードの安全性は、静的解析ツールや、人によるレビューの担当です。
「スキャンが通った=安全」ではない、という線引きはとても重要です。スキャンは「既知の、他人の部品の弱点」を潰してくれるだけで、安全性のすべてを保証するものではありません。
まとめ
- ECR のスキャンが見るのは、自分のコードのバグではなく、使っている他人の部品(ライブラリ・OS)の既知の弱点。
- 検知は2層:OS の部品と、Python ライブラリ(
flask,requestsなど)。 - 仕組みは、ライブラリのバージョンを CVE(既知の脆弱性リスト)と突き合わせるだけ。
- 基本スキャンは OS 層中心、言語層まで見るのは拡張スキャン(Inspector)。
- 自分のコードのロジックや書き方の問題は対象外。「スキャン通過 = 安全」ではない。
イメージスキャンは、「自分では気づきにくい、他人の部品に後から見つかった穴」を教えてくれる便利な仕組みです。ただし守備範囲は限られているので、何を見て・何を見ないかを理解した上で、自分のコードのレビューや他のチェックと組み合わせることが大切です。
主な参照:
Scanning images for software vulnerabilities in Amazon ECR、
Enhanced scanning - Amazon ECR
(スキャンの種別・対応言語・料金・設定方法は AWS の更新で変わる可能性があります。実装時は最新の公式ドキュメントで確認してください。)