インフラソリューション本部の C-C-Crab です。
前回は自動脆弱性管理サービスAmazon InspectorでEC2インスタンスの脆弱性を検出させてみました。
毎回ダッシュボードを確認するのは面倒ですので、今回はAmazon Inspectorで検出したEC2インスタンスの脆弱性の通知をメールとslackで受け取る方法について紹介します。
カテゴリーはInspectorですがInspector成分はほぼありません。
公式手順で通知を受け取る
Amazon InspectorのユーザーガイドにメールやSlack、Amazon Chimeで通知を受け取る方法が紹介されていますので、公式ガイドにしたがってメールとSlackで通知を受け取る設定をしてみます。
以下のような流れになります。
ちなみに、残念なフォーマットの通知が届きます。
SNSトピックを作成
SNSに移動して「トピックの作成」をクリックします。
タイプは「スタンダード」を選択します。後は適当な名前をつけて「トピックの作成」をクリックします。
サブスクリプションの作成(メールのみ)
この作業はSlackに通知する場合は不要です。
SNSのサブスクリプションセクションに移動して「サブスクリプションの作成」をクリックします。
トピックARNに先程作成したSNSトピック、プロトコルをEメールを選択し、エンドポイントに通知を受け取りたいメールアドレスを入力します。後はそのまま「サブスクリプションの作成」をクリックします。
しばらくすると、エンドポイントへ入力したメールアドレスに以下の様なメールが届きますので、「Confirm subscription」をクリックします。
AWS Chatbotのクライアントを設定(Slackのみ)
この作業はメールに通知する場合は不要です。
AWS Chatbotに移動します。チャットクライアントから「Slack」を選択し「クライアントを設定」をクリックします。
Slackの認証ページにリダイレクトされるので内容を確認して「許可する」をクリックします。
設定済みクライアントにSlackのワークスペースが追加されます。
ワークスペースに移動して「新しいチャネルを設定」をクリックします。
Slackのチャネルタイプは「プライベート」を選択し、チャネルIDには通知を送りたいSlackのチャンネルIDを入力します。チャンネルIDはチャンネル名を右クリックすると表示されるコンテキストメニューからコピー→リンクをコピーでコピーできます。
アクセス許可は次のように設定します。
ロール設定 | チャネルロール |
チャネルロール | テンプレートを使用してIAMロールを作成する |
ポリシーテンプレート | 通知のアクセス許可 |
チャネルガードポリシー | AmazonInspector2ReadOnlyAccess |
最後に通知 – オプションにて、作成したSNSトピックを選択し「設定」をクリックすればChatbotの設定は完了です。
Amazon EventBridgeのルール作成
EventBridgeに移動して「ルールの作成」をクリックします。
ルールタイプで「イベントパターンを持つルール」を選択し「次へ」をクリックします。
イベントソースは「AWSイベントまたはEventBridgeパートナーイベント」を選択します。
作成のメソッドで「パターンフォームを使用する」を選択し、イベントパターンのイベントソースで「Inspector2のInspector2 Finding」を選択します。
公式ガイドではサンプルパターンをそのまま使用していますが、今回は重大性とステータスでフィルタリングします。作成のメソッドを「カスタムパターン(JSONエディタ)」に変更し、フィルタリングの条件を追記します。
{
"source": ["aws.inspector2"], "detail-type": ["Inspector2 Finding"],
"detail": {
"severity": ["HIGH", "CRITICAL"],
"status": ["ACTIVE"]
}
}
ちなみに同ページのサンプルイベントで「Inspector2 Finding」を選択すると、イベントパターンの「テストパターン」のボタンが押せるようになりイベントパターンのテストができます。
「次へ」をクリックします。
ターゲットタイプで「AWSのサービス」、ターゲットを選択で「SNSトピック」を選択し、トピックにて最初に作成したSNSトピックを選択します。
残りの設定はとりあえずデフォルトでOKですので、レビューと作成まで進み「ルールの作成」をクリックします。
以上の手順で公式ガイドによる通知設定は完了です。繰り返しになりますが、これで以下のような通知の流れができました。
通知を受け取る
さて、メールやSlackに通知を飛ばす仕組みが完成したので、脆弱な環境を用意してInpsectorに検出させてみると…
検出結果のJSONデータ(改行なし)入りのメールや
Inpsectorが検出したことぐらいしかわからない通知が届きます。
通知を改善する
公式ガイドの通知内容では役に立たないので通知を改善してみます。
メールの内容を整える
メールの内容はEventBridgeの入力トランスフォーマーを使用することで簡単に整形できます。
入力トランスフォーマーを設定
EventBridgeに移動し作成したルールを編集します。
ステップ3のターゲットを選択に移動し、追加設定のターゲット入力を設定にて「入力トランスフォーマー」を選択し、「入力トランスフォーマー」を設定をクリックします。
設定画面が表示されるので、入力パスとテンプレートを下記のように設定します。
{
"title":"$.detail.title",
"inspector_score":"$.detail.inspectorScore",
"severity":"$.detail.severity",
"description":"$.detail.description",
"resource_id":"$.detail.resources[0].id",
"resource_type":"$.detail.resources[0].type"
}
"title : <title>"
"inspector score : <inspector_score> <severity>"
"description : "
"<description>"
"resource : <resource_id>"
"resource_type : <resource_type>"
入力パスで変数を設定し、テンプレートで整形するというイメージでOKです。
入力パスの “title”:”$.detail.title” 部分で、変数 title に検出結果(JSON)から detail の要素 title の内容を代入し、テンプレートの <title> の部分で変数 title の内容を出力しています。詳細な記述方法の説明は省略しますが、入力トランスフォーマーを設定の画面に入力パス、テンプレート、および出力の例が載っていますので参考にしてください。また、同画面で「サンプルイベント」を選択し、入力パスとテンプレートを記述するとどのような出力になるか確認できます。
出力をテストして問題なければEventBridgeのルールを更新します。
再度通知を受け取る
さて、メール文の整形が完了したので、再度Inpsectorに検出させてみると…
少しは見やすくなりました。
Slackの通知を整える
残念ながらSlackの通知内容を整形するのにEventBridgeの入力トランスフォーマーは使用できません。
Q: AWS Chatbot 通知にカスタムフォーマットを追加できますか?
https://aws.amazon.com/jp/chatbot/faqs/
いいえ。AWS Chatbot の通知のフォーマットをカスタマイズすることはできません。
通知のフォーマットは変更できませんが入力トランスフォーマーでJSONの値を書き換え、表示内容を変更することは可能です。例えば、JSON中の resources を以下のように書き換えた場合、
"resources": [
"inspector score: <inspector-score>",
"severity: <severity>"
]
Slackへの通知は以下のように変わります。
今回は、EventBridgeからAPIを呼び出す方法にて通知内容を整形してみます。
Inpsectorとは最早関係ない内容なのでダイジェストでお送りします。
EventBridge APIの送信先でSlackに通知する(ダイジェスト)
EventBridge APIの送信先を使ってSlackに通知する方法は以下の通りです。
- Slackアプリを作成し通知を受け取りたいチャネルにインストールする
Incoming WebhookもしくはOAuthでSlackにメッセージを送信できるように設定します。 - EventBridgeにてAPIの送信先を作成する
- EventBridgeのルールをAPIの送信先を使うように変更
Slackの設定内容は詳しく触れませんので下記公式ドキュメントを参照してください。
以降の例ではIncoming Webhookを使ったSlackアプリを用意している前提で説明します。
APIの送信先を作成
EventBridgeに移動し、「API送信先を作成」をクリックします。
「API送信先エンドポイント」にはSlackアプリから取得したWebhook URLを入力し、HTTPメソッドでは「POST」を選択します。接続では「新しい接続を作成」を選択します。
送信先タイプは「その他」、認証タイプは「APIキー」を選択します。APIキー名と値は何でもいいので適当な値を入力して、「次へ」をクリックします。
これでAPI送信先の作成は完了です。設定に問題がなければ、API送信先のステータスがアクティブになっています。アクティブになっていなければSlackアプリの設定等を見直してみてください。
EventBridgeのルールを修正
1.で作成したEventBridgeのルールを修正します。作成したルールを選択し「編集」をクリックします。
ステップ3の「ターゲットを選択」に移動します。
ターゲットタイプに「EventBridge APIの宛先」、API送信先に「既存のAPI送信先を使用」を選択し、セレクトボックスで先程作成したAPI送信先を選択します。実行ロールは「この特定のリソースについて新しいロールを作成」を選択してください。
続けて入力トランスフォーマーの設定を行います。
Webhookを使ったSlackへのペイロードは最も単純なものだと text フィールドのみで十分です。表示したい内容を入力パスで取得し、テンプレートで整形します。
{
"text":"title:<title>\ninspector score:<inspector_score> <severity>\ndescription\n<description>\n\nresource:<resource_id>\nresource_type:<resource_type>"
}
変更したルールを保存すれば完了です。
再度通知を受け取る
さて、再度Inpsectorに検出させてみます。
こちらも見やすくなりました。
最後に
今回はAmazon Inspectorの通知をメールとSlackで受け取る方法を紹介しました。
Amazonの公式ガイドの手順では通知フォーマットがイマイチだったので、EventBridgeの入力トランスフォーマーでメールを、EventBridge API送信先を使ってSlackの通知を改善してみました。
もっと高度な加工がしたいならLambdaを使うといいのではないかと思います。また、今回は取り上げませんでしたが、InspectorとSecurity Hubを連携させるとChatbotを経由させてもより詳細な通知を受け取ることができます。(以下はサンプルイベントです)
コメント