0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ECR のイメージスキャンは、Python イメージの「何」を見ているのか

0
Posted at

この記事で理解してほしいこと

  • ⚠️ 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 の更新で変わる可能性があります。実装時は最新の公式ドキュメントで確認してください。)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?