AWS Organizationsの設定変更に対するCloudwatch Metrics FilterとCloudwatch Alarmの設定手順

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。

この記事では、CloudTrailによって記録されたAWS Organizationsの変更を監視するためのメトリクスフィルターとアラームが存在しない状態について、リスクと対策を解説します。

リスク

AWS Organizationsは、複数のAWSアカウントを一元的に管理するための強力なサービスです。その設定が意図せず変更された場合、組織全体にわたるセキュリティと運用に重大な影響を及ぼす可能性があります。CloudTrailによって記録されたOrganizationsの変更が適切に監視されていないと、次のようなリスクが生まれます。

  • セキュリティ侵害の可能性: Organizationsの設定(例:アカウントの追加/削除、SCP (Service Control Policies) の変更、信頼ポリシーの変更)が悪意を持って操作されると、不正アクセスデータ漏洩に直結する可能性があります。
  • 組織統制の弱体化: Organizationsはアカウント全体の統制を司るため、その設定変更が監視されないと、組織のセキュリティポリシーやコンプライアンス要件からの逸脱を早期に検知できません。
  • 運用上の混乱と複雑化: 意図しないOrganizationsの変更は、アカウント管理やアクセス管理に混乱をもたらし、結果として運用効率を低下させます。
  • 監査証跡の不足: Organizationsの変更履歴が適切に記録・監視されていない場合、セキュリティインシデント発生時の原因究明や影響範囲の特定が困難になります。
  • 復旧の遅延と困難: 問題のあるOrganizationsの変更に迅速に対応できないと、影響を受けたアカウント全体の設定を元に戻す作業が複雑化し、長期化する可能性があります。

対策

AWS Organizationsの変更を監視するために、AWS CloudTrail、Amazon CloudWatch Logs、CloudWatchメトリクスフィルター、およびアラームを連携させることが極めて重要です。これにより、Organizationsに対する予期しない変更を迅速に検知し、適切な対応をとれます。

  • CloudTrailによるOrganizationsログ記録: AWS Organizationsの管理アカウントでCloudTrailを有効化し、「組織の証跡」を作成してOrganizationsに関連するすべてのAPI呼び出しが記録されるように設定します。
  • CloudWatch Logsへのログ転送: CloudTrailで記録されたOrganizationsのログがAmazon CloudWatch Logsに自動的に転送されるように設定します。
  • CloudWatchメトリクスフィルターの設定: CloudWatch Logs Insightsを活用し、Organizationsのロググループから、重要なAPI呼び出し(例:CreateAccount, DeleteAccount, AttachPolicy, DetachPolicy, UpdatePolicy, EnableAWSServiceAccess, DisableAWSServiceAccessなど)を検知するメトリクスフィルターを作成します。
  • CloudWatchアラームの設定: 作成したメトリクスフィルターに基づいて、Organizationsの変更が検知された場合に、セキュリティチームや関係者に迅速に通知するCloudWatchアラームを設定します。通知先にはSNSトピックやChatbotなどを活用できます。
  • 定期的な確認と監査: 設定したアラームが正常に機能していることを定期的に確認し、必要に応じて設定を調整します。また、CloudTrailのログも定期的に確認し、予期しないアクティビティがないか継続的に監査しましょう。

修復方法

AWSコンソールでの修復手順

AWSコンソールを用いて、AWS Organizationsの変更を監視するためのCloudTrail設定、CloudWatch Logsへの転送設定、メトリクスフィルター、およびアラームを設定します。

  1. CloudTrailの設定 (Organizationsの管理アカウントで実行):
    • AWSコンソールにログインし、CloudTrailサービスを開きます。
    • 「証跡」を選択し、「証跡の作成」をクリックします。
    • 証跡名を入力し、「組織の証跡」を「はい」に設定します。
    • S3バケットを選択または作成し、ログの保存先として設定します。
    • *「CloudWatch Logsへのログ配信」を「有効」にし、ロググループとIAMロールを設定します。
    • 「次へ」をクリックし、イベントの選択で「すべてのイベント」を選択し、「証跡の作成」をクリックします。
  2. CloudWatchメトリクスフィルターの作成 (Organizationsの管理アカウントが存在するリージョンで実行):
    • AWSコンソールにログインし、CloudWatchサービスを開きます。
    • 左側のメニューから「ロググループ」を選択し、CloudTrailのロググループ(例:/aws/cloudtrail/組織ID)を選択します。
    • 「メトリクスフィルター」タブを選択し、「メトリクスフィルターの作成」をクリックします。
    • 「フィルターパターン」に、監視したいOrganizations関連のAPI呼び出しを記述します。 例:{ ($.eventSource = organizations.amazonaws.com) && ($.eventName = CreateAccount || $.eventName = DeleteAccount || $.eventName = AttachPolicy || $.eventName = DetachPolicy || $.eventName = UpdatePolicy || $.eventName = EnableAWSServiceAccess || $.eventName = DisableAWSServiceAccess) }
    • 「メトリクス名前空間」、「メトリクス名」、「メトリクス値」を適切に設定し、「フィルターの作成」をクリックします。
  3. CloudWatchアラームの作成 (Organizationsの管理アカウントが存在するリージョンで実行):
    • CloudWatchの左側のメニューから「アラーム」を選択し、「アラームの作成」をクリックします。
    • 先ほど作成したメトリクスフィルターを選択します。
    • アラームの条件(例:メトリクス値が1以上の場合)を設定します。
    • アラームのアクションとして、SNSトピックなどを設定し、通知を受け取れるようにします。
    • アラーム名と説明を入力し、「アラームの作成」をクリックします。

