Security Hubの検出結果サマリを週次でメール通知するサンプルソリューションを試してみた

カスタムインサイトで集計した結果を週次でメール通知するソリューション
2024.04.10

みなさんこんにちは、杉金です。
Security Hubの検出結果サマリをを週次でメール通知するサンプルソリューションを試してみます。ソリューションのリンクは以下です。

こんな感じで通知されます

一部抜粋となりますが、以下のようにメールで通知されます。

通知される内容は以下の7項目です。それぞれの件数が記載されます。

  1. AWS Foundational Security Best Practices findings by status
  2. AWS Foundational Security Best Practices findings by severity
  3. Amazon GuardDuty findings by severity
  4. AWS IAM Access Analyzer findings by severity
  5. Unresolved findings by severity
  6. New findings in the last 7 days by security product
  7. Top 10 resource types with the most findings

通知内容の詳細

各項目がどのように通知されるかのイメージを掴むために、通知例を紹介します。

1. AWS Foundational Security Best Practices findings by status

Security Hubにおける、AWS基礎セキュリティのベストプラクティスの検出結果をステータス別に集計したものが通知されます。

AWS Foundational Security Best Practices security checks:
---------------------------------------------------------------------------------
381      -      TOTAL PASSED CHECKS
178      -      TOTAL FAILED CHECKS
---------------------------------------------------------------------------------

2. AWS Foundational Security Best Practices findings by severity

Security Hubにおける、AWS基礎セキュリティのベストプラクティスの検出結果を重要度別に集計したものが通知されます。

AWS Foundational Security Best Practices failed security checks by severity:
---------------------------------------------------------------------------------
4        -      HIGH
4        -      CRITICAL
5        -      LOW
165      -      MEDIUM
---------------------------------------------------------------------------------

3. Amazon GuardDuty findings by severity

GuardDutyでの脅威検出結果を重要度別に集計したものが通知されます。

GuardDuty threat detection findings by severity:
---------------------------------------------------------------------------------
1        -      LOW
3        -      HIGH
---------------------------------------------------------------------------------

4. AWS IAM Access Analyzer findings by severity

IAM Access Analyzerでの検出結果を重要度別に集計したものが通知されます。

IAM Access Analyzer findings by severity:
---------------------------------------------------------------------------------
49       -      LOW
80       -      MEDIUM
---------------------------------------------------------------------------------

5. Unresolved findings by severity

ステータスが解決済みもしくは抑制済みではないアクティブな検出結果(つまり未解決のもの)を重要度別に集計したものが通知されます。

Unresolved findings by severity:
---------------------------------------------------------------------------------
4        -      CRITICAL
7        -      HIGH
55       -      LOW
260      -      MEDIUM
---------------------------------------------------------------------------------

6. New findings in the last 7 days by security product

直近7日間で新たに検出した結果をセキュリティ製品(サービス)ごとに集計したものが通知されます。

New findings in the last 7 days:
---------------------------------------------------------------------------------
56       -      Security Hub
8        -      IAM Access Analyzer
---------------------------------------------------------------------------------

7. Top 10 resource types with the most findings

リソースタイプごとの検出結果TOP10が通知されます。

Top 10 Resource Types with findings:
---------------------------------------------------------------------------------
504      -      AwsAccount
149      -      AwsIamRole
27       -      Other
13       -      AwsEc2SecurityGroup
12       -      AwsCloudTrailTrail
12       -      AwsS3Bucket
5        -      AwsCloudFormationStack
5        -      AwsEc2Instance
3        -      AwsEc2Subnet
3        -      AwsSnsTopic
---------------------------------------------------------------------------------

マルチアカウント環境でも使えそう?

アカウントやリージョン単位の集計は行っていないため、マルチアカウント/マルチリージョンで集約させた環境では、提供されているソリューションをそのまま使うのは不向きかもしれません。
欲しい情報がない場合は、ソリューションのカスタマイズを検討します。どのようにカスタマイズするかについては、本記事後半のカスタマイズで紹介します。まずは先にソリューションの導入方法を説明します。

