CloudTrailで利用されるS3バケットが暗号化の設定手順

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

この記事では、Security Hubで検出された「[CloudTrail.2] CloudTrail は保管時の暗号化を有効にする必要があります」というセキュリティ課題の修正方法について解説します。

ポリシーの説明

[CloudTrail.2] CloudTrail は保管時の暗号化を有効にする必要があります。

CloudTrail の Security Hub コントロール – AWS Security Hub

このコントロールは、CloudTrail がサーバー側の暗号化 (SSE) AWS KMS key 暗号化を使用するよう設定されているかどうかをチェックします。KmsKeyId が定義されていない場合、コントロールは失敗します。

AWS CloudTrailは、AWS環境におけるAPIコールやイベントを記録する重要なサービスです。これらのログファイルには、セキュリティ関連の情報やリソースの変更履歴が含まれるため、不正アクセスから保護する必要があります。CloudTrailログを保存するS3バケットで保管時の暗号化を有効にすることで、保存されたログデータの機密性と整合性を確保できます。

修復方法

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

  1. CloudTrail > 証跡に移動する
  2. 証跡の作成を選択し、作成する画面で「ログファイルのSSE-KMS 暗号化」の有効にチェックする
  1. 設定後、証跡を作成する

Terraformでの修復手順

CloudTrailのログ暗号化を有効化するTerraformコードを作成します。

# KMSキーの作成
resource "aws_kms_key" "cloudtrail" {
  description = "KMS key for CloudTrail log encryption"

  # キーの削除待機期間
  deletion_window_in_days = 7

  # キーローテーションを有効化
  enable_key_rotation = true

  # キーポリシー
  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Sid = "Enable IAM User Permissions"
        Effect = "Allow"
        Principal = {
          AWS = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:root"
        }
        Action = "kms:*"
        Resource = "*"
      },
      {
        Sid = "Allow CloudTrail to encrypt logs"
        Effect = "Allow"
        Principal = {
          Service = "cloudtrail.amazonaws.com"
        }
        Action = [
          "kms:GenerateDataKey*",
          "kms:Decrypt"
        ]
        Resource = "*"
      }
    ]
  })
}

# KMSキーのエイリアス
resource "aws_kms_alias" "cloudtrail" {
  name          = "alias/cloudtrail-encryption"
  target_key_id = aws_kms_key.cloudtrail.key_id
}

# S3バケットの作成
resource "aws_s3_bucket" "cloudtrail" {
  bucket = "my-cloudtrail-logs-${data.aws_caller_identity.current.account_id}"
}

# S3バケットの暗号化設定
resource "aws_s3_bucket_server_side_encryption_configuration" "cloudtrail" {
  bucket = aws_s3_bucket.cloudtrail.id

  rule {
    apply_server_side_encryption_by_default {
      kms_master_key_id = aws_kms_key.cloudtrail.arn
      sse_algorithm     = "aws:kms"
    }
  }
}

# CloudTrailの設定
resource "aws_cloudtrail" "main" {
  name                          = "cloudtrail-with-encryption"
  s3_bucket_name               = aws_s3_bucket.cloudtrail.id
  include_global_service_events = true
  is_multi_region_trail        = true
  enable_logging               = true

  # KMS暗号化の設定
  kms_key_id                  = aws_kms_key.cloudtrail.arn

  # CloudTrailのログファイル検証を有効化
  enable_log_file_validation  = true

  # イベントセレクター設定
  event_selector {
    read_write_type           = "All"
    include_management_events = true
  }

  depends_on = [
    aws_s3_bucket.cloudtrail,
    aws_s3_bucket_policy.cloudtrail
  ]
}

# S3バケットポリシー
resource "aws_s3_bucket_policy" "cloudtrail" {
  bucket = aws_s3_bucket.cloudtrail.id
  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Sid    = "AWSCloudTrailAclCheck"
        Effect = "Allow"
        Principal = {
          Service = "cloudtrail.amazonaws.com"
        }
        Action   = "s3:GetBucketAcl"
        Resource = aws_s3_bucket.cloudtrail.arn
      },
      {
        Sid    = "AWSCloudTrailWrite"
        Effect = "Allow"
        Principal = {
          Service = "cloudtrail.amazonaws.com"
        }
        Action   = "s3:PutObject"
        Resource = "${aws_s3_bucket.cloudtrail.arn}/*"
        Condition = {
          StringEquals = {
            "s3:x-amz-acl" = "bucket-owner-full-control"
          }
        }
      }
    ]
  })
}

# 現在のAWSアカウントID取得用のデータソース
data "aws_caller_identity" "current" {}

修正すべき主なポイントと手順を説明します:

  1. KMS暗号化の有効化:
    • 上記コードではaws_kms_keyリソースを作成し、CloudTrail専用のKMSキーを設定
    • CloudTrailリソースのkms_key_idパラメータでKMSキーを指定
  2. S3バケットの暗号化設定:
    • aws_s3_bucket_server_side_encryption_configurationリソースでS3バケットの暗号化を設定
    • KMSキーを使用したサーバーサイド暗号化(SSE-KMS)を有効化
  3. セキュリティ強化のための追加設定:
    • CloudTrailのログファイル検証を有効化(enable_log_file_validation = true
    • マルチリージョン対応(is_multi_region_trail = true
    • グローバルサービスイベントの含有(include_global_service_events = true

これらの設定を適用することで、CloudTrailのログは適切に暗号化され、セキュアに保存されます。必要に応じて、上記のオプション設定も追加することをお勧めします。

設定を変更する際の注意点:

  1. バケット名は一意である必要があります
  2. リージョン指定が必要な場合は、プロバイダーブロックを追加
  3. 既存のリソースがある場合は、importコマンドを使用して既存リソースを管理下に置く

これらの修正を適用することで、セキュリティベストプラクティスに準拠したCloudTrail設定が実現できます。

最後に

今回は、CloudTrailのログファイルを保管時に暗号化する方法についてご紹介しました。CloudTrailログは、セキュリティインシデントの調査や監査において重要な情報源となるため、適切な暗号化によって保護することが不可欠です。AWS KMS を使用して暗号化を有効にすることで、ログデータのセキュリティを強化し、コンプライアンス要件を満たすことができます。

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

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

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

この記事をシェアする

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

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

料金プランを詳しく見る