【小ネタ】GuardDuty 通知は Security Hub 経由で行うとリージョン集約ができて便利

2022.03.24

Security Hub にはリージョン集約機能がある

AWS Security Hub は セキュリティサービスです。 主に以下 2つの主要機能を持ちます。

  • [セキュリティイベント集中管理] 様々なセキュリティサービスで発生するイベントを集中管理する
  • [クラウドセキュリティポスチャー管理] AWS上の構成を評価して潜在的なセキュリティリスクを発見する

そんな Security Hub に最近 リージョン集約機能 が実装されました。

Security Hubで管理するセキュリティイベント(検出結果)を 特定のリージョン(集約リージョン) へ集約できる機能です。

img

例えば Security Hub を全リージョンで有効化している場合に、 この機能を使うことで集約リージョンでのみ通知設定を入れるだけで、 全リージョン分の通知を実現できます。

GuardDutyの通知設定も集約しよう

GuardDutyは Security Hub にデフォルトで統合されています。 GuardDuty で出てきた検出結果は、 Security Hub 側でも管理されます。

つまり、Security Hub のリージョン集約機能を使えば GuardDutyの検出結果も (Security Hub経由で) 特定リージョンへ集約できます。 通知設定も集約リージョンのみで済みます。楽ちん。

img

作ってみる

前提として GuardDutyを有効化させるリージョンでは Security Hub も有効化しておきましょう。 そして Security Hub のリージョン集約設定を適用させておきましょう。 (やり方は アップデートブログ を参照ください)

ルール設定

まずは集約リージョンにて以下リソースを作ります。

  • EventBridgeルール
  • SNSトピック

EventBridgeルールのイベントパターンは以下のようなJSONです。 Security Hub 経由である点に注意。

{
  "source": ["aws.securityhub"],
  "detail-type": ["Security Hub Findings - Imported"],
  "detail": {
    "findings": {
      "ProductName": ["GuardDuty"],
      "Severity": {
        "Label": ["LOW", "MEDIUM", "HIGH", "CRITICAL"]
      }
    }
  }
}

(参考) これらリソースは CloudFormation テンプレートで作りました

AWSTemplateFormatVersion: '2010-09-09'
Parameters:
  Prefix:
    Type: String
  Severities:
    Type: CommaDelimitedList
    Default: "LOW,MEDIUM,HIGH,CRITICAL"

Resources:
  # EventBridge Rule
  EventBridgeRule:
    Type: AWS::Events::Rule
    Properties: 
      Name: !Sub "${Prefix}-guardduty-finding-rule"
      EventPattern:
        "source": ["aws.securityhub"]
        "detail-type": ["Security Hub Findings - Imported"]
        "detail":
          "findings":
            "ProductName": ["GuardDuty"]
            "Severity":
              "Label": !Ref Severities
      Targets: 
        - Arn: !Ref SnsTopic
          Id: sns-topic

  # SNS Topic
  SnsTopic:
    Type: AWS::SNS::Topic
    Properties: 
      TopicName: !Sub "${Prefix}-guardduty-topic"

  # SNS Topic Policy
  EventTopicPolicy:
    Type: AWS::SNS::TopicPolicy
    Properties:
      PolicyDocument:
        Statement:
          - Effect: "Allow"
            Principal:
              Service: "events.amazonaws.com"
            Action: "sns:Publish"
            Resource: "*"
      Topics:
        - !Ref SnsTopic

通知設定

作成した SNSトピックへサブスクライブさせて通知設定を行います。 今回は AWS Chatbot を使いました。

img

試してみる

東京リージョン で先程のルール設定、通知設定を構築しています。

その状態で バージニア北部リージョン の GuardDutyの [設定 > 結果のサンプル] にて 検出結果サンプルを生成してみます。(※注意: 100個近く検出結果が作られます)

img

しばらくすると Slackに(大量の)通知が飛んできました。 バージニア北部リージョン(us-east-1) の検出結果であることがわかります。

img

おわりに

投稿時点では GuardDuty はリージョン集約に対応していないです。 なので複数リージョンの通知をカバーしたい場合は、 Security Hub 経由で行うのが一番楽でしょう。

参考