権限エラーを監視するCloudWatch設定の見直し

権限のないAPI呼び出しを監視するCloudWatchフィルター、メトリクスアラーム、通知経路を確認してください。

説明

CloudTrailの権限エラーをCloudWatch Logsで集計し、アラームで通知すると、繰り返される失敗や不審な呼び出しの調査に役立ちます。フィルターがない場合やアラームが別のメトリクスを参照している場合は、必要な警告を受け取れないことがあります。UnauthorizedOperationやAccessDeniedはアプリケーションの権限設定の誤りでも発生するため、エラーだけで侵害があったとは判断できません。

想定される影響

  • 権限のない呼び出しの繰り返しや、アプリケーションの権限設定の問題に気付くのが遅れる可能性があります。
  • アラームが正しく評価されても、通知先やサブスクリプションの設定が誤っていると担当者に警告が届かない可能性があります。

対処方法

  • 対象のアカウントとリージョンで必要なCloudTrailイベントがロググループに届くことを確認してください。*UnauthorizedOperationまたはAccessDenied*を集計するフィルターを設定し、実際のログ形式でテストしてください。
  • アラームのメトリクス名、名前空間、必要なディメンションをフィルターのmetric_transformationに合わせてください。評価期間、統計、しきい値、欠落データの扱いも運用要件に合わせて設定してください。
  • alarm_actionsには実際の通知先ARNを指定し、アラームアクション、SNSの権限、サブスクリプションの状態を確認してください。新しいテストイベントがメトリクスに集計され、評価条件を満たすとアラームと通知が動作することを確かめてください。メトリクスフィルターは作成前のログをさかのぼって集計しません。

例

以下はフィルターとアラームの接続を示す部分的な例です。参照先のロググループとSNSトピックを定義し、CloudTrailのログ配信を設定してから使用してください。

変更前

hcl
resource "aws_cloudwatch_metric_alarm" "cis_unauthorized_api_calls_cw_alarm" {
  alarm_name                = "CIS-3.1-UnauthorizedAPICalls"
  comparison_operator       = "GreaterThanOrEqualToThreshold"
  evaluation_periods        = "1"
  metric_name               = "XXXX NOT YOUR FILTER XXXX"
  namespace                 = "CIS_Metric_Alarm_Namespace"
  period                    = "300"
  statistic                 = "Sum"
  threshold                 = "1"
  alarm_description         = "Monitoring unauthorized API calls will help reveal application errors and may reduce time to detect malicious activity."
  alarm_actions             = [aws_sns_topic.CIS_Alerts_SNS_Topic.arn]
  insufficient_data_actions = []
}

resource "aws_cloudwatch_log_metric_filter" "cis_unauthorized_api_calls_metric_filter" {
  name           = "CIS-UnauthorizedAPICalls"
  pattern        = "{ ($.errorCode = \"*UnauthorizedOperation\") || ($.errorCode = \"AccessDenied*\") }"
  log_group_name = aws_cloudwatch_log_group.CIS_CloudWatch_LogsGroup.name

  metric_transformation {
    name      = "CIS-UnauthorizedAPICalls"
    namespace = "CIS_Metric_Alarm_Namespace"
    value     = "1"
  }
}

変更後

hcl
resource "aws_cloudwatch_metric_alarm" "cis_unauthorized_api_calls_cw_alarm" {
  alarm_name                = "CIS-3.1-UnauthorizedAPICalls"
  comparison_operator       = "GreaterThanOrEqualToThreshold"
  evaluation_periods        = "1"
  metric_name               = "CIS-UnauthorizedAPICalls"
  namespace                 = "CIS_Metric_Alarm_Namespace"
  period                    = "300"
  statistic                 = "Sum"
  threshold                 = "1"
  alarm_description         = "Monitoring unauthorized API calls will help reveal application errors and may reduce time to detect malicious activity."
  alarm_actions             = [aws_sns_topic.CIS_Alerts_SNS_Topic.arn]
  insufficient_data_actions = []
}

resource "aws_cloudwatch_log_metric_filter" "cis_unauthorized_api_calls_metric_filter" {
  name           = "CIS-UnauthorizedAPICalls"
  pattern        = "{ ($.errorCode = \"*UnauthorizedOperation\") || ($.errorCode = \"AccessDenied*\") }"
  log_group_name = aws_cloudwatch_log_group.CIS_CloudWatch_LogsGroup.name

  metric_transformation {
    name      = "CIS-UnauthorizedAPICalls"
    namespace = "CIS_Metric_Alarm_Namespace"
    value     = "1"
  }
}

説明:

  • 変更前: metric_nameがフィルターの発行するメトリクス名と異なるため、アラームはそのエラーメトリクスを評価しません。
  • 変更後: メトリクス名と名前空間をフィルターの出力に合わせ、SNSトピックの実際のARNを参照しています。デプロイ後にアラームの評価と通知の受信まで確認してください。

参考資料