GuardDutyの抑制ルールを活用してセキュリティ検知のノイズを減らす

2022.08.22

はじめに

Amazon GuardDuty は驚異検知を行うセキュリティサービスです。 「ログの継続的な分析」および「ログに潜む脅威の検知」をマネージドな形で提供します。

img

(画像: AWS再入門ブログリレー2022 Amazon GuardDuty 編 | DevelopersIO)

今回はGuardDuty運用で活用できる「抑制ルール」について 使い方を説明します。

抑制するモチベーション

GuardDuty運用では通知実装がほぼ必須です。 驚異検知の内容次第では、早急なセキュリティ対応が求められるからです。 素早く気づき、素早く動けるように仕組み化します。

ただGuardDutyを運用していると、「だいたいの通知が過検知だな」 と感じる人、多いと思います。 私も長く運用しているわけでは無いですが、以下のような過検知を観測しています。

過検知はノイズになります。 セキュリティ担当者の負荷が大きくなります。 本来見つけたいインシデントを逃すリスクにも繋がります。

負荷を無くすためにも「減らせる検知は減らしていきたい」ですよね。 そのときに役立つのが「抑制ルール」です。

抑制ルールとは

抑制ルール は「条件に一致した新規 検出結果」を自動アーカイブする機能です。 条件の部分は フィルター を組み合わせて作成します。 誤検知の除去に役立ちます。

フィルター は「属性名」と「その値」の組み合わせです。 どのようなフィルターが作成できるかは以下ドキュメントを参照ください。

いくつか代表的なフィルタをピックアップします。

コンソールでの表示名 備考
Account ID(アカウントID)
Region (リージョン)
Finding Type(検出結果タイプ) 参考: 検出結果の表
Severity (重要度) 参考: GuardDuty の検出結果の重要度
Username (ユーザー名)
API caller IPv4 address(API発信者 IPv4アドレス)
Instance ID (インスタンスID)
Bucket name (バケット名)

抑制ルールはマネジメントコンソール、もしくは CLI/SDK, IaC などから作成します。 マネジメントコンソールからは過去の検出結果を確認しながら、 フィルターを作成できます。便利です。

img

抑制ルールの作り方

抑制ルールを作る流れを説明します。

マネジメントコンソールで作成

[GuardDuty > 検出結果] のページに移動します。

まずは 抑制したい検出結果のみに絞る フィルターを作成していきます。 [フィルタの追加] から作成できます。

img

以下に示すキャプチャでは「検出結果が Discovery:IAMUser/AnomalousBehavior 」 かつ「重要度が Low」 かつ 「アカウントIDが 111111111111 」のフィルタを作成しています。

img

抑制ルールを作成するには、フィルター作成後に [検出結果の抑制] を選択します。 必要項目を記載後 [保存] を選択して、完了です

img

「保存済みのルール」に作成したものがあればOKです。 このフィルターにマッチする「将来出てくる検出結果」は自動アーカイブされます。

img

コードで作成

CloudFormationや Terraformで抑制ルールを作成できます。

まずは Action = NOOP (抑制しない) に指定して リソースを作成すると良さそうです。 マネコンで結果を確認して、意図したフィルターになっていたら Action = ARCHIVE (抑制する)に変えて、適用します。

以下に Terraformのサンプルを1つ記載します。

### Provider
provider "aws" {
  region = "ap-northeast-1"
}

### Locals
locals {
  detector_id         = "a2bfexample"
  outbound_account_id = "111111111111"
}

### Resources
# 集約NATゲートウェイ(アカウントID: 111111111111) 経由の AWS API実行」検知を抑制する
resource aws_guardduty_filter InstanceCredentialExfiltration_InsideAWS {
  name        = "InstanceCredentialExfiltration_InsideAWS"
  description = "filter InstanceCredentialExfiltration.InsideAWS findings, via NAT gateway in outbound account."
  action      = "ARCHIVE"
  rank        = 1
  detector_id = local.detector_id

  finding_criteria {
    criterion {
      field  = "type"
      equals = [ "UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration.InsideAWS" ]
    }

    criterion {
      field     = "severity"
      less_than = "7" # to catch LOW, MEDIUM (not HIGH) findings
    }

    criterion {
      field  = "service.action.awsApiCallAction.remoteAccountDetails.accountId"
      equals = [
        local.outbound_account_id,
      ]
    }
  }
}

おわりに

GuardDutyの抑制ルールについて説明しました。

頻出している検出結果があり、ノイズとなる場合に使いましょう。

また、フィルターを多く組み合わせて、「該当検知のみ除外」できていること意識します。 本来検知してほしい検出結果がアーカイブされないように注意します。

以上、参考になれば幸いです。

参考