導入方法

サンプルソリューションから以下のファイルをダウンロードし、ソリューションを展開したいAWSアカウントのS3バケットに配置します。
(S3バケットはソリューションを展開したいリージョンで作成すること)

  • sec-hub-email.zip
  • security-hub-email-summary-cf-template.json

配置したjsonファイルを選んで[URLをコピー]を選択します。

CloudFormationのスタック作成から、コピーしたURLを貼り付けます。

次へと進み、パラメータを入力します。

  • S3 Bucket Name : zipファイルを配置したS3バケット名を入力します(例:s3-bucket-name)。s3://やhttps://を先頭につける必要はありません
  • S3 Key Name (with Prefix) : zipファイル名のありかをPrefix含めて入力します(例:folder/sec-hub-email.zip)
  • EmailAddress : 通知先のEメールアドレスを入力します。スタック作成後に通知先として指定したアドレス宛に招待メールが届くため承認します
  • RecurringScheduleCron : 通知間隔の設定です。Cron式で記述します。デフォルトの「cron(0 8 ? * 2 *)」では日本時間で毎週月曜17時にメールが飛びます。
  • Additional Footer text : メール末尾に追加するテキストメッセージです。お好みで記入ください。

あとは次へと進めてスタックを作成し、正常終了することを確認します。その後に、通知先として指定したアドレス宛に招待メールが届くため承認します。
これで導入は完了です。

(補足)Additional Footer textを設定するとどうなるか

パラメータの「Additional Footer text」ですが、設定することで以下のようにメールの末尾にテキストメッセージが追加されます。

対応を促すメッセージを差し込んだり、このサマリメールを送信しているチーム名を載せる署名的な使い方などが想定できます。

ソリューションの仕組み

ソリューションのページに仕組みの概要図が記載されています。

引用:https://github.com/aws-samples/aws-security-hub-summary-email?tab=readme-ov-file#heres-how-the-solution-works

ポイントはSecurity Hubのカスタムインサイトを作成して、その結果をもとにメール送信していることです。ソリューションを展開したAWSアカウントのSecurity Hubの[インサイト]から、作成されたカスタムインサイトを確認できます。

つまり、独自のカスタムインサイトを作ることで通知内容をカスタマイズできます。

カスタマイズしてみる

3つのカスタマイズを試してみます。

  • Inspectorの結果を通知に追加
  • Security Hubの検出結果数をアカウント別に集計したものを通知に追加
  • 通知タイミングの変更

Inspectorの結果を通知に追加

前提として、Inspectorは有効化済みであることとします。 まずは、Security Hubコンソールの[インサイト]からカスタムインサイトを作成します。

フィルターを設定して表示させたい項目を選びます。今回は次の項目をフィルターに設定しました。

フィルター 条件
製品名 次と同じ Inspector
ワークフローのステータス 次と同じ NEW
レコードの状態 次と同じ ACTIVE

また、グループ化条件を指定できます。重要度別の件数が欲しいため重要度ラベルを指定しました。

  • グループ化条件:重要度ラベル

設定すると以下のような感じに重要度ラベルの件数で集計されたものが表示されました。

カスタムインサイトに名前をつけて保存します。

Lambda関数「SendSecurityHubSummaryEmail」を開き、環境変数を追加します。
「ARNInsight07」まで存在するため、キー名を「ARNInsight08」として追加し、値として作成したカスタムインサイトのARNを貼り付けます。

