Security Hub 検出結果のフィルタリング例

2020.06.23

Security Hubで出てきた検出結果イベントを SNS, CloudWatch Events ルール (EventBridge) を介してメールや Slackチャンネルに投稿ができます。 が、特にフィルタ設定をしないとチェックの合格・不合格に関わらず通知が来るので重要な情報が埋もれがちです。

Security Hub 検出結果フィルタリング例をいくつか紹介します。

イベント周りの前提知識

Security Hub Findings - Imported イベント

Security Hub は、すべての結果を Security Hub Findings - Imported イベントとして CloudWatch イベント に自動的に送信します。

– 引用: CloudWatch イベント による AWS Security Hub の自動化

主にこのイベントを Security Hubの結果通知に利用します。

AWS Security Finding 形式(ASFF)

Security Hubは定期的なチェックを行います。チェックの合格・不合格に関わらずイベントとなります。 なので、何もフィルタリングしない設定をした場合、大量の通知がきます。 運用で活用していくにはこれらイベントをフィルタリングする必要がでてきます。

Security Hubのイベントは AWS Security Finding 形式(ASFF) と呼ばれる JSON構文で格納されています。 この構文を基にフィルターを作成していきます。

EventBridge のフィルタリング方法の詳細は下記参照ください。

例1: セキュリティチェックに合格しなかった結果を取得する

Complianceオブジェクト にはセキュリティチェックの結果 ( Compliance.Status ) が含まれます。 ステータスの種類は以下の通りです。

内容
PASSED チェックに合格
WARNING 不足している情報がある or チェックをサポートしていない
FAILED 1つ以上のリソースがチェックに合格しなかった
NOT\_AVAILABLE サービス停止もしくはAPIエラーにより、チェックを実行できなかった

チェックに合格しなかったもの( PASSED 以外)を見たいケースが多いと思います。 その場合のフィルタ設定です。

{
  "source": [
    "aws.securityhub"
  ],
  "detail-type": [
    "Security Hub Findings - Imported"
  ],
  "detail": {
    "findings": {
      "Compliance": {
        "Status": [
          {
            "anything-but": "PASSED"
          }
        ]
      },
      "RecordState": [
        "ACTIVE"
      ]
    }
  }
}

例2: セキュリティチェックに合格しなかった結果を(1度だけ)取得する

Security Hubは定期的なチェックを行います。 "例1" はセキュリティチェックに合格しなかった結果が解決されない限り、 継続して通知し続けます。

チェックに合格しなかったもの( PASSED 以外)を 1度だけ 通知する場合のフィルタ設定が以下になります。

{
  "source": [
    "aws.securityhub"
  ],
  "detail-type": [
    "Security Hub Findings - Imported"
  ],
  "detail": {
    "findings": {
      "Compliance": {
        "Status": [
          "PASSED"
        ]
      },
      "RecordState": [
        "ARCHIVED"
      ]
    }
  }
}

チェックに合格 PASSED していた結果が アーカイブ ARCHIVED された ( = PASSED 以外のステータスになった) ときに通知を行います。

例3: 重要度が高い結果を取得する

セキュリティチェックの結果には重要度 Severity.Label の値が付与されます。 セキュリティチェックに合格 PASSED している場合は INFORMATIONAL となります。 不合格している、大きなセキュリティリスクを含んだ結果は CRITICALHIGH となります。

  • INFORMATIONAL – 問題は見つかりませんでした。
  • LOW – この問題は単独で対処する必要はありません。
  • MEDIUM – この問題は対処する必要がありますが、緊急ではありません。
  • HIGH – この問題は優先事項として対処する必要があります。
  • CRITICAL – この問題は悪化しないようにすぐに修正する必要があります。

– 引用: AWS Security Finding 形式 > Severity

以下、重要度の高い結果 ( CRITICAL , HIGH )を通知するフィルタ設定です。

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

例4: AwsAccount リソースタイプの結果を除外する

//(2020/10/06追記) 現在はこのフィルタリングは不要です。コントロールにサマリーとしての「セキュリティチェックに失敗しているAWSアカウント」検出結果は生成されなくなりました。//

セキュリティチェックに失敗しているときに、下図のように 「セキュリティチェックに失敗したリソース」と 「セキュリティチェックに失敗しているAWSアカウント」が同時に通知されます。

img

1環境で運用している場合は、 AwsAccount リソースタイプの通知は冗長になることが多いです。 以下は "例1" をベースに AwsAccount リソースタイプを除外したものです。

{
  "source": [
    "aws.securityhub"
  ],
  "detail-type": [
    "Security Hub Findings - Imported"
  ],
  "detail": {
    "findings": {
      "Compliance": {
        "Status": [
          {
            "anything-but": "PASSED"
          }
        ]
      },
      "RecordState": [
        "ACTIVE"
      ],
      "Resources": {
        "Type": [
          {
            "anything-but": "AwsAccount"
          }
        ]
      }
    }
  }
}

おわりに

Security Hub の結果通知のフィルタリング例を紹介してみました。 複数のフィルターを作成・試運用してみて、 適宜チューニングするのが良いと思います。

少しでもどなたかのお役に立てば幸いです。

参考

▼ Security Hub

▼ EvenntBridge

▼ Developers.IO