【Organizations 環境】CloudTrail の証跡を、安全にログ集約用 AWS アカウントの S3 に配信しアクセスする方法

記事タイトルとURLをコピーする

こんにちは😸
カスタマーサクセス部の山本です。

先日、みなかみ100(100kmトレイルランニング大会)に2年連続で参加し、無事完走することができました。
人間の適応力って本当に素晴らしいものですね。去年は相当な苦戦を強いられましたが、今年は驚くほどスムーズに走り切ることができ、筋肉痛すらありませんでした。

ただし、自然の中には常に新たな課題が潜んでいるもので、今回はブヨに刺されてしまい、レース中に足が腫れ上がってしまいました。
後半は痛みと闘い、実際に泣きながら走る・歩くレースとなりました。
皆様も自然の中での活動時には、虫除け対策をお忘れなきよう。

AWS CloudTrail のセキュアな運用方法

さて、本題に入らせていただきます。今回は、複数のAWSアカウントを運用している組織向けに、セキュアなログ管理の方法についてご紹介します。

注意: 本記事では説明を簡易にするため管理用のAWSアカウントで証跡を作成していますが、実際の運用では、セキュリティのベストプラクティスとして、CloudTrail証跡の作成・管理は委任された別のAWSアカウントで行うことを推奨します。これにより、証跡の作成・管理権限を適切に分離し、よりセキュアな運用が可能となります。

ログ集約のベストプラクティス

多くの組織では、セキュリティとコンプライアンスの要件を満たすため、以下のような構成を採用しています:

  1. 専用のログ集約用AWSアカウントを用意
  2. 各ワークロードアカウントのCloudTrailログを一元管理
  3. 転送時および保管時の暗号化による安全性確保

セキュアな構成のポイント

  • 転送時の暗号化: ワークロードアカウントから別アカウントのS3バケットへのログ転送時には、適切な暗号化が必須
  • 保管時の暗号化: KMSによる暗号化で、保管時のセキュリティも確保
  • アクセス制御: 適切なIAMポリシーとバケットポリシーの設定による、セキュアなアクセス管理

このような構成により、ログデータの機密性を保ちながら、効率的な監査とコンプライアンス対応が可能となります。

1. ログ保管用 S3 バケットの作成 (ログ集約用 AWS アカウントで実施)

1.1 S3 バケットの作成

デフォルトの設定でバケットを 1 つ作成します。
重要: S3バケットは CloudTrail の証跡と同じリージョンに作成する必要があります。リージョンが異なる場合、CloudTrail が KMS キーを使用して暗号化したログにアクセスできなくなります。

作成しました。

サーバー側の暗号化はデフォルトでは、SSE-S3 になっています。 参考:暗号化によるデータの保護

1.2 バケットポリシーの設定

以下のポリシーを設定します。設定前に下記の値を環境に合わせて変更してください。

  • amzn-s3-demo-bucket → 作成したバケット名
  • managementAccountID → 管理用 AWS アカウントの ID
  • region → CloudTrail 証跡を作成するリージョン
  • trailName → 作成予定の証跡名
  • organizationID → AWS Organizations ID
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowSSLRequestsOnly",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket",
                "arn:aws:s3:::amzn-s3-demo-bucket/*"
            ],
            "Condition": {
                "Bool": {
                    "aws:SecureTransport": "false"
                }
            }
        },
        {
            "Sid": "AWSCloudTrailAclCheck20150319",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "cloudtrail.amazonaws.com"
                ]
            },
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket",
            "Condition": {
                "StringEquals": {
                    "aws:SourceArn": "arn:aws:cloudtrail:region:managementAccountID:trail/trailName"
                }
            }
        },
        {
            "Sid": "AWSCloudTrailWrite20150319",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "cloudtrail.amazonaws.com"
                ]
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/AWSLogs/managementAccountID/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control",
                    "aws:SourceArn": "arn:aws:cloudtrail:region:managementAccountID:trail/trailName"
                }
            }
        },
        {
            "Sid": "AWSCloudTrailOrganizationWrite20150319",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "cloudtrail.amazonaws.com"
                ]
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/AWSLogs/organizationID/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control",
                    "aws:SourceArn": "arn:aws:cloudtrail:region:managementAccountID:trail/trailName"
                }
            }
        }
    ]
}

バケットポリシーの概要:

  1. すべての通信でSSL/TLSの使用を強制(転送時の暗号化
  2. CloudTrailサービスのみにアクセスを制限
  3. 特定のCloudTrail証跡からのアクセスのみを許可
  4. バケット所有者が常に完全なコントロールを保持

  5. 参考

2. CloudTrail 証跡の作成 (Organizations の管理用 AWS アカウントで実施)

2.1 基本設定

  • 「組織内のすべてのアカウントについて有効化」にチェック
  • 「既存の S3 バケットを使用する」を選択し、手順1で作成したバケット名を指定

2.2 暗号化設定

  • 管理用 AWS アカウント上に新しい暗号化キー(KMS)を作成 (保管時の暗号化)

2.3 ログ設定

  • 要件に応じて取得するイベントを選択

2.4 証跡の作成

作成時に警告が出ますが、BucketPolicy を更新できないというエラーなので無視します。(バケットポリシーは設定済み)

3. 確認 (ログ集約用 AWS アカウントで実施)

3.1 ログの保存場所

S3バケットに以下のパス構造でログが保存されています。

AWSLogs/organizationID/CloudTrail/AccountID/CloudTrail/

注意: AWSLogs/管理用AWSアカウントのID/CloudTrail/ には保存されません

3.2 ログアクセス時のエラー

ログをダウンロードしようとすると、エラーになります。

エラー内容

現在のユーザーが、KMSの復号化操作(kms:Decrypt)を実行する権限を持っていません。

エラーの理由

CloudTrail の証跡作成時に自動生成された KMS キーが管理用 AWS アカウントに存在するため、ログ集約用 AWS アカウントのユーザーには復号化権限がありません。

4. キーポリシーの追加 (Organizations の管理用 AWS アカウントで実施)

4.1 追加する Principal

キー管理者のセクションの 3 行目にログ集約用AWSアカウントのユーザーを追記しました。

また、ログ集約用AWSアカウントのユーザーの IAM ポリシーにも KMS への権限を付与しています。

4.2 既存の Principal(証跡作成時から存在)

  1. IAM ポリシーでKMS の操作を許可されたユーザーへの許可
  2. 証跡を作成したユーザーへの許可

4.3 キーポリシー更新後の確認

キーポリシーを更新後、無事にログファイルをダウンロードすることができました。これにより、ログ集約用AWSアカウントから、暗号化されたCloudTrailログにアクセスできるようになりました。

まとめ

本記事では、AWS Organizations環境でのCloudTrailログの集約方法について、以下のポイントを解説しました。

  1. セキュアな構成: 転送時と保管時の暗号化、適切なアクセス制御により、ログデータのセキュリティを確保
  2. 段階的な設定手順:
    • ログ保管用S3バケットの作成とポリシー設定
    • 組織全体のCloudTrail証跡の作成
    • KMSキーポリシーの適切な設定
  3. クロスアカウントアクセスの実現: 適切な権限設定により、ログ集約用アカウントからの安全なログアクセスを実現

この構成により、組織全体のログを一元管理しながら、セキュリティとコンプライアンス要件を満たすことができるかなと思います。
みなさまの環境でも参考にしていただければ幸いです。

余談

トレイルランニング大会のスタート地点から。
遠くの上州武尊山には残雪があります。

山本 哲也 (記事一覧)

カスタマーサクセス部のインフラエンジニア。

山を走るのが趣味です。