はじめに
今年のre:Invent2021でECRの新しいスキャン設定が可能になりました。
これまではECR単体としてスキャンの機能がありましたが、このアップデートでAmazon Inspectorに統合されて、EC2のスキャン結果とまとめて確認ができるようになりました。
今回は拡張スキャンを使っていて、脆弱性結果が急に見れなくなったので、その手順と理由を調査した結果を書いていきます。
この記事でわかること
- ECRスキャンが有効化されている状態でInspectorの無効化有効化を行うと過去の脆弱性結果が見れなくなる
- Inspectorを有効化している状態で、リポジトリ単位で再度Pushすると過去の脆弱性結果が復活する
- 長期間Inspectorを無効化した状態でどの程度過去の脆弱性結果が残るかは不明
事前準備
ECRリポジトリは事前に作成しておきます。
今回は拡張スキャンを利用するので、ECR自体のイメージスキャンは無効化したままにします。
ECRのスキャン設定から、拡張スキャンを有効化して、継続スキャンとPush時スキャンが実行されるように設定しておきます。
もしこの時点でAmazon Inspectorが有効化されていなければ、手動でEnableにしておきます。
手順
イメージのBuild&Push
Pushする用のイメージとして、以下のDockerfileを作成します。
$ cat Dockerfile
FROM ubuntu:16.04
あとはECRにPushするだけなので、Dockerfileがあるディレクトリで以下のコマンドを実行します。
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com
$ docker build -t test-repository .
$ docker tag test-repository:latest XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/test-repository:latest
$ docker push XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/test-repository:latest
脆弱性スキャン結果確認
今回の設定ではPush時にスキャンが走るようになっているため、脆弱性項目に調査結果を表示というリンクが作成されていることがわかります。
そのリンクをクリックしてみると、脆弱性が21個出ていることが見てわかります。
InspectorのDashboardからも脆弱性を確認できます。
By container imageタブではイメージタグごとにどの程度脆弱性が出ているのかが一覧でわかるようになっています。
ここまではECR拡張スキャンの通常の動作確認になります。
問題の手順
ここからは今回発生した脆弱性結果が消えた際の手順になります。
Inspector無効化
まずInspectorのDashboardからInspectorの無効化を行います。
無効化した後に先ほど確認した脆弱性結果をもう一度ECRから確認してみます。
すると脆弱性結果は見れなくなっており、APIエラーが発生していました。
Inspectorに統合されているので、無効化すると結果が見れなくなっているというのは正しい動作な気がしますが、APIエラーが発生しているのは謎です。
Inspector有効化
そうすると先ほどまであった脆弱性結果がなくなっており、何もスキャンが実行されていない状態に戻っていました。
また、ECRリポジトリからみると一見脆弱性結果が残っているように見えますが、
リンクをクリックすると先ほどと同じAPIエラーが発生し、スキャン結果が見れなくなっていました。
どうやら、一度Inspectorを無効化してしまうと過去の脆弱性結果は全て消えてしまい、再度有効化したとしても見れなくなってしまうようです。
対応手順
では、どうすれば過去の脆弱性結果を見れるようになるかというと、Inspectorが有効化された状態で同じイメージに対して再度スキャンが実行されれば見れるようになります。
イメージ再Push
先ほど有効化したInspectorをそのままに再度イメージのPushを行うと、
問題なく脆弱性スキャンが実施され、新しくPushされたイメージタグの脆弱性結果が確認できました。
そのあとに先ほど見れなかった過去の脆弱性結果を確認すると、APIエラーは発生せずに最初に確認した結果が見れるようになってました。
Inspectorから見ても2つのイメージタグの脆弱性結果が一覧に表示されているので、過去分が復活していることがわかります。
追加検証
別リポジトリへのイメージPush
別のリポジトリにイメージPushした場合でも過去の脆弱性結果が見れるか確認してみます。
まずは別リポジトリのイメージの脆弱性結果を見てみると、APIエラーが出ていますが同時に結果も見えるという不思議な状態になっていました。
最初のリポジトリの脆弱性結果は変わらずAPIエラーが出たままとなっていました。
その状態でInspectorから脆弱性結果を見ると何も表示されていませんでした。
恐らくですが、Inspectorと統合されているECRスキャンを使っている環境で1つ以上APIエラーが発生していた場合、Inspectorのdashboradからの確認もできなくなるようです。
上記のような場合は、APIエラーが発生していると思われるECRリポジトリで新しくイメージのPushをしてあげるとAPIエラーが消えて参照できるようになったので、リポジトリ単位での対応が必要なようです。
おわりに
この挙動がバグなのか正常動作なのかはまだ判断が付いていないですが、ECRスキャンが動いている状態でInspectorを無効化すると想定していない挙動になりそうなので、あまりやらないほうが賢明だと思いました。(まぁそんな状況そうそうないとは思いますが)