AWS Config自体の設定変更をAWS CloudTrail + Amazon EventBridgeで検知してみよう

記事タイトルとURLをコピーする

こんにちは。
アプリケーションサービス部、DevOps担当の兼安です。
今回は、AWS Config自体の設定変更を監視する方法についてお話しします。

本記事のターゲット

  • AWS上のシステムに対して、セキュリティ担保の第一歩を踏み出したい方

セキュリティの担保と維持

システムのセキュリティは適切な設定をすることで担保できますが、担保した状態を維持するのは簡単ではありません。
この理由には、システム開発中とリリース後では、設定への関心度が大きく異なるなどがあります。
何らかの方法で、ここを省力化する必要があり、AWS Configは、適切な設定をどうやって維持するかに力を発揮します。

AWS Configとは

同サービスの基本的な機能について簡単に説明します。
AWS Configは、AWSリソースの設定を評価、監査、そして追跡するためのサービスです。
AWSリソースのインベントリ管理やコンプライアンス評価の機能を提供しています。

AWSリソースのインベントリ管理

インベントリとは、英語で在庫や目録を意味します。
AWSアカウント上のAWSリソースを一覧表示し、リソースの設定変更履歴を追跡することができます。

リソースの変更履歴を追うことができます

コンプライアンス評価

AWS Configは、マネージドまたはカスタムのルールを用いて、設定変更を評価し、リソースがコンプライアンスに準拠しているかどうかを確認します。
また、AWS Configの設定変更を検知した場合に、通知や自動修復を行うことができます。

例えば、セキュリティグループでSSHのポート(22)が開放されるのを防ぎたければ、ルール・修復ともにマネージドのルールが用意されています。
これらを利用して、SSHのポートが開放されているかを監視し、開放されていた場合は自動的に閉じる(=当該設定行の削除)ことができます。

SSHのポート(22)が開いているかをチェックするマネージドルール

パブリックアクセスを除去する修復アクション

レコーダーの停止

AWS Configは設定監視ができますが、この機能は設定変更を記録する「レコーダー」が起動していないと機能しません。

AWS Configのレコーダーは停止ができる

AWS Config自体の設定変更の検知と通知

AWS Configが力を発揮するには、AWS Config自体が適切な設定されていることを維持し、レコーダーの停止のような設定変更を防止する必要があります。
これを実現するには、AWS CloudTrail+Amazon EventBridgeで、AWS Config自体の設定変更の検知と通知を実装する方法があります。

AWS CloudTrailのイベントレコード

AWS Config自体の設定変更はAWS CloudTrailに記録されます。
CloudTrailの画面で、イベントソースにconfig.amazonaws.comを指定すると、AWS Configの設定変更に関するイベントを確認できます。
StopConfigurationRecorderStartConfigurationRecorderがレコーダーの設定変更に関するイベントです。

CloudTrailでConfigのイベントを探せる

EventBridgeのルールのイベントパターン

CloudTrailのイベントレコードは、開くとJSONビューで内容を見ることができます。

CloudTrailのイベントレコードのJSON

{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "Root",
        "principalId": "************",
        "arn": "arn:aws:iam::************:root",
        "accountId": "************",
        "accessKeyId": "********************",
        "sessionContext": {
            "sessionIssuer": {},
            "webIdFederationData": {},
            "attributes": {
                "creationDate": "2025-04-26T15:31:19Z",
                "mfaAuthenticated": "true"
            }
        }
    },
    "eventTime": "2025-04-27T02:25:13Z",
    "eventSource": "config.amazonaws.com",
    "eventName": "StopConfigurationRecorder",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "************",
    "userAgent": "AWS Internal",
    "requestParameters": {
        "configurationRecorderName": "default"
    },
    "responseElements": null,
    "requestID": "********************",
    "eventID": "********************",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "************",
    "eventCategory": "Management",
    "sessionCredentialFromConsole": "true"
}

ポイントは、以下の属性です。

  • eventSource: config.amazonaws.com
  • eventName
  • readOnly: false

この内容を元に、EventBridgeでAWS Config自体の設定変更を検知するルールを作成します。
ルールのイベントパターンで、検知対象を特定する条件を指定します。

EventBridgeのルールのイベントパターン

{
  "detail-type": ["AWS API Call via CloudTrail"],
  "source": ["aws.config"],
  "detail": {
    "eventSource": ["config.amazonaws.com"],
    "eventName": [{
      "anything-but": ["PutEvaluations"]
    }],
    "readOnly": [false]
  }
}

"detail-type": ["AWS API Call via CloudTrail"],で、CloudTrailからイベントを抽出することを指定します。
"source": ["aws.config"]"eventSource": ["config.amazonaws.com"]で、発生元がAWS Configであるイベントだけに絞ります。
“readOnly”: [false]で更新系イベントだけに絞ります。
設定変更は、書き込みが発生するため、更新系イベントに類するからです。
eventNameは、anything-butを指定することで、特定のイベントを除外します。
除外するのは、コンプライアンス評価の記録イベントPutEvaluationsです。

