10分でできる!AWS Security Hub のアラートを見やすく整形して Slack に通知してみた(CloudFormation 利用)
はじめに
クラスメソッドオペレーションズの Shimizu です。
AWS を業務利用する際、まずセキュリティ設定がベストプラクティスに沿っているかを検出するため、Security Hub を有効化してアラートメールの通知を設定するケースが多いと思います。
しかしながら送信されてくるアラートメール数が多いことに加え、内容が JSON 形式のため重要なメールを判別しにくい、というユーザー様のお声もいただきます。確かに以下のようなアラートメールが大量に来ると、対応に困ってしまいます。

そこで今回は、以下のようにアラートの内容を見やすく整形した上で Slack のチャンネルに通知できる仕組みを、CloudFormation テンプレートを利用して10分ほどで構築してみました!その手順をご紹介します。

前提条件
以下の準備ができている前提で進めます。
- 通知用の Slack チャンネルを作成できている
- Security Hub を有効化済みである
これから準備される方は、以下を参考にしてください。
構築する内容
CloudFormation テンプレートを利用して、以下のリソースを一括で構築します。

今回のポイントとして、構成の複雑さと課金を極力避けるため、Lambda 関数は使用していません。
EventBridge の入力トランスフォーマー機能で JSON を整形して見やすくしています。下記記事を参考にさせていただきました。
CloudFormation テンプレートの説明
CloudFormation のテンプレートは下記になります。
全文をコピーして、作業用PCに拡張子 .yaml のファイルとして保存してください。
テンプレートのコードはこちら
AWSTemplateFormatVersion: '2010-09-09'
Description: >
Send AWS Security Hub findings to SNS using EventBridge
with input transformers.
Parameters:
# 通知送信先の E メール
NotificationEmail:
Type: String
Default: ""
Description: >
(Optional) Email address to subscribe to the SNS topic.
Example: security-alert@example.com
Leave empty to skip email subscription.
# 通知対象とする Security Hub の重要度
SecurityHubSeverity:
Type: String
Default: "CRITICAL,HIGH"
Description: >
(Optional) Comma-separated list of Security Hub severity labels.
Allowed values:
CRITICAL,HIGH,MEDIUM,LOW,INFORMATIONAL
Example: CRITICAL,HIGH
Conditions:
HasEmailSubscription: !Not [!Equals [!Ref NotificationEmail, ""]]
Resources:
# 通知用 SNS トピック
AlertSnsTopic:
Type: AWS::SNS::Topic
Properties:
DisplayName: SecurityAlerts
# SNS のサブスクリプション(Eメール)
AlertSnsSubscription:
Type: AWS::SNS::Subscription
Condition: HasEmailSubscription
Properties:
Protocol: email
TopicArn: !Ref AlertSnsTopic
Endpoint: !Ref NotificationEmail
# EventBridge から SNS への通知を許可する IAM ロール
EventBridgeToSnsRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: events.amazonaws.com
Action: sts:AssumeRole
Policies:
- PolicyName: AllowPublishToSns
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action: sns:Publish
Resource: !Ref AlertSnsTopic
# EventBridge ルール(入力トランスフォーマーによる整形付き)
SecurityHubEventRule:
Type: AWS::Events::Rule
Properties:
Description: Send Security Hub findings to SNS with transformer
EventPattern:
source:
- aws.securityhub
detail-type:
- Security Hub Findings - Imported
detail:
findings:
Severity:
Label: !Split [",", !Ref SecurityHubSeverity]
Targets:
- Arn: !Ref AlertSnsTopic
Id: SecurityHubToSns
RoleArn: !GetAtt EventBridgeToSnsRole.Arn
InputTransformer:
InputPathsMap:
account: "$.account"
compliance: "$.detail.findings[0].Compliance.Status"
controlid: "$.detail.findings[0].Compliance.SecurityControlId"
description: "$.detail.findings[0].Description"
firstObservedAt: "$.detail.findings[0].FirstObservedAt"
id: "$.detail.findings[0].Id"
label: "$.detail.findings[0].Severity.Label"
lastObservedAt: "$.detail.findings[0].LastObservedAt"
recommendationUrl: "$.detail.findings[0].Remediation.Recommendation.Url"
recordState: "$.detail.findings[0].RecordState"
resource: "$.detail.findings[0].Resources"
time: "$.time"
title: "$.detail.findings[0].Title"
updatedAt: "$.detail.findings[0].UpdatedAt"
workflowState: "$.detail.findings[0].WorkflowState"
InputTemplate: |
"タイトル: <title>"
"対象アカウント: <account>"
"時刻: <time>"
"コントロール ID: <controlid>"
"内容: <description>"
"ワークフローステータス: <workflowState>"
"コンプライアンス: <compliance>"
"初回検知日時: <firstObservedAt>"
"最終検知日時: <lastObservedAt>"
"重要度ラベル: <label>"
"対象リソース: <resource>"
"レコードステータス: <recordState>"
"更新日時: <updatedAt>"
"参考URL: <recommendationUrl>"
"ID: <id>"
Outputs:
SnsTopicArn:
Description: SNS Topic ARN for security alerts
Value: !Ref AlertSnsTopic
■ オプション項目
-
通知する Security Hub 検出結果の重要度
Critical (重要)、High (高)、Medium (中)、Low (低) 、Informational (情報) の5段階から、カンマ区切りで通知対象を指定できます。 -
通知先メールアドレス
SNS トピックから通知を送信するメールアドレスを指定します。
もちろん Slack チャンネルのメールアドレスだけではなく、通常のメアドも指定できます。
それでは以下に、実際に構築してみた際の手順をご紹介します!
やってみた
まず送信先の Slack チャンネルでチャンネル名をクリックして「インテグレーション > このチャンネルにメールを送信する」をクリックします。

