IAMポリシー変更に対しての監視設定手順

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。
この記事では、CloudTrail を利用して IAMポリシーの変更を監視するメトリクスフィルター が設定されていない状態について、リスクと対策を解説します。

リスク
AWSの IAM (Identity and Access Management) ポリシーは、AWSリソースへのアクセス権限を定義する非常に重要な設定です。意図しない、または悪意のあるIAMポリシーの変更は、セキュリティ上の重大な穴となり、以下のような深刻なリスクを招く可能性があります。
- 不正なアクセス許可の付与: IAMポリシーが変更されると、本来アクセス権限を持たないユーザーやロールに、機密データや重要なシステムへのアクセスが許可されてしまう可能性があります。これは、最小特権の原則に違反し、セキュリティ侵害の直接的な原因となります。
- 権限昇格攻撃の可能性: 攻撃者がAWSアカウントに侵入した場合、IAMポリシーを変更することで自身の権限を昇格させ、より広範囲のAWSリソースを操作できるようになる可能性があります。これにより、システム全体の乗っ取りやデータ破壊につながる恐れがあります。
- コンプライアンス違反: 多くのセキュリティ規制やコンプライアンス基準(例: PCI DSS, HIPAA, GDPR)では、アクセス制御の変更を厳密に監視し、監査証跡を保持することが義務付けられています。IAMポリシーの変更を監視していない場合、これらの要件を満たせず、法的リスクや罰金に直面する可能性があります。
- 設定の逸脱と管理の複雑化: 意図しないポリシー変更が頻繁に発生すると、本来あるべきセキュリティ設定(ベースライン)からの逸脱が生じ、セキュリティ体制が不明確になります。これにより、IAM環境の管理が複雑になり、脆弱性の特定が困難になります。
- 監査証跡の不十分さ: CloudTrailでIAMポリシーの変更イベントを監視・記録していても、それに対するアラートがなければ、変更が即座に検知されず、インシデント対応が遅れる可能性があります。
対策
IAMポリシーの変更を即座に検知し、対応できる監視体制を構築することは、AWS環境のセキュリティを維持するために不可欠です。
- CloudTrailの有効化: AWSアカウントのCloudTrailが有効になっており、IAMに関する管理イベントを記録していることを確認します。CloudTrailはIAMポリシーの変更を含む、アカウント内のすべてのアクティビティを記録する中心的なサービスです。
- CloudWatch Logsへの連携: CloudTrailのログを CloudWatch Logs に送信するように設定します。これにより、ログデータを一元的に管理し、メトリクスフィルターやアラームを設定できるようになります。
- メトリクスフィルターの設定: CloudWatch Logsグループ内で、IAMポリシーの変更に関連するCloudTrailイベント(
PutUserPolicy
,PutGroupPolicy
,PutRolePolicy
,CreatePolicy
,CreatePolicyVersion
,AttachUserPolicy
,AttachGroupPolicy
,AttachRolePolicy
など)を検出するメトリクスフィルターを作成します。 - CloudWatchアラームの設定: 作成したメトリクスフィルターに基づいて CloudWatchアラーム を設定します。これにより、IAMポリシーの変更イベントが検出された際に、Amazon SNSなどを通じて関係者に即座に通知が送信されるようになります。
- 通知の自動化: SNSトピックを介して、セキュリティチームや運用チームにメール、PagerDuty、Slackなど、適切なチャネルでアラートが届くように設定します。
- 定期的なレビューと対応計画: IAMポリシーの変更アラートが発報された際の対応手順(変更の確認、承認プロセスのチェック、不正な変更のロールバック、根本原因分析など)を明確に定義し、定期的にレビューします。
修復方法
AWSコンソールでの修復手順
AWSコンソールを使用して、IAMポリシーの変更を監視するCloudWatchメトリクスフィルターとアラームを設定します。
前提: CloudTrailが有効で、ログがCloudWatch Logsに送信されていることを確認してください。
- CloudWatchサービスへ移動: AWSコンソールにログインし、CloudWatchサービスを開きます。
- ロググループの選択: 左側のナビゲーションペインで「ロググループ」を選択します。 CloudTrailのログが保存されているロググループ(通常は
CloudTrail/DefaultLogGroup
のような名前)を選択します。 - メトリクスフィルターの作成: ロググループの詳細ページで「メトリクスフィルター」タブを選択し、「メトリクスフィルターの作成」をクリックします。
- フィルターパターンの定義: 「フィルターパターン」に、以下のIAMポリシー変更に関連するイベントを検出するパターンを入力します。
「次へ」をクリックします。
`{ ($.eventName = "PutUserPolicy") || ($.eventName = "PutGroupPolicy") || ($.eventName = "PutRolePolicy") || ($.eventName = "DeleteUserPolicy") || ($.eventName = "DeleteGroupPolicy") || ($.eventName = "DeleteRolePolicy") || ($.eventName = "CreatePolicy") || ($.eventName = "CreatePolicyVersion") || ($.eventName = "DeletePolicy") || ($.eventName = "DeletePolicyVersion") || ($.eventName = "AttachUserPolicy") || ($.eventName = "AttachGroupPolicy") || ($.eventName = "AttachRolePolicy") || ($.eventName = "DetachUserPolicy") || ($.eventName = "DetachGroupPolicy") || ($.eventName = "DetachRolePolicy") }`
- メトリクス詳細の指定:
- フィルター名: 例:
IAMPolicyChangeFilter
- メトリクス名前空間: 例:
CloudTrailMetrics
- メトリクス名: 例:
IAMPolicyChangeCount
- メトリクス値:
1
「次へ」をクリックします。
- フィルター名: 例:
- メトリクスの作成: 設定を確認し、「メトリクスフィルターの作成」をクリックします。
- アラームの作成: 作成したメトリクスフィルターを選択し、「アラームの作成」をクリックします。
- アラームの設定:
- メトリクス: 自動的に設定されます。
- 統計: 「合計」を選択します。
- 期間: 例: 「5分」を選択します。
- しきい値: 「次とより大きい」を選択し、
0
を入力します。(1回でもイベントが発生したらアラーム) - 「次へ」をクリックします。
- 通知の設定:
- 「通知の送信先」で、既存のSNSトピックを選択するか、「新しいトピックの作成」を選択して、メールアドレスなどを指定します。
- 「次へ」をクリックします。
- アラーム名の追加:
- アラーム名: 例:
IAMPolicyChangeAlarm
- アラーム説明: 例:
Detects any changes to IAM policies.
「次へ」をクリックします。
- アラーム名: 例:
- アラームの作成: 設定を確認し、「アラームの作成」をクリックします。

