
Amazon ECRの脆弱性スキャン結果をリアルタイムでメール通知する方法
2023.03.09
本記事のポイント
Amazon Elastic Container Registry(以下、ECR)を利用している企業様の中でECRにイメージがプッシュされたタイミングなどに実施される脆弱性スキャンの結果をリアルタイムで通知したいと考えている方は多いのではないでしょうか。
本記事では、Amazon EventBridge(以下、EventBridge)と連携し脆弱性スキャンが完了したタイミングでメール通知する方法をご紹介します。
Amazon ECRの脆弱性スキャンとは
脆弱性スキャンの説明の前にECRについて軽くご説明します。 ECRとはセキュリティ、スケーラビリティ、信頼性を備えた AWS マネージドコンテナイメージレジストリサービスです。簡潔に説明するとAmazon Elastic Container Service(以下、ECS)のタスク定義やAmazon Elastic Kubernetes Service(以下、EKS)のポッド仕様で使用できるイメージを管理するサービスです。 そのECRにイメージが作成された際にソフトウェアに脆弱性がないか自動的に確認してくれるのがスキャンになります。スキャンは以下の通り2種類ありますが、本ページではベーシックスキャンについての通知方法をご紹介します。拡張スキャン
Amazon ECR は Amazon Inspector と統合され、リポジトリの自動継続的なスキャンを提供します。コンテナイメージは、オペレーティングシステムとプログラミング言語パッケージの両方の脆弱性についてスキャンされます。新しい脆弱性が発生すると、スキャン結果が更新され、Amazon Inspector は EventBridge にイベントを発行してユーザーに通知します。ベーシックスキャン
Amazon ECR は、オープンソースの Clair プロジェクトの共通脆弱性識別子 (CVE) データベースを使用します。ベーシックスキャンでは、プッシュ時にスキャンするようにリポジトリを設定します。手動スキャンを実行すると Amazon ECR によってスキャン結果のリストが提供されます。 引用元:スキャンとは(AWS公式)Amazon ECRの脆弱性スキャン結果を確認してみよう
それでは早速ですがECRのスキャン結果について確認してみようと思います。 まずはAWSコンソールにログインしECRの管理画面を開きます。 ※検索窓に「ECR」と入力してもでてこないので「ECS」で検索します。


Amazon EventBridgeとは
EventBridgeとはアプリケーションをさまざまなソースからのデータに接続するために使用できるサーバーレスのイベントバスサービスです。今回ではECRにてスキャンが完了したタイミングをEventBridgeにて検知しAmazon Simple Notification Service(以下、SNS)へ連携します。 ※SNSとは通知先の情報(メールアドレスなど)を管理するためのサービスです。 基本的には各サービスの中間的な役割を担うサービスですが他にもJSON形式のデータを整形することができ、とても使い勝手のよいサービスとなっています。Amazon EventBridgeにて脆弱性スキャン結果を検知してみよう
では、早速ですがECRのスキャンをEventBridgeにて検知させてみましょう。 まずはEventBridgeの管理画面を開きます。

ステップ1 ルールの詳細を定義

ステップ2 イベントパターンを構築

ステップ3 ターゲットを選択

ステップ4 タグを設定

{"version":"0","id":"〓ID〓","detail-type":"ECR Image Scan","source":"aws.ecr","account":"〓account〓","time":"〓time〓","region":"ap-northeast-1","resources":["〓resources〓"],"detail":{"scan-status":"COMPLETE","repository-name":"〓repository-name〓","image-digest":"〓image-digest〓","image-tags":["latest"],"finding-severity-counts":{"MEDIUM":19,"INFORMATIONAL":8,"LOW":7}}}
上記のメール内容では見づらいので項番5でメール内容を整形してみましょう。
メール通知内容を整形してみよう
先ほど作成したルールではメール通知はされるが本文がJSON形式となっていて見づらいため、本文を整形してみましょう。 まずは作成したルールを開き右上の「編集」をクリックしましょう。

{"CRITICAL":"$.detail.finding-severity-counts.CRITICAL","HIGH":"$.detail.finding-severity-counts.HIGH","INFORMATIONAL":"$.detail.finding-severity-counts.INFORMATIONAL","LOW":"$.detail.finding-severity-counts.LOW","MEDIUM":"$.detail.finding-severity-counts.MEDIUM","UNDEFINED":"$.detail.finding-severity-counts.UNDEFINED","detailtype":"$.detail-type","image":"$.detail.image-tags","repository":"$.detail.repository-name","time":"$.time"}
テンプレート:
"脆弱性のスキャン結果をご報告致します。"
"【ECR情報】"
"イベントタイプ:<detailtype>"
"スキャン日時 :<time>"
"リポジトリ名 :<repository>"
"【スキャン結果】"
"CRITICAL :<CRITICAL>件"
"HIGH :<HIGH>件"
上記設定後、「確認」をクリックし設定を保存してください。
再度ECRのスキャンを実行すると以下のメールが通知されると思います。
本文:
"脆弱性のスキャン結果をご報告致します。"
"【ECR情報】"
"イベントタイプ:ECR Image Scan"
"スキャン日時 :〓スキャン日時〓"
"リポジトリ名 :〓リポジトリ名〓"
"【スキャン結果】"
"CRITICAL :〓件数〓件"
"HIGH :〓件数〓件"
入力トランスフォーマーの設定が少し分かりづらいので補足ですが設定内容としてはJSON形式のデータを任意の名前で記録するための設定、記録したデータを使う設定の2つがあるイメージです。
まずは入力パスでJSON形式のデータを任意の名前で記録するのですが、例として以下のJSONがあったとします。
JSON:
{
"version":"0",
"id":"〓",
"detail-type":"ECR Image Scan",
"source":"aws.ecr",
"account":"〓",
"time":"〓",
"region":"ap-northeast-1",
"resources":["〓"],
"detail":
{
"scan-status":"COMPLETE",
"repository-name":"〓",
"image-digest":"〓",
"image-tags":["latest"],
"finding-severity-counts":
{
"MEDIUM":〓,
"INFORMATIONAL":〓,
"LOW":〓
}
}
}
上記JSONのdetail-typeの値を取得したい場合は以下のように入力パスを記載します。
{ "〓任意の名前〓":"$.detail-type"}
設定後、テンプレートで以下のように<>で囲い記載することによりdetail-typeの値を出力することができます。
<〓任意の名前〓>
MEDIUMのように階層構造になっているデータを入力パスで指定する場合は以下のように.(ドット)で区切り記載することにより可能です。
{"〓任意の名前〓":"$.detail.finding-severity-counts.MEDIUM"}
また、入力パスは以下のように,(カンマ)で区切ることにより複数指定することが可能です。
{ "〓任意の名前〓":"$.detail-type","〓任意の名前〓":"$.detail.finding-severity-counts.MEDIUM"}
まとめ
今回はECRの脆弱性スキャン結果をEventBridgeにて検知しリアルタイムでメール通知する方法をご紹介しました。EventBridgeはECRの他にもさまざまなサービスと連携することが可能なサービスですのでぜひ他のサービスと連携しより良い環境構築をしてはいかがでしょうか。 最後までお読みいただき、ありがとうございました。
関連記事
TAG
タグ一覧へ