Terraformでの修復手順

TerraformでAWS Organizationsの変更を監視するためのCloudTrail組織の証跡、CloudWatch Logsへの転送設定、メトリクスフィルター、およびアラームを設定するには、aws_cloudtrailaws_cloudwatch_log_metric_filter、および aws_cloudwatch_metric_alarm リソースを使用します。

# CloudTrailの組織の証跡を作成 (管理アカウントで実行)
resource "aws_cloudtrail" "organization_trail" {
  name_prefix    = "organization-trail"
  is_organization_trail = true
  s3_bucket_name = "your-cloudtrail-bucket" # あなたのS3バケット名に置き換えてください
  include_global_service_events = true
  enable_logging = true
  is_enabled     = true

  cloud_watch_logs_group_arn  = aws_cloudwatch_log_group.organization_trail_logs.arn
  cloud_watch_logs_role_arn = aws_iam_role.cloudtrail_cloudwatch_role.arn
}

resource "aws_cloudwatch_log_group" "organization_trail_logs" {
  name = "/aws/cloudtrail/your-organization-id" # 実際の組織IDに置き換えてください
  retention_in_days = 90 # ログの保持期間を設定
}

resource "aws_iam_role" "cloudtrail_cloudwatch_role" {
  name = "CloudTrailCloudWatchRole"
  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = "sts:AssumeRole"
        Principal = {
          Service = "cloudtrail.amazonaws.com"
        }
        Effect = "Allow"
        Sid = ""
      },
    ]
  })
}

resource "aws_iam_role_policy" "cloudtrail_cloudwatch_policy" {
  name = "CloudTrailCloudWatchPolicy"
  role = aws_iam_role.cloudtrail_cloudwatch_role.id
  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = [
          "logs:CreateLogStream",
          "logs:PutLogEvents"
        ]
        Effect = "Allow"
        Resource = "${aws_cloudwatch_log_group.organization_trail_logs.arn}:*"
      }
    ]
  })
}

resource "aws_cloudwatch_log_metric_filter" "organizations_changes" {
  name           = "OrganizationsChangesDetected"
  log_group_name = aws_cloudwatch_log_group.organization_trail_logs.name
  pattern        = <<PATTERN
{ ($.eventSource = organizations.amazonaws.com) && ($.eventName = CreateAccount || $.eventName = DeleteAccount || $.eventName = AttachPolicy || $.eventName = DetachPolicy || $.eventName = UpdatePolicy || $.eventName = EnableAWSServiceAccess || $.eventName = DisableAWSServiceAccess) }
PATTERN

  metric_transformation {
    name      = "OrganizationsChangeCount"
    namespace = "AWS/Organizations"
    value     = "1"
    default_value = 0
  }
}

resource "aws_sns_topic" "organizations_changes_notification" {
  name = "organizations-changes-notification-topic"
}

resource "aws_cloudwatch_metric_alarm" "organizations_changes_alarm" {
  alarm_name          = "OrganizationsChangesAlarm"
  comparison_operator = "GreaterThanOrEqualToThreshold"
  evaluation_periods  = 1
  metric_name         = "OrganizationsChangeCount"
  namespace           = "AWS/Organizations"
  period              = 60 # 監視間隔 (秒)
  statistic           = "Sum"
  threshold           = 1
  alarm_description   = "AWS Organizations の変更が検出されました"
  alarm_actions       = [aws_sns_topic.organizations_changes_notification.arn]
}

上記の例では、CloudTrailの組織の証跡を作成し、CloudWatch Logsへのログ転送を設定しています。その後、Organizations関連のAPI呼び出しを監視するメトリクスフィルターと、変更が検出された場合にSNSトピックに通知するアラームを作成しています。

実際の環境に合わせて、s3_bucket_nameaws_cloudwatch_log_group.organization_trail_logs.name、および aws_sns_topic.organizations_changes_notification の設定を修正してください。

最後に

この記事では、CloudTrailを通じて記録されるAWS Configの設定変更を監視するためのメトリクスフィルターが存在しないことによるリスクと、監視体制を構築するための対策について解説しました。Configの設定変更を早期に検知し、適切に対応することは、AWSアカウントのセキュリティとコンプライアンスを維持するために不可欠です。

この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。

運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。

最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです

この記事をシェアする

クラウドセキュリティ対策実践集一覧へ戻る

貴社の利用状況に合わせた見積もりを作成します。

料金プランを詳しく見る