【全リージョン対応】EventBridge + SNS + Chatbotで GuardDutyの結果を Slackチャンネルに通知する

2020.05.20

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

最近 GAされた AWS Chatbot を使って GuardDutyの結果を Slackチャンネルに通知してみます。

目次

  1. GuardDutyの通知方法について
  2. AWS Chatbotを使った通知がオススメ
  3. 構築してみた
    1. 1. (準備) GuardDutyの全リージョン有効化
    2. 2. SNS, EventBridge リソースの作成 (CFnテンプレート)
    3. 3. SNS, EventBridge リソースの作成(CFn StackSets)
    4. 4. Chatbot 設定(Slackの登録)
    5. 5. Chatbot 設定(通知設定)
  4. 確認
  5. おわりに
  6. 参考

GuardDutyの通知方法について

Amazon GuardDuty はマネージドな 脅威検出サービス です。 VPCフローログ、AWS CloudTrail イベントログ、DNSログを分析し、 悪意のあるアクティビティを検出します。早急なセキュリティ対応に役立ちます。

GuardDutyは サポートされている全てのリージョンで有効化 が強く推奨されています。

さて、全リージョンで有効化した後に考えないといけないのは GuardDutyで検出された結果の通知方法 です。

Amazon SNS を活用して特定の Eメールに飛ばす方法や、他 3rdパーティのツールを活用する方法などあります。 (参考: 一発でGuardDutyを全リージョン有効化して通知設定するテンプレート作った | Developers.IO)

AWS Chatbotを使った通知がオススメ

普段 Slackを業務で使っている方 には、 AWS Chatbot を利用した通知がオススメです。 Chatbot は最近 GAされたサービスです。AWSのアラートなどをトリガーに、 Slackチャンネルや Amazon Chime チャットルームに通知を簡単に飛ばしてくれます。

GuardDutyで出てきた結果を Slackの特定のチャンネルに飛ばすことができます。

  • GuardDutyの結果は Amazon CloudWatch Events のイベントとして、利用できます
  • Amazon EventBridge を使って、このイベントをトリガーに SNS通知を行う設定をします
  • Chatbot を使って SNS通知を Slackチャンネルに通知します

構築してみた

「GuardDutyの結果を Slackチャンネルに通知する構成」を 全リージョンに展開 してみます。

  1. (準備)GuardDutyの全リージョン有効化
  2. SNS, EventBridge リソースの作成(CFnテンプレート)
  3. SNS, EventBridge リソースの作成(CFn StackSets)
  4. Chatbot 設定(Slackの登録)
  5. Chatbot 設定(通知設定)

1. (準備) GuardDutyの全リージョン有効化

サポートされている全リージョンで GuardDutyを有効化しておきます。 (マネジメントコンソールでポチポチしてもそれほど時間はかかりません)

2. SNS, EventBridge リソースの作成 (CFnテンプレート)

以下のような CFnテンプレートを作成しました。

  • SnsTopicリソース :: イベントのターゲット、及び Chatbot 連携先の SNSトピック。 トピック名は guardduty-finding-topic としています。
  • EventTopicPolicyリソース :: EventBridgeから SNSトピックを通知するためのアクセス許可
  • EventBridgeRuleリソース :: トリガーの EventPattern に GuardDutyの結果 GuardDuty Finding 、ターゲットに 上述 SNSトピックを指定した EventBridgeルール

パラメータとして SeverityThreshold を指定しています。 GuardDuty結果の重要度でフィルタしたいときに利用します。(フィルタしない場合は 0 にしてください)

(参考: GuardDutyの通知が重要度でフィルター可能になりました | Developers.IO)

3. SNS, EventBridge リソースの作成(CFn StackSets)

作成した CFnテンプレートを StackSets を使って全リージョンに展開します。

※ StackSetsを初めて使う際は、「StackSetsを実行するための IAMロール AWSCloudFormationStackSetAdministrationRole 」、 「実際にCFnテンプレートを展開するための IAMロール AWSCloudFormationStackSetExecutionRole 」 が必要です。 (参考: CloudFormation StackSetsを試してみた | Developers.IO)

東京リージョンで StackSetsを作成します。 「デプロイオプションのデプロイ先」に 自身のAWSアカウントID、 「リージョンの指定」で すべてのリージョンを追加 を選択しましょう。

全てのスタックが CURRENT となれば展開完了です。

4. Chatbot 設定(Slackの登録)

Chatbotは グローバルサービス です。

まずは Slackへの通知権限を付与するために クライアント設定 をマネジメントコンソール上で行います。 AWS Chatbotのページに行き、 チェットクライアントに Slack を選択して「クライアント設定」を選択します。

対象のワークスペース、権限等確認して「許可する」を選択します。

設定済みクライアントに Slackワークスペースが登録されていることを確認します。

5. Chatbot 設定(通知設定)

Chatbotの SNS通知設定を行います。以下 CFnテンプレートを展開します。

  • ChatbotIamRoleリソース :: Chatbot用の IAMロールです。CloudWatch のReadOnly権限を与えています。
  • ChatbotConfigurationリソース :: Chatbotの通知設定です。 SnsTopicArns に全リージョンに作成した SNSトピックの ARNを指定しています。

また、Slackに関する情報として以下パラメータが必要です。

  • SlackWorkspaceId
  • SlackChannelId

SlackWorkspaceId は Chatbotマネジメントコンソールの以下から確認できます。

SlackChannelId投稿先のSlackチャンネル です。対象のチャンネルを右クリックして リンクをコピー したときの URL末尾 9桁です。

必要なパラメータを指定して、スタック作成しましょう。

確認

GuardDutyのサンプル結果 を出力してみます。

「GuardDuty > 設定」から 結果サンプルの生成 を実行してみます。

以下のように 【例】XXX といった GuardDuty結果がでてきました。

暫く待つと Slackチャンネルにも ↓ のように通知が飛んできます。

重要度によって色分けされていて、分かりやすいですね。

他のリージョンでも同じようにサンプルを出力してみて、同じように通知が来ること確認しましょう。

おわりに

EventBridge, SNS, Chatbotを利用した GuardDuty結果の Slack通知を 対応する全リージョンに展開してみました。

Chatbotを使うことで手軽に アラートの Slack通知が実現できました。

普段利用しているリージョンも、利用していないリージョンも GuardDutyによる脅威検知は役に立つので、 今回のようにすぐに気付ける仕組みを作成しておくことが大事です。

少しでもどなたかのお役に立てば幸いです。

参考