こんにちは。
アプリケーションサービス部、DevOps担当の兼安です。
今回は、AWS Config自体の設定変更を監視する方法についてお話しします。
本記事のターゲット
- AWS上のシステムに対して、セキュリティ担保の第一歩を踏み出したい方
セキュリティの担保と維持
システムのセキュリティは適切な設定をすることで担保できますが、担保した状態を維持するのは簡単ではありません。
この理由には、システム開発中とリリース後では、設定への関心度が大きく異なるなどがあります。
何らかの方法で、ここを省力化する必要があり、AWS Configは、適切な設定をどうやって維持するかに力を発揮します。
AWS Configとは
同サービスの基本的な機能について簡単に説明します。
AWS Configは、AWSリソースの設定を評価、監査、そして追跡するためのサービスです。
AWSリソースのインベントリ管理やコンプライアンス評価の機能を提供しています。
AWSリソースのインベントリ管理
インベントリとは、英語で在庫や目録を意味します。
AWSアカウント上のAWSリソースを一覧表示し、リソースの設定変更履歴を追跡することができます。

コンプライアンス評価
AWS Configは、マネージドまたはカスタムのルールを用いて、設定変更を評価し、リソースがコンプライアンスに準拠しているかどうかを確認します。
また、AWS Configの設定変更を検知した場合に、通知や自動修復を行うことができます。
例えば、セキュリティグループでSSHのポート(22)が開放されるのを防ぎたければ、ルール・修復ともにマネージドのルールが用意されています。
これらを利用して、SSHのポートが開放されているかを監視し、開放されていた場合は自動的に閉じる(=当該設定行の削除)ことができます。


レコーダーの停止
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の設定変更に関するイベントを確認できます。
StopConfigurationRecorder
とStartConfigurationRecorder
がレコーダーの設定変更に関するイベントです。

EventBridgeのルールのイベントパターン
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自体の設定変更を検知するルールを作成します。
ルールのイベントパターンで、検知対象を特定する条件を指定します。

{ "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
に格納されていると捉えると多少わかりやすいと思います。

入力パス
{ "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日自動化するサービスを提供しています。
兼安 聡(執筆記事の一覧)
アプリケーションサービス部 DS3課所属
2025 Japan AWS Top Engineers (AI/ML Data Engineer)
2025 Japan AWS All Certifications Engineers
2025 AWS Community Builders
Certified ScrumMaster
PMP
広島在住です。今日も明日も修行中です。