コンプライアンス評価は、評価結果の書き込みが発生する更新系イベントに分類される上、日々大量に発生する可能性のあるイベントで、ノイズになるからです。

EventBridgeのルールのターゲット

EventBridgeのルールのターゲットには、SNSトピックやLambda関数を指定して通知することができます。
メールなどで通知を受け取る場合は、メッセージを整形した方が便利です。

メッセージの整形はEventBridgeのルールにある、ターゲットの入力トランスフォーマーで実現できます。
入力パスで、イベントの中から必要な情報を抽出し、変数に格納、入力テンプレートで変数を埋め込みます。
このとき、イベントの情報は、CloudTrailのイベントレコードの内容が丸ごと$.detailに格納されていると捉えると多少わかりやすいと思います。

イベントレコードのJSONと入力トランスフォーマー

入力パス

{
  "account": "$.account",
  "eventName": "$.detail.eventName",
  "eventTime": "$.detail.eventTime",
  "region": "$.region",
  "sourceIPAddress": "$.detail.sourceIPAddress"
}

入力テンプレート

"AWS Config configuration has been changed."

"Event Name: <eventName>"
"Event Time: <eventTime>"
"Account Number: <account>"
"Region: <region>"
"Source IP Address: <sourceIPAddress>"

実際に届くメールは、以下のようになります。

通知メールのサンプル

まとめ

AWS Config自体の設定変更はAWS CloudTrail+Amazon EventBridgeで検知・通知ができます。
設定変更の対策は、AWS OrganizationsでSCPを組むのがより望ましいと思いますが、Organizationsの導入はそれはそれで大変なのでまずはできることから始めるのがよいと思います。

Appendix

本記事で紹介した、AWS Config自体の設定変更を検知するルールを作るCloudFormationテンプレートを用意しました。
参考にしてください。

Description: AWS Config item change detection

Parameters:
  Email:
    Description: Notification email address for the SNS topic
    Type: String

Resources:
  ConfigItemChangeTopic:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: example-sns-security-alert-topic
      Tags:
        - Key: Name
          Value: example-sns-security-alert-topic
          
  ConfigItemChangeTopicPolicy:
    Type: AWS::SNS::TopicPolicy
    Properties:
      Topics:
        - !Ref ConfigItemChangeTopic
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Sid: __default_statement_ID
            Effect: Allow
            Principal:
              AWS: '*'
            Action:
              - SNS:GetTopicAttributes
              - SNS:SetTopicAttributes
              - SNS:AddPermission
              - SNS:RemovePermission
              - SNS:DeleteTopic
              - SNS:Subscribe
              - SNS:ListSubscriptionsByTopic
              - SNS:Publish
            Resource: !Ref ConfigItemChangeTopic
            Condition:
              StringEquals:
                AWS:SourceArn: !Sub ${AWS::AccountId}
          - Sid: AllowPublishFromEventBridge
            Effect: Allow
            Principal:
              Service: events.amazonaws.com
            Action: sns:Publish
            Resource: !Ref ConfigItemChangeTopic

  ConfigItemChangeEmailSubscription:
    Type: AWS::SNS::Subscription
    Properties:
      TopicArn: !Ref ConfigItemChangeTopic
      Protocol: email
      Endpoint: !Ref Email

  ConfigItemChangeRule:
    Type: AWS::Events::Rule
    Properties:
      Name: example-config-item-change-alert-rule
      EventPattern:
        source:
          - aws.config
        detail-type:
          - AWS API Call via CloudTrail
        detail:
          eventSource:
            - config.amazonaws.com
          eventName:
            - anything-but:
                - PutEvaluations
          readOnly:
            - false
      State: ENABLED
      EventBusName: default
      Targets:
        - Id: example-config-item-change-alert
          Arn: !Ref ConfigItemChangeTopic
          InputTransformer:
            InputPathsMap:
              account: $.account
              eventName: $.detail.eventName
              region: $.region
              sourceIPAddress: $.detail.sourceIPAddress
              eventTime: $.detail.eventTime
            InputTemplate: |-
              "AWS Config configuration has been changed."
              "Event Name: <eventName>"
              "Event Time: <eventTime>"
              "Account Number: <account>"
              "Region: <region>"
              "Source IP Address: <sourceIPAddress>"

[宣伝]サバソック

サーバーワークスはセキュリティ運用を24時間365日自動化するサービスを提供しています。

www.serverworks.co.jp

兼安 聡(執筆記事の一覧)

アプリケーションサービス部 DS3課所属
2025 Japan AWS Top Engineers (AI/ML Data Engineer)
2025 Japan AWS All Certifications Engineers
2025 AWS Community Builders
Certified ScrumMaster
PMP
広島在住です。今日も明日も修行中です。