実践で学ぶDevOpsツールの使いこなし術 27

「AWS Security Hub CSPM」で複数のセキュリティサービスを集約管理してみよう

第27回の今回は、「AWS Security Hub CSPM」によるセキュリティ検出結果の一元集約と、重要な検出結果をSlackへ通知する仕組みの構築について解説します。

田中 智明

7月14日 6:30

はじめに

前回では、「Amazon GuardDuty」を使ってAWSアカウントの脅威を自動検知し、検出結果をSlackへ通知する仕組みを構築しました。これで、不審な挙動を検出から通知まで自動化できるようになりました。

ただし、AWS環境のセキュリティ運用にはGuardDuty以外にも複数のサービスが関わります。代表的なものは以下のとおりです。

これらが各々独自の検出結果を出力するため、コンソールを個別に確認するのは運用負荷が高い上、重要なアラートを見落としやすくなります。

そこで使うのが「AWS Security Hub CSPM」です。これは複数のセキュリティサービスの検出結果を一元集約するサービスで、業界標準ベンチマークに対する準拠度の自動評価機能も備えます。対象ベンチマークは「CIS AWS Foundations Benchmark」や「AWS Foundational Security Best Practices」です。

本記事ではSecurity Hub CSPMを有効化したうえで、EventBridge経由でCRITICAL/HIGHレベルの検出結果をSlackへ通知する仕組みを構築します。Security Hub CSPMのコントロール評価は「AWS Config」が記録したリソース構成を入力とするため、本記事では併せて有効化します。

なお、2025年以降、AWSは従来「AWS Security Hub」と呼ばれてきたサービスを「AWS Security Hub CSPM」にリブランドしました。その上位には統合レイヤーとなる新サービス「AWS Security Hub」(以降、本記事では区別のため「Security Hub v2」と表記)が新設されています。

本記事の中心となる基準評価機能はSecurity Hub CSPM側にあるため、本文では混同を避けるため「Security Hub CSPM」と明示して記述します。

AWS Security HubとSecurity Hub CSPMの関係

AWSのセキュリティ管理サービスとしての「Security Hub」は、現在は2層構成です。

  • AWS Security Hub CSPM
    旧AWS Security Hubのリブランド。「Cloud Security Posture Management」の略。CIS、AWS FSBP、PCI DSS、NIST 800-53などの業界標準ベンチマークに照らした構成チェック、セキュリティスコアの可視化、設定ミスの検出を担う。Terraformリソースaws_securityhub_accountaws_securityhub_standards_subscriptionで管理する
  • AWS Security Hub(v2)
    新統合サービス。Security Hub CSPM、GuardDuty、Inspector、Macieなどの検出結果を集約および相関させ、重大な露出(Exposure)の優先順位付けや自動化ワークフローを提供する

両者は階層関係にあり、Security Hub CSPMの検出結果はSecurity Hub v2に自動ルーティングされます。注意点は、Security Hub v2を単独で有効化しても基準評価(CIS/FSBPなど)の機能は得られないこと、基準評価する場合はSecurity Hub CSPMの有効化が必須となることです。

Security Hub v2の集約と優先順位付け機能については、AWS公式ドキュメントを参照してください。

Security Hub CSPMとは

Security Hub CSPMは、AWSアカウントのセキュリティ状態を一元管理するサービスです。複数のAWSセキュリティサービスとサードパーティ製品からの検出結果を集約し、統一フォーマット(AWS Security Finding Format/ASFF)で表示します。

主な機能

Security Hub CSPMが提供する機能は以下の3つです。

  • 検出結果の集約:GuardDuty、Inspector、Macie、IAM Access Analyzer、Firewall Managerなど複数サービスからの検出結果を統合する
  • セキュリティ基準の自動評価:CIS、AWS FSBP、PCI DSS、NIST 800-53などのベンチマークに沿った構成チェックを自動実行する
  • セキュリティスコアの可視化:全体の準拠率をパーセンテージで表示し、改善対象を一覧化する

