GuardDutyを一発で有効化して通知設定するテンプレート作った(Topic指定版)

GuardDutyを有効化するときに、ついでにSNS通知の設定も行うCloudFormationテンプレートです。以前SNS Topicをテンプレートで作成するものを用意しましたが、今回は既存のTopicを利用するテンプレートです。
2018.09.23

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

こんにちは、臼田です。

以前GuardDutyを全リージョンで有効化するテンプレートを作成しました。

一発でGuardDutyを全リージョン有効化して通知設定するテンプレート作った

このときは全リージョンで通知の設定をする都合上新しいSNS Topicを作成していますが、既存のTopicを利用したいケースもあるのでそのテンプレートも作成しました。

テンプレート

こちらに置きました。コードも以下に乗せておきます。CloudFormationからはリンク指定して実行すると楽だと思います。

AWSTemplateFormatVersion: 2010-09-09
Description:
  'enable guardduty and set alert'
Parameters:
  TopicARN:
    Description: Enter SNS Topic ARN(e.g. arn:aws:sns:region:account_id:topic_name) to send notification.
    Type: String
Resources:
  GDD:
    Type: 'AWS::GuardDuty::Detector'
    Properties:
      Enable: true
  ER:
    Type: 'AWS::Events::Rule'
    Properties:
      Name: AlertGuardDutyFindings
      Description: 'Alert to SNS topic when find threats by GuardDuty'
      EventPattern: {
                      "source": [
                        "aws.guardduty"
                      ],
                      "detail-type": [
                        "GuardDuty Finding"
                      ]
                    }
      Targets:
        - Arn: !Ref TopicARN
          Id: Id123
これにより下記が実行されます。
  • GuardDutyの有効化
  • CloudWatch Event RuleにてGuardDutyで検知したらSNSで通知するように設定

使い方

テンプレート実行

CloudFormationのスタック作成画面から「URL指定」で上記のURLを入力して次へ進みます。

スタック名と通知対象とするSNS TopicのARNを入力して次へ進みます。あとはそのまま進んで作成を完了します。

SNS Topicのポリシー追加

2019/05/28追記 本項目を追加しました

既存のSNS Topicの設定によっては、CloudWatch Eventからの通知を受け取れないポリシーになっている可能性があります。(デフォルトでは受け取れません)

したがって、これを変更してあげる必要があります。具体的には下記のポリシーが必要になります。

{
  "Sid": "AWSEvents_AlertGuardDutyFindings_Id123",
  "Effect": "Allow",
  "Principal": {
    "Service": "events.amazonaws.com"
  },
  "Action": "sns:Publish",
  "Resource": "arn:aws:sns:ap-northeast-1:999999999999:GuardDutyTopic"
}

ポリシーを直接書き換えてもいいのですが、マネジメントコンソールでテンプレートから作成されたCloud Watch Eventを更新してあげるだけで自動的に追加できます。

CloudWacth Eventのルールから作成されたルールを選択します。

右上の「アクション」から「編集」します。

何も変更せずに「設定の詳細」へ移動します。

引き続き何も変更せずに「ルールの更新」を押します。表示されているように、ターゲット(SNS)に必要なアクセス権限(トピックポリシー)を自動的に追加してくれます。

以上で完了です。

まとめ

今回はさっくりとですが既存のSNS Topicを利用したGuardDutyの通知設定を行いました。

本当は、全リージョンで同じようなことができればベターですが、GuardDutyはリージョンごとに通知の設定を行う必要があり、リージョンをまたがったSNSの利用が出来ないため、リージョンごとに別々のSNS Topicが必要になり、テンプレートでの一発実行は実現できません。

GuardDutyの通知内容を1つのリージョンにまとめる、とか出来るようになったらサイコーですけどね、その時を待ちましょう!