AWS

【必見】脅威検出サービス GuardDuty を全リージョンへ一括設定

GuardDuty

こんにちは。
AWS環境の脅威を検出してくれるサービス「GuardDuty」を一括で全リージョンに設定する手順を説明します。

はじめに

GuardDutyとは何?という方は以下の記事でまとめているのでこちらから見ていってください。

GuardDuty
【まとめ】脅威検出サービス GuardDuty の使い方 こんにちは。AWS環境のセキュリティ対策のひとつである GuardDuty の使い方について説明していきたいと思います。 こんな...

GuardDutyはAWS環境を利用する方すべてにおいて設定必須なサービスです。設定方法もボタン一つで簡単に行うことができます。
ただし、ここで1点注意事項があります。

マネージメントコンソール画面からは単一リージョンしか設定できず、各リージョンで有効化ボタンを押して回らなければなりません!!

攻撃者は普段利用しないリージョンをターゲットにハイスペックなインスタンスを構築しコインマイニングを行います。

普段よく使う「東京リージョン」のみ設定して安心していると、翌月の請求がウン十万・ウン百万となってしまう可能性があるのです。

しっかりと自分の資産を守るためにも全てのリージョンに対し、GuardDutyを有効にしておきましょう!

設定方法

GuardDutyが脅威を検知するとCloud Watch EventsとSNSを介して通知が上がるような構成になるよう設定します。

構成

構成図は以下の通り。

構成図

今回作成する構成については以下の通り。

  • GuardDutyの有効化
  • SNSの通知先メールアドレスの登録(別途承認は必要)
  • CloudWatch Ruleを作成
    →これでGuardDutyが脅威を検知するSNSでメール通知される

CloudFormationテンプレート

使用するCloudFormationテンプレートはこちらです。

AWSTemplateFormatVersion: 2010-09-09
Description:
  "enable guardduty and set alert"
Parameters:
  MailAddress:
    Description: Enter email address to send notification.
    Type: String
Resources:
  GDD:
    Type: "AWS::GuardDuty::Detector"
    Properties:
      Enable: true
  SNST:
    Type: "AWS::SNS::Topic"
    Properties:
      TopicName: GuardDutyTopic
  SNSS:
    Type: "AWS::SNS::Subscription"
    Properties:
      Endpoint: !Ref MailAddress
      Protocol: email
      TopicArn: !Ref SNST
  SNSTP:
    Type: "AWS::SNS::TopicPolicy"
    Properties:
      PolicyDocument:
        Id: default_policy_ID
        Version: "2012-10-17"
        Statement:
        - Sid: default_statement_ID
          Effect: Allow
          Principal:
            AWS: "*"
          Action:
            - "SNS:GetTopicAttributes"
            - "SNS:SetTopicAttributes"
            - "SNS:AddPermission"
            - "SNS:RemovePermission"
            - "SNS:DeleteTopic"
            - "SNS:Subscribe"
            - "SNS:ListSubscriptionsByTopic"
            - "SNS:Publish"
            - "SNS:Receive"
          Resource: !Ref SNST
          Condition:
            StringEquals:
              "AWS:SourceOwner": !Ref "AWS::AccountId"
        - Sid: AWSEvents_AlertGuardDutyFindings_Id123
          Effect: Allow
          Principal:
            Service:
            - "events.amazonaws.com"
          Action: "sns:Publish"
          Resource: !Ref SNST
      Topics:
      - !Ref SNST
  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 SNST
          Id: Id123

StackSetsでGuardDuty一括設定

StackSetsは、本来は単一リージョンに対してしか利用できないスタックをリージョン・アカウントをまたがって一括設定を行う機能となります。
今回はこのStackSetsを利用して、全リージョンに対してGuardDutyを設定していきます。


CloudFormation の StackSets を選択し、「StackSetsの作成」をクリックします。

画面キャプチャ1

「テンプレートの指定」で上記テンプレートを指定し、「次へ」をクリックします。

画面キャプチャ2

「StackSet の詳細を指定」で「StackSet名」と「パラメータ」を入力します。

StackSet名スタックセットの名前
GuardDutyの一括設定と分かるような名前で設定
パラメータ通知先のメールアドレス
SNSの送信先アドレスとなる
画面キャプチャ3

「アカウント」では「スタックをアカウントにデプロイ」を選択し、「アカウント番号」に対象のアカウントIDを指定します。

「リージョンの指定」では「すべてのリージョンを追加」をクリックします。

画面キャプチャ4

「すべてのリージョンを追加」をクリックすると以下のようになります。
ここで既に設定済みのリージョンがある場合は「削除」から外しておいてください。

「リージョンの指定」ができたら「次へ」をクリックします。

画面キャプチャ5

確認画面にて設定値を確認後、「送信」をクリックします。

画面キャプチャ6
画面キャプチャ7

作成後は詳細画面が表示され、しばらくすると全てのリージョンに対してGuardDutyの設定が行われます。

SNSで通知先メールアドレスを登録するので、通知先メールアドレス宛に承認確認のメールが設定したリージョン分送信されます。
こちらも忘れずに承認しておいてください。

以上で設定は完了です。

これで万が一知らぬ間にコインマイニング用のインスタンスを建てられても即時対応できると思います。

まとめ

GuardDutyは全リージョンで有効化しておくことをおすすめします。
何か発生してからでは遅いので資産を守るためにしっかりと対応をしていきましょう!

ABOUT ME
湖山 貴裕
はじめまして。 二児のお父さんプログラマーです。最近キャンプにも興味あり。夏には庭でキャンプしようともくろみ中。ボドゲ好き。チョコ好き。茶道経験者。 2012年大学卒業→IT企業就職 Java,VB.NET, C#, javascript等の企業向けシステム開発/主にバックエンドを担当/AWSを少しかじる→2020年フリーランスエンジニアへ転身 広島でAWS案件にて楽しく活動中