Security Hub CSPMでは、以下の業界標準ベンチマークに対する自動チェックを有効化できます。

  • AWS Foundational Security Best Practices (FSBP):AWSが推奨するセキュリティベストプラクティス
  • CIS AWS Foundations Benchmark:Center for Internet Securityが策定したAWS向けベンチマーク
  • PCI DSS:クレジットカード業界のデータセキュリティ基準
  • NIST 800-53:米国NIST(National Institute of Standards and Technology)が定める情報システム向けセキュリティ統制

各基準は数十〜数百のコントロールから構成されており、有効化すると対象AWSリソースに対するチェックが定期的に実行されます。

料金体系

Security Hub CSPMは従量課金制で、実行されたセキュリティチェック数と取り込まれた検出結果数に応じて課金されます。新規有効化時は30日間の無料トライアルがあり、検証目的の利用は無料枠内で完結します。

Security Hub CSPMの有効化

AWS Configの有効化(前提条件)

Security Hub CSPMが評価するFSBPやCISコントロールの多くは、AWS Configが記録したリソース構成を入力とします。AWS Configが無効のままだとコントロール評価はINCOMPLETE状態となり、セキュリティスコアも計算されません。したがって、Security Hub CSPMよりも先にAWS Configを有効化します。なお、AWS Configは記録された設定項目数と配信先S3バケットのストレージ量に対して課金されます。AWS Configの料金については公式ドキュメントを参照してください。

# terraform/environments/dev/main.tf

data "aws_caller_identity" "current" {}

# Configログ保存用S3バケット
resource "aws_s3_bucket" "config_logs" {
  bucket        = "aws-config-logs-${data.aws_caller_identity.current.account_id}"
  force_destroy = true
}

resource "aws_s3_bucket_policy" "config_logs" {
  bucket = aws_s3_bucket.config_logs.id
  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Sid       = "AWSConfigBucketPermissionsCheck"
        Effect    = "Allow"
        Principal = { Service = "config.amazonaws.com" }
        Action    = ["s3:GetBucketAcl", "s3:ListBucket"]
        Resource  = aws_s3_bucket.config_logs.arn
      },
      {
        Sid       = "AWSConfigBucketDelivery"
        Effect    = "Allow"
        Principal = { Service = "config.amazonaws.com" }
        Action    = "s3:PutObject"
        Resource  = "${aws_s3_bucket.config_logs.arn}/AWSLogs/${data.aws_caller_identity.current.account_id}/Config/*"
        Condition = {
          StringEquals = { "s3:x-amz-acl" = "bucket-owner-full-control" }
        }
      }
    ]
  })
}

# Config用サービスリンクロール
resource "aws_iam_service_linked_role" "config" {
  aws_service_name = "config.amazonaws.com"
}

# Config レコーダー
resource "aws_config_configuration_recorder" "main" {
  name     = "default"
  role_arn = aws_iam_service_linked_role.config.arn

  recording_group {
    all_supported                 = true
    include_global_resource_types = true
  }
}

# Config 配信チャネル
resource "aws_config_delivery_channel" "main" {
  name           = "default"
  s3_bucket_name = aws_s3_bucket.config_logs.bucket
  depends_on     = [aws_config_configuration_recorder.main]
}

# Config レコーダーを起動
resource "aws_config_configuration_recorder_status" "main" {
  name       = aws_config_configuration_recorder.main.name
  is_enabled = true
  depends_on = [aws_config_delivery_channel.main]
}

all_supported = trueで全サポートリソースを記録対象とし、include_global_resource_types = trueでIAMなどのグローバルリソースも記録します。本記事は単一リージョン構成のためグローバルリソースもこのリージョンで記録します。

複数リージョンでAWS Configを有効化する場合は、グローバルリソースを記録するリージョンを1つに絞ります。他リージョンではinclude_global_resource_types = falseにします。両方をtrueにすると同一のIAMリソースが複数リージョンで重複記録され、課金も二重に発生します。

Terraformでの有効化

続いて、terraform/environments/dev/main.tfにSecurity Hub CSPMの有効化設定を追加します。

# terraform/environments/dev/main.tf

resource "aws_securityhub_account" "main" {
  enable_default_standards = false
}

enable_default_standards = falseを指定すると、Security Hub CSPM有効化時にデフォルトで有効化される標準(AWS FSBPなど)を抑止できます。評価対象の基準は次節で個別に指定するため、デフォルト動作を無効化します。

