AWS Security Hub検出結果を重要度ごとにメールを受け取る方法[AWS CloudFormation テンプレート付き]

こんにちは、SCSKの石原です。

AWS Security Hubネタです。AWS Security Hubのコンソールは非常に見やすいのですが、検証環境など普段からあまり見ない環境ですと通知が欲しくなります。AWS Security HubはAmazon EventBridgeと統合されているため、AWS LambdaやAmazon SNSを通じて通知を発行することが可能です。

通知の仕掛けをAWS CloudFormationでサクッと構築する方法を記述します。

概要

Security Hubの検出結果を重要度に応じてメールに通知する仕組みを実装します。

概要図は以下の通りです。

  1. Security Hubを利用するため、AWS ConfigやGuardDutyを有効にします
  2. Security Hubで適用するセキュリティ基準を選択します。今回は2件有効にしています。
    1. AWS Foundational Security Best Practices
    2. CIS AWS Foundations Benchmark v1.2.0
  3. EventBridgeのルールにより、Security Hubの特定のイベントを検知して、SNSにパブリッシュします
  4. SNSによりemailで通知されます。

前提タスク

メール通知の前提タスクとして、3つのサービスを有効化しておきます。

  • AWS Config
  • Amazon GuardDuty
  • AWS Security Hub

Amazon Configの有効化

Configはリージョンリソースです。

「グローバルリソースを含めるかどうか」については検討項目になるかと思います。基本的には含めたほうがいい認識です。

コンソールによる AWS Config の設定 - AWS Config
Amazon SNS を使用して設定変更を通知し、Amazon S3 を使用して履歴とスナップショット情報を保存するように AWS Config を設定します。

Amazon GuardDutyの有効化

GuardDutyはリージョンリソースです。リージョンを指定してコンソールから有効化できます。

GuardDuty の開始方法 - Amazon GuardDuty
ベーシックな構成で Amazon GuardDuty をセットアップします。

AWS Security Hubの有効化

Security Hubはリージョンリソースです(※)。リージョンを指定してコンソールから有効化できます。

Security Hub を手動で有効にする - AWS Security Hub
AWS Management Console または AWS Security Hub API を使用して Security Hub を有効にします。

メール通知実装

メール通知するために、EventBridgeとSNSの設定をCFnテンプレートを活用して実装します。

実装テンプレート

AWSTemplateFormatVersion: "2010-09-09"
Description: "security hub notify template"
Parameters:
  NotifyEmailAddress:
    Type: String
    Default: "your email address"

  Severity:
    Type: String
    Default: "CRITICAL"
    AllowedValues:
      - "CRITICAL"
      - "HIGH"
      - "MEDIUM"
      - "LOW"
      - "INFORMATIONAL"

  EventType:
    Type: String
    Default: "SecurityHubNotify"

Resources:
# =====================================
# SNS
# =====================================
  EventTypeNotifyTopic:
    Type: AWS::SNS::Topic
    Properties: 
      DisplayName: !Sub "${EventType}-${AWS::AccountId}-${Severity}"
      TopicName: !Sub "Topic-${AWS::AccountId}-${EventType}-${Severity}"

  EventTypeNotifyTopicPolicy:
    Type: AWS::SNS::TopicPolicy
    Properties:
      PolicyDocument:
        Statement:
          - Effect: "Allow"
            Principal:
              Service: "events.amazonaws.com"
            Action: "sns:Publish"
            Resource: "*"
      Topics:
        - !Ref EventTypeNotifyTopic

  Subscription:
    Type: AWS::SNS::Subscription
    Properties: 
      Endpoint: !Ref NotifyEmailAddress
      Protocol: email
      TopicArn: !Ref EventTypeNotifyTopic

# =====================================
# EventBridge
# =====================================
  SecurityHubNotifyEventRule:
    Type: AWS::Events::Rule
    Properties: 
      Description: !Sub "Security notice : ${Severity}"
      EventPattern: 
        detail-type: 
        - "Security Hub Findings - Imported"
        source:
        - "aws.securityhub"
        detail:
          findings: 
            Compliance: 
              Status:   
                - "FAILED"
                - "WARNING"
            RecordState:
              - "ACTIVE"
            Workflow:
              Status: 
                - "NEW"
            Severity:
              Label:
                - !Sub "${Severity}"
      Name: !Sub "${EventType}-${Severity}-Rule"
      State: ENABLED
      Targets: 
      - Arn: !Ref EventTypeNotifyTopic
        Id: !Sub "${EventType}-${Severity}-SNS-Target"

実装テンプレートパラメータ

テンプレートに与えるパラメータは下記の通りです。

NotifyEmailAddress
通知先のメールアドレスを指定します。
※SNSのサブスクリプションに登録されますので、認証用のメールが通知されたら承認してください
Severity
通知する重大度を選択します。
EventType
各種リソース名に利用しています。必要に応じて変更可能です。

終わりに

メールを見やすくしたい場合は、LambdaをかましてSecurity HubイベントのJsonをパースしてSNSにパブリッシュしましょう。

今回は通知だけですが、自動修復まで含めたソリューションをAWSが提供されています。

AWS での自動化されたセキュリティ対応 | AWS ソリューション
AWS Security Hub で事前に定義された対応と修復アクションにより、セキュリティ脅威に自動的に対処する

大量のアカウントを管理している場合では、検出した後の修復についても検討したいですね。

タイトルとURLをコピーしました