Terraformでの修復手順
TerraformでIAMポリシーの変更を監視するCloudWatchメトリクスフィルターとアラームを設定します。
# 既存のCloudTrailロググループを参照
data "aws_cloudwatch_log_group" "cloudtrail_log_group" {
name = "CloudTrail/DefaultLogGroup" # あなたのCloudTrailロググループ名に置き換えてください
}
# IAMポリシー変更を検出するCloudWatchメトリクスフィルター
resource "aws_cloudwatch_log_metric_filter" "iam_policy_change_filter" {
name = "IAMPolicyChangeFilter"
log_group_name = data.aws_cloudwatch_log_group.cloudtrail_log_group.name
# IAMポリシー変更に関連するCloudTrailイベントのパターン
# 公式ドキュメント: <https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudwatch-alarms-for-iam-policy-changes.html>
pattern = <<-EOT
{ ($.eventName = "PutUserPolicy") || ($.eventName = "PutGroupPolicy") || ($.eventName = "PutRolePolicy") || ($.eventName = "DeleteUserPolicy") || ($.eventName = "DeleteGroupPolicy") || ($.eventName = "DeleteRolePolicy") || ($.eventName = "CreatePolicy") || ($.eventName = "CreatePolicyVersion") || ($.eventName = "DeletePolicy") || ($.eventName = "DeletePolicyVersion") || ($.eventName = "AttachUserPolicy") || ($.eventName = "AttachGroupPolicy") || ($.eventName = "AttachRolePolicy") || ($.eventName = "DetachUserPolicy") || ($.eventName = "DetachGroupPolicy") || ($.eventName = "DetachRolePolicy") }
EOT
metric_transformation {
name = "IAMPolicyChangeCount"
namespace = "CloudTrailMetrics"
value = "1"
default_value = 0
}
}
# アラート通知用のSNSトピック
resource "aws_sns_topic" "iam_policy_change_sns_topic" {
name = "iam-policy-change-alerts"
tags = {
Environment = "Production"
}
}
# SNSトピックの購読者 (メールアドレスなど)
resource "aws_sns_topic_subscription" "iam_policy_change_email_subscription" {
topic_arn = aws_sns_topic.iam_policy_change_sns_topic.arn
protocol = "email"
endpoint = "your-security-email@example.com" # 通知を受け取るメールアドレスに置き換えてください
}
# IAMポリシー変更を検知するCloudWatchアラーム
resource "aws_cloudwatch_metric_alarm" "iam_policy_change_alarm" {
alarm_name = "IAMPolicyChangeAlarm"
comparison_operator = "GreaterThanThreshold"
evaluation_periods = 1
metric_name = aws_cloudwatch_log_metric_filter.iam_policy_change_filter.metric_transformation[0].name
namespace = aws_cloudwatch_log_metric_filter.iam_policy_change_filter.metric_transformation[0].namespace
period = 300 # 5分
statistic = "Sum"
threshold = 0 # 1回でもイベントが発生したらアラーム
alarm_description = "Alerts when any IAM policy (inline or managed) is created, updated, deleted, or attached/detached."
alarm_actions = [aws_sns_topic.iam_policy_change_sns_topic.arn]
ok_actions = [aws_sns_topic.iam_policy_change_sns_topic.arn]
dimensions = {
LogGroupName = data.aws_cloudwatch_log_group.cloudtrail_log_group.name
}
}
上記のTerraformコードでは、以下のリソースを定義しています。
data "aws_cloudwatch_log_group" "cloudtrail_log_group"
: 既存のCloudTrailロググループを参照します。aws_cloudwatch_log_metric_filter.iam_policy_change_filter
: IAMポリシーの変更に関連するイベントを検出するメトリクスフィルターを定義します。aws_sns_topic.iam_policy_change_sns_topic
: アラート通知のためのSNSトピックを定義します。aws_sns_topic_subscription.iam_policy_change_email_subscription
: SNSトピックの購読者(ここではメールアドレス)を設定します。(この購読は手動で承認が必要です。)aws_cloudwatch_metric_alarm.iam_policy_change_alarm
: メトリクスフィルターで検出されたイベント数が閾値を超えた場合にアラートを発報するCloudWatchアラームを定義します。
your-security-email@example.com
や CloudTrail/DefaultLogGroup
などのプレースホルダーは、実際の環境に合わせて修正してください。
最後に
この記事では、CloudTrailとCloudWatch Logsを活用してIAMポリシーの変更を監視するためのメトリクスフィルターとアラームを設定する方法について解説しました。意図しないIAMポリシーの変更は、AWS環境における最も重大なセキュリティリスクの一つです。この監視体制を構築することで、異常な変更を即座に検知し、迅速な対応を行うことが可能になります。
貴社のAWS環境では、IAMポリシーの変更に対してどのような監視体制を構築していますか?ぜひ、この機会に強化を検討してみてください。
この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。
運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。
最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。