セキュリティ基準の有効化

評価対象とする基準をaws_securityhub_standards_subscriptionで個別に有効化します。ここでは「AWS FSBP」と「CIS AWS Foundations Benchmark v1.4.0」を有効化します。

# terraform/environments/dev/main.tf

data "aws_region" "current" {}

resource "aws_securityhub_standards_subscription" "aws_fsbp" {
  depends_on    = [aws_securityhub_account.main]
  standards_arn = "arn:aws:securityhub:${data.aws_region.current.region}::standards/aws-foundational-security-best-practices/v/1.0.0"
}

resource "aws_securityhub_standards_subscription" "cis_aws_foundations" {
  depends_on    = [aws_securityhub_account.main]
  standards_arn = "arn:aws:securityhub:${data.aws_region.current.region}::standards/cis-aws-foundations-benchmark/v/1.4.0"
}

Security Hub CSPMが対応するCIS AWS Foundations Benchmarkは「v1.2.0」「v1.4.0」「v3.0.0」「v5.0.0」の4種類です。本記事ではv1.4.0を採用します。利用可能なバージョンや最新のARN形式はAWSドキュメントで確認できます。

terraform applyを実行すると、対象リージョンでSecurity Hub CSPMが有効化され、指定した基準に基づく自動チェックが開始されます。評価開始直後の「セキュリティ基準」画面では有効化した基準が一覧表示されますが、準拠率は未算出です。チェック結果が出揃うまで数十分かかります。

有効化直後のセキュリティ基準画面

GuardDutyとの連携

Security Hub CSPMはGuardDuty、Inspector、Macieなど主要なAWSセキュリティサービスからの検出結果をデフォルトで自動取り込みします。追加の連携設定は不要です。

第26回で有効化したGuardDutyの新規検出結果は、数分以内にSecurity Hub CSPMのコンソールへ集約表示されます。

ダッシュボードの確認

概要画面

Security Hub CSPMコンソールを開くと、概要画面に以下の情報が表示されます。

  • セキュリティスコア:有効化した基準全体の準拠率(パーセンテージ)
  • セキュリティ基準:基準ごとの成功/失敗コントロール数と準拠率
  • 調査結果が最も多い資産:リソース別の調査結果数ランキング

概要画面のウィジェットは追加、削除、並び替えができるため、表示内容は環境によって異なります。

Security Hub CSPM概要画面

セキュリティ基準ごとの準拠状況

数十分の評価が完了すると、「セキュリティ基準」画面で各基準の準拠率とコントロール単位の評価結果が確認できます。失敗しているコントロールをクリックすると、影響を受けているAWSリソースの一覧と推奨修正方法が表示されます。

評価完了後のセキュリティ基準画面

例えば、「S3バケットのパブリックアクセスをブロックする」というコントロールが失敗していた場合、対象のS3バケット名が表示されます。併せて、修正のためのCLIコマンドや設定変更手順がドキュメントへのリンク付きで提示されます。

集約された検出結果の一覧

「検出結果」画面では、全サービスから集約された結果が統一フォーマットで一覧表示されます。フィルター機能で重要度、検出元サービス、リソースタイプなどによる絞り込みが可能です。

集約された検出結果の一覧

重要な検出結果をSlackへ通知

Security Hub CSPMに集約された検出結果のうち、CRITICALまたはHIGHレベルのものが新規発生または更新されたタイミングでSlackへ通知します。経路は第26回と同様で、EventBridge → SNS → Amazon Q Developer(旧AWS Chatbot)を再利用します。

EventBridgeルールの追加

main.tfに以下を追加します。

# terraform/environments/dev/main.tf

resource "aws_cloudwatch_event_rule" "securityhub_critical_findings" {
  name        = "securityhub-critical-findings"
  description = "Forward Security Hub CRITICAL/HIGH findings to SNS"

  event_pattern = jsonencode({
    source      = ["aws.securityhub"]
    detail-type = ["Security Hub Findings - Imported"]
    detail = {
      findings = {
        Severity = {
          Label = ["CRITICAL", "HIGH"]
        }
        Workflow = {
          Status = ["NEW"]
        }
      }
    }
  })
}

