SecurityHubからのイベントをちょっと見やすくしてEメール通知する

SecurityHubの通知をEメールで受け取るとき、ちょっと見やすい形に整形してみました。
2021.03.31

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

少し前にGuardDutyの通知を整形する以下の記事を書いたのですが、今回はSecurityHub版です。

同様にEventBridgeの入力トランスフォーマーの機能を使ってちょっと見やすくメール通知してみました。

デフォルトでイベントを通知させると以下のような生のJSONで通知されるのですが、これでは少し見辛いですよね。

ちょっと手を加えるだけで通知を見やすくできたのでその方法を紹介します。

構築内容

今回の構築内容はEventBridgeで取得したSecurityHubのFindingsを必要な情報のみに整形してみます。

SevurityHubの有効化とSNSトピック、Eメールアドレスを指定したサブスクリプションは作成しておいて下さい。

EventBridgeルール

EventBridgeのルールを作成し、イベントパターンは以下のようにセキュリティチェックに合格しなかったものを取得します。

{
  "source": [
    "aws.securityhub"
  ],
  "detail-type": [
    "Security Hub Findings - Imported"
  ],
  "detail": {
    "findings": {
      "Compliance": {
        "Status": [
          {
            "anything-but": "PASSED"
          }
        ]
      },
      "RecordState": [
        "ACTIVE"
      ]
    }
  }
}

他のパターンで取得したい場合には以下のエントリにフィルタリングの例がまとまっているので、ご参照ください。

入力トランスフォーマー

イベントを取得したときの整形を行っていきます。

EventBridgeのターゲットに作成しておいたSNSトピックを指定し、[入力の設定]には[入力トランスフォーマー]を選択します。

すると二つの入力欄が出てくるので、上段には入力パス、下段には入力テンプレートを定義します。入力パスはイベントから取得する値を定義することができ、入力テンプレートには入力パスで取得した値を文章内で展開しながら通知する文章を作成することができます。

Security HUBのJSON形式はドキュメントから確認できますが少し分かりにくいため、入力パスでどのように値を取得するかは実際にメールで通知して確認するのをお勧めします。

今回の入力パスとテンプレートはこのように設定してみました。

上段(入力パス)

{"Account_ID":"$.detail.findings[0].AwsAccountId","Finding_Type":"$.detail.findings[0].Types[0]","Finding_description":"$.detail.findings[0].Description","region":"$.region","severity":"$.detail.findings[0].Severity.Label"}

下段(入力テンプレート)

"AWS <Account_ID> has a severity <severity> Security HUB finding type <Finding_Type> in the <region> region."
"Finding Description:"
"<Finding_description>. "
"For more details open the Security HUB console at https://<region>.console.aws.amazon.com/securityhub/home?region=<region>#/summary"

上記の設定で構築すると以下のような通知が届くようになります。

生のJSONよりは多少見やすくなりましたね。(コンソールのURLがありますが個別の検出結果まで遷移するURLがうまく作れなかったので、今回はSecurityHubのサービス画面に飛ぶようになってます。知っている人いたら教えて下さい。)

別パターン

もうちょっと形式を変えて、単純に必要そうな情報だけを並べる書き方にしてみました。必要な項目を洗い出して並べるだけでも十分見やすくなりますね。

上段(入力パス)

{"Account_ID":"$.detail.findings[0].AwsAccountId","Compliance":"$.detail.findings[0].Compliance.Status","FindingDescription":"$.detail.findings[0].Description","FindingType":"$.detail.findings[0].Types[0]","Region":"$.region","RemediationText":"$.detail.findings[0].Remediation.Recommendation.Text","RemediationUrl":"$.detail.findings[0].Remediation.Recommendation.Url","Severity":"$.detail.findings[0].Severity.Label","Time":"$.time","Title":"$.detail.findings[0].Title"}

下段(入力テンプレート)

"# Security Hub Findings"
    "- Region :: <Region> "
    "- Account :: <Account_ID>"
    "- Time :: <Time>"
"# Findings"
    "- Title :: <Title>"
    "- FindingType :: <FindingType>"
    "- FindingDescription :: <FindingDescription>"
    "- Severity :: <Severity>"
    "- Compliance :: <Compliance>"
    "- RemediationText :: <RemediationText>"
    "- RemediationUrl :: <RemediationUrl>"

メールではこんな感じになります。

JSONからの値の取得方法が理解できれば難しくないと思うので、是非欲しい情報を入力パスで取得してみて下さい。

もう少し通知を工夫したい場合

Lambdaでさらに整形する

以下のエントリがLambdaを利用してより見やすく実装してくれているので参考にしてみて下さい。

Lambda関数増やしたくない場合は本記事の実装できる範囲で試していただければと思います。

まとめ

SevurityHubの検出結果を通知手段としてEメールを使いたい場面では、手軽に整形できるので是非利用してみて下さい。