初回は「メールアドレスを取得する」というボタンが表示されます。クリックするとメールアドレスが発行されるので、コピーしておきます。

次は AWS 側の操作です。
CloudFormation のコンソール画面で「スタックを作成 > 新しいリソースを使用」をクリックします。
次の画面で「テンプレートファイルのアップロード」を選択し、先ほどPCに保存した CloudFormation テンプレートの .yaml ファイルを選択します。

詳細画面で以下のように入力します。
-
スタック名
分かりやすい名前でOKですが、ここはsecurityhub-alert-stackとします。 -
NotificationEmail
先ほどコピーしておいた Slack チャンネルのEメールアドレスxxxx@xxxx.org.slack.comを指定します。 -
SecurityHubSeverity
通知の重要度を選択します。ここはデフォルトのままCRITICAL,HIGHを指定して "重要" と "高" のみを通知する設定にします。(あとから変更できます)

次の画面へ進み、IAM リソースが作成されることを承認するチェックを入れます。
※ EventBridge サービスから SNS トピックへの通知を許可する IAM ロールを作成するためです。

次の画面で内容を確認して「送信」をクリックします。

特にエラーがなければ、5分ほどで CloudFormation スタックの作成が完了します。作成されるリソースはシンプルに4つだけです。

この時点で Slack の通知先チャンネルを確認すると、SNS からサブスクライブの確認メールが届いているはずです。
通知内の「Confirm subscription」をクリックし、ポップアップ画面で「リンクを開く」をクリックすれば、サブスクライブ完了の画面が表示されます。

これで構築は完了です。
あとは Security Hub の検出結果が出るのを待っていれば Slack チャンネルに通知されます。
すぐに動作確認をしたい場合は、AWS CLI コマンドで擬似的に Security Hub の検出結果を作成してテストできます。
下記の CLI コマンドをコピーして、アカウント ID を実際のものに置き換えて、CloudShell 等から実行しましょう。(※ 架空のアカウント ID を入れるとコマンドが失敗します)
Security Hub の擬似テスト用 CLI コマンド
aws securityhub batch-import-findings --region ap-northeast-1 --findings '[
{
"SchemaVersion": "2018-10-08",
"Id": "test-finding-'$(date +%s)'",
"ProductArn": "arn:aws:securityhub:ap-northeast-1:アカウントID:product/アカウントID/default",
"GeneratorId": "test-generator",
"AwsAccountId": "アカウントID",
"Types": ["Software and Configuration Checks"],
"CreatedAt": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'",
"UpdatedAt": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'",
"FirstObservedAt": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'",
"LastObservedAt": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'",
"Severity": {"Label": "CRITICAL"},
"Title": "Test Finding for EventBridge Rule",
"Description": "This is a test finding to verify EventBridge notification.",
"Resources": [{"Type": "AwsEc2Instance", "Id": "arn:aws:ec2:ap-northeast-1:アカウントID:instance/i-test12345678"}],
"Compliance": {
"Status": "FAILED",
"SecurityControlId": "EC2.99"
},
"RecordState": "ACTIVE",
"Workflow": {"Status": "NEW"},
"WorkflowState": "NEW",
"Remediation": {
"Recommendation": {
"Text": "This is a test finding to verify EventBridge notification.",
"Url": "https://docs.aws.amazon.com/console/securityhub/EC2.99/remediation"
}
}
}
]'
CLI コマンドを実行すると Security Hub の擬似的な検出結果が作成され、Slack チャンネル上に整形されたフォーマットで通知されました!
記載されている参考URLから、この検出結果の意味や、どのような対処が必要かも確認できます。

※ 今回 CLI コマンドで出力した擬似検出結果 EC2.99 は架空のもので、参考ドキュメントには記載がありません。
今回試した内容は以上です。
さいごに
いかがでしたでしょうか。
これまで Security Hub のアラートメールをあまり活用できていなかった方も、文章を整形して Slack チャンネル一箇所にまとめて通知することで、確認がしやすくなると思います。
より高度に通知内容をカスタマイズするには Lambda 関数をはさんだり、Slack アプリケーションを作成して Webhook を利用するといった方法になると思いますが、今回はこのような手間をかけず、10分ほどで簡単に実装できる方法をご紹介しました。
この内容がお役に立てば幸いです!
クラスメソッドオペレーションズ株式会社について
クラスメソッドグループのオペレーション企業です。
運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。
※2026年1月 アノテーション㈱から社名変更しました