resource "aws_cloudwatch_event_target" "securityhub_to_sns" {
  rule      = aws_cloudwatch_event_rule.securityhub_critical_findings.name
  target_id = "SendToSNS"
  arn       = aws_sns_topic.security_alerts.arn
}

event_patternの各フィルター条件は以下のとおりです。

  • source = aws.securityhub:Security Hub CSPMが発行元のイベントのみ対象
  • detail-type = Security Hub Findings - Imported:新規取り込みの検出結果に限定
  • Severity.Label = ["CRITICAL", "HIGH"]:重要度の高い検出結果のみ通知
  • Workflow.Status = ["NEW"]:未対応状態の検出結果に限定(対応中、解決済みは除外)

第26回で作成済みのSNSトピックポリシー(events.amazonaws.comからのsns:Publishを許可)は、Security Hub CSPM用イベントルールにもそのまま適用されます。

通知のテスト

設定完了後、Security Hub CSPMの「検出結果」画面で、重要度がCRITICALまたはHIGHのものを1件選択します。重要度がMEDIUMやLOWの検出結果は前述のフィルタ条件で除外されるため通知されません。「ワークフローのステータス」を一度NOTIFIEDに変更してからNEWに戻すとEventBridgeルールが再度トリガーされ、Slackチャンネルへ通知が届きます。

Security Hub CSPMからのSlack通知

通知には発生元サービス、検出結果のタイトル、対象リソース、AWSコンソールへのリンクが含まれます。

運用上の注意点

検出結果ワークフローの活用

Security Hub CSPMでは、検出結果ごとに「ワークフローのステータス」を管理できます。

  • NEW(新規):未対応の検出結果
  • NOTIFIED(通知済み):担当者に通知済み、対応中
  • SUPPRESSED(抑制済み):抑制対象、通知不要と判断
  • RESOLVED(解決済み):対応完了

運用初期はすべてがNEWのままになりがちですが、対応状況に応じてステータスを更新することで未対応の重要な検出結果を見落とさずに済みます。前述のEventBridgeルールもNEWに限定しているため、ステータス管理を運用に組み込むことが前提となります。

抑制ルールの設定

検証環境など意図的にベストプラクティスから外している構成では、対応不要な検出結果が大量に発生します。Security Hub CSPMの「自動化ルール」または「抑制」機能で特定のリソースや基準を抑制対象に設定することで、ノイズを削減できます。

マルチアカウント運用

複数のAWSアカウントを運用している場合、Security Hub CSPMはAWS Organizationsと連携してマルチアカウント集約が可能です。管理アカウントを「委任管理者」として指定すれば、各メンバーアカウントの検出結果を一元的に確認できます。本記事では単一アカウント構成で進めましたが、本格運用ではマルチアカウント集約を検討してください。

おわりに

AWS Security Hub CSPMの有効化により、GuardDutyを含む複数のセキュリティサービスの検出結果が一元集約されました。CIS AWS Foundations BenchmarkとAWS FSBPによる自動チェックで、準拠度を継続的に評価できる体制が整っています。CRITICAL/HIGHレベルの重要な検出結果はSlackへ自動通知されるため、運用担当者は対応の優先順位を即座に判断できます。

本連載を通じて、AWSインフラの運用基盤として以下が整いました。

    可視化:Cost Explorerでコストを可視化(第23回)
  • アラート:CloudWatch Alarmsでインフラ状態を監視(第20回第24回)
  • 記録:CloudTrailで操作ログを記録(第25回)
  • 検知:GuardDutyで脅威を自動検知(第26回)
  • 集約と評価:Security Hub CSPMでセキュリティ状態を一元管理(本記事)

これらはコスト、パフォーマンス、セキュリティの三面から運用するための土台です。実際の運用では検出結果への対応プロセスの整備、抑制ルールのチューニング、マルチアカウント集約への拡張など、継続的な改善が必要となります。本連載で構築した基盤を出発点に、組織のセキュリティ運用を磨いていってください。

次回は、CloudTrailやGuardDuty、Security Hub CSPMが出力したログを横断的に検索・分析する手段として、「CloudWatch Logs Insights」を取り上げます。

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored