GuardDuty のアラートをフィルタリング・自動アーカイブし、Slackへ通知されないようにする

2020年11月18日

概要

やりたいこと

Slack に GuardDuty アラートを通知している。

問題として、既知の問題ないことが判明しているアラートも Slack 通知されてしまう。
これを解消するため、GuardDuty フィルタリングを行う。

GuardDuty Filter

GuardDuty はフィルタリングの結果を自動的にアーカイブする機能がある。

「結果の抑制」より、フィルタリングを指定し、ルール名を指定して保存する。

抑制された結果は、AWS Security Hub、Amazon S3、CloudWatch Events には送られないため、 Slack へ通知されなくなる。

CloudFormation で書く場合、AWS::GuardDuty::Filter の Action で指定する。

  GuardDutyFilter:
    Type: AWS::GuardDuty::Filter
    Properties:
      Action: ARCHIVE
      Name : SampleFilter
      Description: SampleFilter
      Rank : 1
      DetectorId: !Ref GuardDuty
      FindingCriteria:
        Criterion:
          resource.resourceType:
            Eq:
              - Instance

フィルターの対象

GuardDuty の結果タイプには 3 種類あり、これが GuardDuty のフィルタ(検索)に利用できる。

例えば、IAM の結果タイプのをフィルタリングしたい場合、リソースタイプを AccessKey に指定する。

フィルタに利用できるプロパティは下記参照。

CloudFormation

リソースタイプ が IAM を除外

IAM の結果タイプを抑制するサンプル。

Description: GuardDuty
Resources:
  GuardDuty:
    Type: AWS::GuardDuty::Detector
    Properties:
      Enable: true
      FindingPublishingFrequency: FIFTEEN_MINUTES

  GuardDutyFilter:
    Type: AWS::GuardDuty::Filter
    Properties:
      Action: ARCHIVE
      Name : IAMFilter
      Description: IAMFilter
      Rank : 1
      DetectorId: !Ref GuardDuty
      FindingCriteria:
        Criterion:
          resource.resourceType:
            Eq:
              - AccessKey

特定インスタンスの特定アラートを除外

特定インスタンスから継続的にアラートが出てしまう場合、インスタンスと検索タイプ(アラート名)を組み合わせたフィルターを作成する。

AWSTemplateFormatVersion: 2010-09-09
Description: GuardDuty
Resources:
  GuardDuty:
    Type: AWS::GuardDuty::Detector
    Properties:
      Enable: true
      FindingPublishingFrequency: FIFTEEN_MINUTES

  GuardDutyFilter:
    Type: AWS::GuardDuty::Filter
    Properties:
      Action: ARCHIVE
      Name : AlertFilter
      Description: AlertFilter
      Rank : 1
      DetectorId: !Ref GuardDuty
      FindingCriteria:
        Criterion:
          type:
            Eq:
              - Trojan:EC2/BlackholeTraffic!DNS
          resource.instanceDetails.instanceId:
            Eq:
              - i-99999999

こういう結果になる。

参考

所見のフィルタリング

AWS::GuardDuty::Filter FindingCriteria