EventBridge API Destinations を利用して、Security Hub の検出結果の通知内容をカスタマイズして Slack に通知してみた

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

アノテーションのスライマンです。

Security Hub の検出結果を Slack に通知したいのですが、Chatbot を利用すると通知内容をカスタマイズできません。
そこで、通知内容をカスタマイズしたいのであれば、Lambda 経由で通知することや EventBridge API Destinations を利用することが考えられます。
今回は EventBridge API Destinations を利用して通知内容をカスタマイズしていきます。

Security Hub の検出結果を Backlog に通知したい場合は、下記のブログをご参照ください。

構成図

構成図は下記のようになります。
Security Hub の通知内容を、EventBridge API Destinations 経由で通知内容をカスタマイズして、Slack に通知する流れとなります。

実際にやってみた

Security Hub の有効化

Security Hub を有効化していない場合、まずは有効化します。

Slack の設定

続いて、Slack 側の設定を行います。
Slack App の作成、Incoming Webhook の有効化と作成を行います。

  • Slack App の作成
    下記の URLにアクセスして、「Create your Slack app」でアプリを作成します。
    create the Webhook
    「From Scratch」を選択します。

App Name(アプリ名)と Workspaces を入力して作成します。

  • Incoming Webhook の有効化
    「Features」の「Incoming Webhooks」にて、Incoming Webhooks を ON にして、有効化します。

  • Incoming Webhook の作成
    有効化後、「Add New Webhook to Workspace」にて Incoming Webhook を入力して作成します。

Webhooks URL を使うので、コピーしておきます。

EventBridge の設定

EventBridge では、ルールと API 送信先を作成します。

ルールの詳細の定義

  • ルール名:任意の名前
  • イベントパス:default
  • ルールタイプ:イベントパターンを持つルール

イベントパターンを構築

  • イベントソース:AWSイベントまたは EventBridge パートナーイベント
  • メソッド:カスタムパターン

今回は、下記ブログで紹介されている「例3: 「通知済み」にしたものは除外する」のイベントパターンを利用します。
こちらは、好みのパターンを作成してください。

{
  "detail-type": ["Security Hub Findings - Imported"],
  "source": ["aws.securityhub"],
  "detail": {
    "findings": {
      "Compliance": {
        "Status": [{
          "anything-but": "PASSED"
        }]
      },
      "RecordState": ["ACTIVE"],
      "Workflow": {
        "Status": ["NEW"]
      },
      "Severity": {
        "Label": ["CRITICAL", "HIGH"]
      }
    }
  }
}
  • ターゲットを選択
    ターゲットを下記の通り、設定していきます。
    API 送信先エンドポイントは Slack の Webhooks URL を入力します。
    今回は Incoming Webhook を利用しているため、認証タイプは入力不要となりますが、入力必須のこうもくになっているため、任意の値を入力してください。(今回はAPIキー名:sample、値:hoge)
    API 送信先エンドポイントを Chat PostMessage (https://slack.com/api/chat.postMessage)にする場合は、認証タイプを API キーを選択して、Authorization の値として、Bot User OAuth Token (xoxb-) を入力してください。

ターゲット入力は、通知内容をカスタマイズするため、「入力トランスフォーマー」を選択します。

今回は入力パスを次のように、設定します。

  {
    "DetailType": "$.detail-type",
    "Title": "$.detail.findings[0].Title",
    "Severity": "$.detail.findings[0].Severity.Label",
    "Region": "$.region",
    "Resource": "$.detail.findings[0].Resources[0].Id",
    "FindingId": "$.detail.findings[0].Id",
    "RecordState": "$.detail.findings[0].RecordState"
  }

入力テンプレートは下記を設定します。

  {
    "channel":"<チャネルID>",
    "text":":heavy_exclamation_mark: <DetailType>\n<Title>\nSeverity : <Severity>\nRegion: <Region>\nResource : <Resource>\nFinding ID : <FindingId>\nRecordState : <RecordState>\n"
  }

通知内容のカスタマイズはこの入力パスと入力テンプレートでの設定となります。
AWS Security Finding 形式に基づいて通知したい設定します。

Slack API のメッセージ内容の詳細やカスタマイズについては、下記のドキュメントをご参照ください。

通知内容の確認

実際に通知される内容を確認します。
AWS 基礎セキュリティのベストプラクティス v1.0.0 の「 [S3.8] S3 ブロックパブリックアクセス設定は、バケットレベルで有効になっている必要があります」で失敗して、検出結果を通知されるようにします。

数分ほど待つと、Slack に検出結果が通知されることを確認できます。

最後に

これにて今回の記事は終了となります。
ChatBot を利用する場合は、通知内容をカスタマイズすることがサポートされていないため、EventBridge API Destionations を使うことで、好みの通知内容を作成することができます。
この記事がどなかのお役に立てば幸いです。

参考

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。