Lambdaのコード(index.py)も編集します。2箇所追記します。

    #fetch arns for custom insights from lambda environment variables 
    insightArns.append(os.environ['ARNInsight01'])
    insightArns.append(os.environ['ARNInsight02'])
    insightArns.append(os.environ['ARNInsight03'])
    insightArns.append(os.environ['ARNInsight04'])
    insightArns.append(os.environ['ARNInsight05'])
    insightArns.append(os.environ['ARNInsight06'])
    insightArns.append(os.environ['ARNInsight07'])
    insightArns.append(os.environ['ARNInsight08'])    #ここを追加
    
    #fetch the SNS arn to send the email body to, from lambda environment variables
    snsTopicArn = os.environ['SNSTopic']

    #determine region from the arns
    arnParsed = insightArns[0].split(':')
    region = arnParsed[3]

    #create list of section labels 
    insightLabels.append('AWS Foundational Security Best Practices security checks:')
    insightLabels.append('AWS Foundational Security Best Practices failed security checks by severity:')
    insightLabels.append('GuardDuty threat detection findings by severity:')
    insightLabels.append('IAM Access Analyzer findings by severity:')
    insightLabels.append('Unresolved findings by severity:')
    insightLabels.append('New findings in the last 7 days:')
    insightLabels.append('Top 10 Resource Types with findings:')
    insightLabels.append('Inspector findings by severity:')    #ここを追加

設定反映後に通知メールに追加されたことを確認します。(上記カスタムインサイトのスクショと件数が違うのは試行錯誤で日にちが経ち、検出数が変わっているためです)

Security Hubの検出結果数をアカウント別に集計したものを通知に追加

マルチアカウント向けにアカウント別の集計を実装します。やることは先ほど紹介したInspectorの結果を追加するのと同じです。

  1. カスタムインサイトを作成する
  2. Lambdaの環境変数を追加
  3. Labmdaのコード修正(2箇所)

2と3は同じであるため説明を割愛して、1のポイントだけ紹介します。
先ほどのグループ化条件にアカウント名を選択します。

今回は次の項目をフィルターに設定しました。

フィルター 条件
ワークフローのステータス 次と同じ NEW
ワークフローのステータス 次と同じ NOTIFIED
レコードの状態 次と同じ ACTIVE
  • グループ化条件:アカウント名

これであとはLambdaへの変更(環境変数の追加とコード修正)を加えます。そうすると通知に追加されたことを確認できます。 以下、通知例です。

Security Hub findings by account:
---------------------------------------------------------------------------------
145      -      account1
45       -      account2
18       -      account3
---------------------------------------------------------------------------------

Lambdaは単に時間起動で呼び出しているため、適当なテストイベントで実行しても通知の動作確認は可能です。
Security Hubの対応を放置しているアカウントの洗い出しに使えそうです。

通知タイミングの変更

Amazon EventBridgeのルールから「SecurityHubSummaryEmailSchedule」を探して、[編集]ボタンを選択します。

ここから実行タイミングを変えます。cron式もしくは一定の時間間隔でも呼び出し可能です。

以上がカスタマイズの方法です。意外と簡単ではないでしょうか。

さいごに

Security Hubのサマリレポート通知のソリューションを紹介しました。Security Hubの検出結果を通知するよう設定したことがある方は分かると思うのですが、通知量が非常に多いです。Security Hubに限らず、通知が多いものはそのうち見なくなります。このソリューションでは、集計したレポートを定期的に送信してくれますので全体感の把握に繋げられます。

ただし、あくまで件数の集計であるため、検知してからどれくらいの日数を放置しているかは分かりません。また、インサイトのグループ化は1回しか行えないため、アカウント別のさらに重要度で集計したい、みたいなことはできません。あくまでインサイトで実現できる範囲の通知に限られます。

このソリューションを調べていく中でSecurity Hubのスコアを生成するソリューションを見つけました。今度はこちらを紹介する予定です。いずれは今回のソリューションとこのスコア生成を組み合わせて、いい感じのスコアレポートを作成できないかなと、ひそかな野望として考えています。

ついでに宣伝ですが、技術評論社 刊行のSoftware DesignでAWS活用ジャーニーという記事で連載をしています。先日発売された2024年4月号ではAWS Systems Managerを紹介しました。ほかにもテクニカルライティング特集やLinuxの基礎知識など面白い記事がたくさんあります。よかったら読んでね!

参考資料