S3バケットポリシーの変更監視の有効化手順

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

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

Terraformでの修復手順
TerraformでS3バケットポリシーの変更を監視するCloudWatchメトリクスフィルターとアラームを設定します。
# 既存のCloudTrailロググループを参照
data "aws_cloudwatch_log_group" "cloudtrail_log_group" {
name = "CloudTrail/DefaultLogGroup" # あなたのCloudTrailロググループ名に置き換えてください
}
# S3バケットポリシー変更を検出するCloudWatchメトリクスフィルター
resource "aws_cloudwatch_log_metric_filter" "s3_bucket_policy_change_filter" {
name = "S3BucketPolicyChangeFilter"
log_group_name = data.aws_cloudwatch_log_group.cloudtrail_log_group.name
# S3バケットポリシー変更に関連するCloudTrailイベントのパターン
pattern = <<-EOT
{ ($.eventName = "PutBucketPolicy") || ($.eventName = "DeleteBucketPolicy") }
EOT
metric_transformation {
name = "S3BucketPolicyChangeCount"
namespace = "CloudTrailMetrics"
value = "1"
default_value = 0
}
}
# アラート通知用のSNSトピック
resource "aws_sns_topic" "s3_bucket_policy_change_sns_topic" {
name = "s3-bucket-policy-change-alerts"
tags = {
Environment = "Production"
}
}
# SNSトピックの購読者 (メールアドレスなど)
resource "aws_sns_topic_subscription" "s3_bucket_policy_change_email_subscription" {
topic_arn = aws_sns_topic.s3_bucket_policy_change_sns_topic.arn
protocol = "email"
endpoint = "your-security-email@example.com" # 通知を受け取るメールアドレスに置き換えてください
}
# S3バケットポリシー変更を検知するCloudWatchアラーム
resource "aws_cloudwatch_metric_alarm" "s3_bucket_policy_change_alarm" {
alarm_name = "S3BucketPolicyChangeAlarm"
comparison_operator = "GreaterThanThreshold"
evaluation_periods = 1
metric_name = aws_cloudwatch_log_metric_filter.s3_bucket_policy_change_filter.metric_transformation[0].name
namespace = aws_cloudwatch_log_metric_filter.s3_bucket_policy_change_filter.metric_transformation[0].namespace
period = 300 # 5分
statistic = "Sum"
threshold = 0 # 1回でもイベントが発生したらアラーム
alarm_description = "Alerts when an S3 bucket policy is modified or deleted."
alarm_actions = [aws_sns_topic.s3_bucket_policy_change_sns_topic.arn]
ok_actions = [aws_sns_topic.s3_bucket_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.s3_bucket_policy_change_filter
: S3バケットポリシーの変更イベントを検出するメトリクスフィルターを定義します。aws_sns_topic.s3_bucket_policy_change_sns_topic
: アラート通知のためのSNSトピックを定義します。aws_sns_topic_subscription.s3_bucket_policy_change_email_subscription
: SNSトピックの購読者(ここではメールアドレス)を設定します。(この購読は手動で承認が必要です。)aws_cloudwatch_metric_alarm.s3_bucket_policy_change_alarm
: メトリクスフィルターで検出されたイベント数が閾値を超えた場合にアラートを発報するCloudWatchアラームを定義します。
your-security-email@example.com
や CloudTrail/DefaultLogGroup
などのプレースホルダーは、実際の環境に合わせて修正してください。
最後に
この記事では、CloudTrailとCloudWatch Logsを活用してS3バケットポリシーの変更を監視するためのメトリクスフィルターとアラームを設定する方法について解説しました。S3バケットポリシーの変更は、データセキュリティに直接影響を与えるため、これを早期に検知し、対応できる体制を構築することは非常に重要です。 貴社のS3バケットでは、ポリシー変更に対する監視体制が適切に構築されていますか?この機会にぜひ強化を検討してみてください。
この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。
運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。
最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。