マルチアカウント環境でAWSを本格運用し始めると、監査ログをどう一元管理するかという問題が必ず出てくる。開発・ステージング・本番・セキュリティを分離した10アカウントでも、それぞれに個別でCloudTrailを設定していては、ログが分散してインシデント調査が遅れるし、メンバーアカウントの管理者がうっかりCloudTrailを止めても気づけない。
この記事では、AWS Organizations全体にCloudTrailを自動展開する「組織証跡(Organization Trail)」の設計から、S3への一元集約、Athenaによる分析クエリ、ログ整合性の検証、コスト制御の実践まで、監査ログ基盤を本番品質に仕上げるための設計判断を体系的に解説する。すでにCloudTrail・GuardDutyの基礎を押さえている方が、次のステップとしてマルチアカウント設計に踏み込む際の実践ガイドとして読んでほしい。

個別のCloudTrail設定が抱える3つの限界
オンプレ環境では、各サーバーのsyslogをrsyslogやFluentdで中央サーバーに集約するのが当たり前だった。クラウドでも同じ発想が必要だが、マルチアカウント環境では「アカウントごとに個別設定」というアプローチが限界を迎えやすい。
限界1: 設定漏れと設定ドリフト
一般的に、100アカウント規模になると各アカウントへの設定漏れが発生しやすい。新しいアカウントを払い出すたびに「CloudTrailを有効化する」という手順を人手で踏む必要があり、自動化されていないと抜け漏れが生まれる。
限界2: メンバーアカウントでの改ざんリスク
メンバーアカウントの管理者権限を持つユーザーが、自分のアカウントのCloudTrailを停止したり、S3バケットのログを削除したりできてしまう。内部不正や侵害されたアカウントからの証拠隠滅を防げない。
限界3: ログが分散してインシデント対応が遅れる
100アカウント×東京・大阪リージョンのログが100か所以上に分散していると、インシデント発生時に横断調査ができない。「どのアカウントで何が起きたか」を時系列で追うためには、ログを一か所に集めることが前提になる。
これらの課題を解決するのが、AWS Organizationsと連携した「組織証跡(Organization Trail)」だ。
組織証跡(Organization Trail)の仕組みと個別証跡との違い
組織証跡は、AWS Organizationsの管理アカウント(または委任された管理者アカウント)から作成すると、組織内の全メンバーアカウントのすべてのリージョンに自動展開される証跡だ。
個別証跡との主な違いをまとめると次のとおりだ(2026年10月時点)。
| 項目 | 個別証跡 | 組織証跡 |
|---|---|---|
| 設定対象 | 各アカウント×リージョンを個別に設定 | 管理アカウントで1回設定すれば全体に展開 |
| メンバーの操作 | 各アカウント管理者が変更・停止できる | メンバーアカウントから変更・停止できない |
| 新規アカウント | 追加時に手動で設定が必要 | Organizations加入時に自動で展開 |
| ログの集約 | 別途S3レプリケーション等が必要 | 管理アカウント配下のS3に自動集約 |
| AWS料金 | 各アカウントで課金 | 各アカウントで課金(管理イベント1証跡は無料) |
重要なのは「メンバーアカウントから変更・停止できない」という点だ。組織証跡は、メンバーアカウントのコンソールでは読み取り専用で表示されるだけで、設定変更も証跡の停止もできない。これにより改ざんリスクを構造的に排除できる。
また、AWS Organizationsのマルチアカウント管理を整備したタイミングで組織証跡も同時に設計することを推奨する。AWS Control Towerを使っている場合は、Landing Zone構築時にCloudTrailの組織証跡が自動で作成されるため、重複に注意が必要だ。
組織証跡の設計と作成手順
1. S3バケットとバケットポリシーの準備
組織証跡のログを受け取るS3バケットは、管理アカウント(またはログアーカイブ専用のアカウント)に作成する。セキュリティ上の理由から、ログアーカイブ専用アカウントを用意してそこにログを集約するアーキテクチャが望ましい。
バケットポリシーには、CloudTrailからの書き込みと、全メンバーアカウントからのACL確認を許可する設定が必要だ。組織証跡では、CloudTrailがバケットポリシーを自動的に検証するため、ポリシーが正しくないと証跡作成時にエラーになる。
# S3バケットポリシーの骨格(組織証跡用) { "Version": "2012-10-17", "Statement": [ { "Sid": "AWSCloudTrailAclCheck", "Effect": "Allow", "Principal": { "Service": "cloudtrail.amazonaws.com" }, "Action": "s3:GetBucketAcl", "Resource": "arn:aws:s3:::your-org-trail-logs-bucket", "Condition": { "StringEquals": { "aws:SourceArn": "arn:aws:cloudtrail:ap-northeast-1:MANAGEMENT_ACCOUNT_ID:trail/org-trail" } } }, { "Sid": "AWSCloudTrailWrite", "Effect": "Allow", "Principal": { "Service": "cloudtrail.amazonaws.com" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::your-org-trail-logs-bucket/AWSLogs/ORGANIZATION_ID/*", "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control", "aws:SourceArn": "arn:aws:cloudtrail:ap-northeast-1:MANAGEMENT_ACCOUNT_ID:trail/org-trail" } } } ] }
ポイントは2点だ。まず `aws:SourceArn` による証跡ARNの指定は、2022年以降のベストプラクティスとして追加された混乱した代理攻撃(Confused Deputy Problem)への対策だ。次に、`Resource` のパスに `ORGANIZATION_ID` を含めることで、組織配下の全アカウントのログが同一バケットに整理される形でプレフィックスされる。
また、ログバケットへのパブリックアクセスは完全にブロックし、バケットのバージョニングを有効にすることも推奨する。バージョニングにより、ログの上書き削除を追跡できる。
2. 組織証跡の作成(CLIでの手順)
# AWS CLIで組織証跡を作成する # 管理アカウントのクレデンシャルで実行する aws cloudtrail create-trail \ --name org-trail \ --s3-bucket-name your-org-trail-logs-bucket \ --is-multi-region-trail \ --enable-log-file-validation \ --is-organization-trail \ --region ap-northeast-1 # 証跡を有効化する(作成しただけではロギングが始まらない) aws cloudtrail start-logging \ --name arn:aws:cloudtrail:ap-northeast-1:MANAGEMENT_ACCOUNT_ID:trail/org-trail
主要なオプションの意味を整理する。
・–is-multi-region-trail: 全リージョンのイベントをキャプチャ。東京リージョンだけでなく、東京以外のリージョンで発生したAPI操作も記録される。これを省略するとシングルリージョン証跡になり、他リージョンでのアクティビティが漏れる。
・–enable-log-file-validation: ログ整合性検証を有効化。S3に保存されたログが改ざんされていないかをダイジェストファイルで検証できるようになる(後述)。
・–is-organization-trail: 組織証跡として作成する。これを付けないと通常の個別証跡になる。
3. 委任された管理者アカウントの活用
管理アカウントで直接CloudTrailを操作するのは好ましくない場合がある。管理アカウントへのアクセスはできるだけ絞るべきというベストプラクティスに反するからだ。その場合は、セキュリティ専用アカウントを「委任された管理者(Delegated Administrator)」に指定する方法がある。
# 管理アカウントから、セキュリティアカウントを委任管理者に登録 aws organizations register-delegated-administrator \ --account-id SECURITY_ACCOUNT_ID \ --service-principal cloudtrail.amazonaws.com
委任された管理者アカウントからは、組織証跡の作成・管理が可能になる。管理アカウントへのログインを最小限に抑えながら、セキュリティ運用チームが独立してCloudTrailを管理できる体制が整う。
記録するイベントの種類と有効化の判断基準
CloudTrailが記録するイベントには3種類ある。有効化する範囲によって料金が大きく変わるため、設計段階での判断が重要だ(料金は2026年10月時点)。
| イベント種別 | 内容 | 料金(東京リージョン) | 推奨 |
|---|---|---|---|
| 管理イベント(コントロールプレーン) | EC2起動・IAMロール作成・VPC設定変更等のAWS管理操作 | 1証跡目は無料(追加証跡は$2.00/100,000イベント) | 必須 |
| データイベント(データプレーン) | S3オブジェクトのPUT/GET、Lambda関数実行、DynamoDBのGetItem等 | $0.10/100,000イベント | 要件に応じて選択 |
| Insightsイベント | 管理イベントの異常なAPI呼び出しパターンを機械学習で検出 | $0.35/100,000管理イベント(追加課金) | 高セキュリティ要件の場合 |
管理イベントは必ず有効化する。読み書きの種別(Read/Write)があり、コスト削減のために「Writeのみ記録」とする組織もあるが、ReadイベントにもGetPasswordData(EC2 WindowsのパスワードをKMSで復号する操作)やDescribeInstances等の重要な操作が含まれるため、できれば両方を記録したい。
データイベントは料金が高くなりやすいため注意が必要だ。S3の全バケット全オブジェクトに対してデータイベントを有効化すると、アクセス量の多い環境では月数万円以上になることがある(想定例として、1日10億リクエストある環境なら月約$30,000)。対象を絞る典型的な方針は次のとおりだ。
・機密データを格納するS3バケット(個人情報、財務情報等)のみ有効化
・本番Lambdaの実行ログ(Lambda関数ARNを個別指定)
・DynamoDBは主要テーブルのみ(全テーブルでの有効化は避ける)
Insightsイベントは、API呼び出しの急増や異常なパターンを自動検出してくれる機能だが、管理イベント数の35%相当の追加コストがかかる。コンプライアンス要件(PCI DSS等)で求められる場合や、高度なセキュリティ監視が必要な環境では有効化を検討する価値がある。
ログ整合性検証(Digest Files)の仕組みと活用
監査証跡の信頼性を担保するうえで重要なのが、ログが改ざんされていないことを証明できることだ。CloudTrailの「ログファイルの整合性検証」を有効化すると、1時間ごとにダイジェストファイル(Digest File)がS3に保存される。
ダイジェストファイルには、その時間帯のCloudTrailログファイルのSHA-256ハッシュ値が記録されており、前のダイジェストファイルへのポインタも含まれる。これにより、ログファイル群のチェーンが形成される仕組みだ。
AWS CLIで整合性を検証するには次のコマンドを使う。
# 特定期間のログ整合性を検証する aws cloudtrail validate-logs \ --trail-arn arn:aws:cloudtrail:ap-northeast-1:MANAGEMENT_ACCOUNT_ID:trail/org-trail \ --start-time 2026-10-01T00:00:00Z \ --end-time 2026-10-02T00:00:00Z \ --verbose # 出力例(正常時) # Validating log files for trail... # 2026/10/01/00/ACCOUNT_ID_CloudTrail_ap-northeast-1_20261001T0000Z.json.gz # Valid # ... # Results requested for 2026-10-01T00:00:00Z to 2026-10-02T00:00:00Z # Results found for 2026-10-01T00:00:00Z to 2026-10-02T00:00:00Z: # 24/24 log files valid, 0/24 log files INVALID
インシデント発生後やコンプライアンス監査時に、この検証を実行することで「ログが改ざんされていない」という証明ができる。外部監査対応の際に非常に重要な機能だ。
注意点として、ダイジェストファイルが保存されるS3のパスは、ログファイルとは別のプレフィックス配下になる。S3のライフサイクルポリシーでログを削除・階層化する際に、ダイジェストファイルも同様に移動・削除してしまわないよう設定に気をつけたい。
AthenaによるSQL分析の実践
組織証跡のログをS3に集約できたら、次はそのログを実際に使える状態にすることだ。CloudTrailのログはJSON形式でgzip圧縮されており、そのままでは検索できない。Amazon Athenaを使えば、S3上のCloudTrailログをSQLで横断検索できる。
1. Athenaテーブルの作成
CloudTrailのコンソールには「Athenaテーブルを作成」というボタンがあり、ワンクリックで自動的にAthenaDDLが実行される。手動で作成する場合は次のDDLを参考にする。
-- Athenaでのテーブル作成(パーティション最適化版) CREATE EXTERNAL TABLE cloudtrail_logs ( eventVersion STRING, userIdentity STRUCT< type:STRING, principalId:STRING, arn:STRING, accountId:STRING, invokedBy:STRING, accessKeyId:STRING, userName:STRING, sessionContext:STRUCT<...> >, eventTime STRING, eventSource STRING, eventName STRING, awsRegion STRING, sourceIPAddress STRING, userAgent STRING, errorCode STRING, errorMessage STRING, requestParameters STRING, responseElements STRING, requestID STRING, eventID STRING, readOnly STRING, resources ARRAY<STRUCT<ARN:STRING, accountId:STRING, type:STRING>>, eventType STRING, recipientAccountId STRING ) PARTITIONED BY ( account_id STRING, region STRING, year STRING, month STRING, day STRING ) ROW FORMAT SERDE 'com.amazon.emr.hive.serde.CloudTrailSerde' STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://your-org-trail-logs-bucket/AWSLogs/ORGANIZATION_ID/';
パーティション設計のポイントは、S3のプレフィックス構造(`AWSLogs/{org-id}/{account-id}/CloudTrail/{region}/{year}/{month}/{day}/`)に合わせることだ。パーティションを切ることで、特定のアカウントや日付に絞ったクエリのデータスキャン量を大幅に削減できる(Athenaのコスト最適化で解説している原則と同じだ)。
2. よく使うCloudTrailクエリ例
監査・調査・インシデント対応でよく使うクエリを「想定例」として示す。実際のアカウントIDやユーザー名は環境に合わせて書き換えること。
-- ルートアカウントの使用を検索(即座に調査が必要な操作) SELECT eventtime, eventname, awsregion, sourceipaddress FROM cloudtrail_logs WHERE useridentity.type = 'Root' AND year = '2026' AND month = '10' ORDER BY eventtime DESC LIMIT 100; -- 特定ユーザーのIAM操作を一覧(権限昇格の調査) SELECT eventtime, eventname, recipientaccountid, awsregion, useridentity.arn, errorcode FROM cloudtrail_logs WHERE eventsource = 'iam.amazonaws.com' AND useridentity.arn LIKE '%target-user%' AND year = '2026' AND month = '10' ORDER BY eventtime; -- コンソール外からのAPI呼び出し(プログラムアクセスの監視) SELECT eventtime, eventname, useridentity.arn, sourceipaddress, useragent FROM cloudtrail_logs WHERE useragent NOT LIKE '%console%' AND useragent NOT LIKE '%aws-sdk%' AND eventtype = 'AwsApiCall' AND year = '2026' AND month = '10' AND day = '01' ORDER BY eventtime; -- エラーになったAPI呼び出し(権限不足・失敗操作のサマリ) SELECT eventname, errorcode, errorMessage, COUNT(*) as error_count FROM cloudtrail_logs WHERE errorcode IS NOT NULL AND errorcode != '' AND year = '2026' AND month = '10' GROUP BY eventname, errorcode, errorMessage ORDER BY error_count DESC LIMIT 50;
インシデント調査時の活用パターンとしては、クラウドセキュリティインシデント対応で整理した初動フローに合わせて、「疑わしいリソースのARNで絞り込む」「疑わしい時間帯のイベントを全件取得する」という調査が中心になる。AWS DetectiveはCloudTrailのログをグラフデータベースで管理して関係性を可視化してくれるため、複雑な侵害経路の調査にはDetectiveと組み合わせるのが効果的だ。
CloudWatch Logs連携によるリアルタイムアラート
Athenaはバッチ的な事後調査向けだが、重要なAPI操作をリアルタイムで検知したい場合はCloudWatch Logsとの連携が有効だ。証跡にCloudWatch Logsへの転送を設定すると、CloudWatch Logs Insightsでの検索やメトリクスフィルターによるアラートが可能になる。
# CloudTrail証跡にCloudWatch Logsを追加(CLIでの設定) aws cloudtrail update-trail \ --name org-trail \ --cloud-watch-logs-log-group-arn arn:aws:logs:ap-northeast-1:MANAGEMENT_ACCOUNT_ID:log-group:CloudTrail/org-trail \ --cloud-watch-logs-role-arn arn:aws:iam::MANAGEMENT_ACCOUNT_ID:role/CloudTrail_CloudWatch_Role
連携後は、CloudWatch Logsのメトリクスフィルターを使って次のような検知を設定できる(CIS AWS Foundations Benchmarkが推奨する監視項目の一部)。
| 監視項目 | フィルターパターン(概略) | アラート優先度 |
|---|---|---|
| ルートアカウントの使用 | userIdentity.type = Root | 高(即時アラート) |
| MFA未設定でのコンソールサインイン | ConsoleLogin + mfaAuthenticated = false | 高 |
| IAMポリシーの変更 | Put/Delete/Attach/DetachPolicy系 | 中(業務時間外は高) |
| CloudTrailの設定変更・停止 | StopLogging / DeleteTrail / UpdateTrail | 高(即時アラート) |
| セキュリティグループの変更 | AuthorizeSecurityGroup系 / RevokeSecurityGroup系 | 中 |
| S3バケットポリシーの変更 | PutBucketPolicy / DeleteBucketPolicy | 中~高 |
| KMSキーの無効化・削除スケジュール | DisableKey / ScheduleKeyDeletion | 高 |
これらのアラートは、CloudWatch AlarmからSNS → Slackやメールへの通知パイプラインと組み合わせることで、担当者への即時通知を実現できる。Amazon GuardDutyと組み合わせると、GuardDutyが機械学習で検出する脅威インテリジェンスベースの検知(例: 既知の悪意あるIPからのAPI呼び出し)と、CloudTrailのルールベースの検知を二重で網羅できる。
料金の仕組みとコスト最適化の実践
CloudTrailの料金構造を正確に理解していないと、想定外の請求につながる。要点をまとめると次のとおりだ(2026年10月時点・東京リージョン)。
・管理イベント(1証跡目): 無料 — 各アカウント×各リージョンで1本目の証跡の管理イベントは無料。ただし、同一アカウント内に2本目の証跡を作成すると追加料金($2.00/100,000イベント)が発生する。
・管理イベント(追加証跡): $2.00/100,000イベント — 組織証跡を使うと各メンバーアカウントで「追加証跡」として扱われ、2証跡目分の料金が発生するケースがある。ただし、組織証跡の管理アカウント側では無料枠が適用されるため、各メンバーアカウントが既に個別証跡を持っているかどうかで料金が変わる。
・データイベント: $0.10/100,000イベント — S3の全バケットに有効化するのは危険。対象バケット・リソースを絞ること。
・Insightsイベント: 管理イベントあたり$0.35/100,000イベント — 有効にすると管理イベントの料金に加えて発生する。
・S3ストレージ: 標準的なS3料金 — ログの保管コストも考慮が必要。S3のライフサイクルポリシーで30日後にStandard-IA、1年後にGlacier Instant Retrievalへ移行するパターンが一般的だ。
コスト最適化のよくある判断ポイントとして、「メンバーアカウントの既存個別証跡を組織証跡に統合する際に削除すべきか」がある。個別証跡を削除することで管理イベントの追加課金を防げるが、メンバーアカウントのエンジニアが独自にCloudTrailを参照していた場合に不便が生じる可能性がある。運用ルールと合わせて判断したい。
AWS Security HubでCloudTrail関連のコントロール(例: 「CloudTrail.1: CloudTrailを有効にして少なくとも1つのマルチリージョン証跡を含める必要がある」)を有効化しておくと、設定の準拠状況を継続的に監視できる。
よくあるつまずきと対処法
つまずき1: S3バケットポリシーの不備でログが届かない
組織証跡を作成しても、S3に何もログが届かないケースの多くがバケットポリシーの不備だ。特に `aws:SourceArn` の証跡ARNを手打ちで書いてスペルミスするパターンが多い。証跡作成後にS3のアクセスログを確認し、「403 Forbidden」が記録されていないかを確認しよう。CloudTrailコンソールの「証跡の詳細」でエラーステータスが表示される場合もある。
つまずき2: 組織外のアカウントからのログが混入する
過去に使っていたアカウントをOrganizationsから除外した後でも、S3バケットのポリシーに古い記述が残っていると、そのアカウントからのPutObjectが通り続けることがある。バケットポリシーの `aws:SourceOrg` 条件キーを使って、組織IDでの書き込み制限を明示的に設定することを推奨する。
つまずき3: ログの遅延(15分程度)を見落とす
CloudTrailのログはほぼリアルタイムだが、約15分の配信遅延がある。「今すぐ確認したい直近のAPI操作」はCloudTrailコンソールの「イベント履歴」から参照するのが確実だ(イベント履歴は最大90日分の管理イベントをリアルタイムに近い形で閲覧できる)。S3に届くまで15分かかるため、Athenaクエリで直近15分のログが取れないのは仕様だ。
つまずき4: Athenaクエリのコストが高くなる
パーティションを設定せずに全期間のスキャンを実行すると、数GBのCloudTrailログ全体をスキャンしてしまいコストが跳ね上がる。クエリに `WHERE year = ‘2026’ AND month = ’10’ AND day = ’01’` のようなパーティション条件を必ず付ける習慣をつけること。また、Athena EngineのWorkgroup設定でスキャン上限(バイト数)を設定しておくと、誤って全スキャンするクエリをブロックできる。
つまずき5: CloudWatch Logs転送IAMロールの権限不足
証跡からCloudWatch Logsへの転送を設定する際は専用のIAMロールが必要だ。よくあるミスは、ロールの信頼ポリシーの `Principal` を `cloudtrail.amazonaws.com` に正しく設定できていないケースだ。SCPでCloudWatchへのアクセスを制限している環境では、CloudTrailからの書き込みが除外されているか合わせて確認する必要がある。

本記事のまとめ
組織証跡を中心としたCloudTrail設計のポイントを整理する。
| 設計項目 | 推奨アプローチ |
|---|---|
| 証跡の展開方法 | 組織証跡で全アカウント・全リージョンに自動展開 |
| ログの保管先 | ログアーカイブ専用アカウントのS3バケットに一元集約 |
| 管理イベント | Read/Write両方を記録(コスト許容できる場合) |
| データイベント | 機密バケット・主要Lambda等に対象を限定 |
| 整合性検証 | 有効化必須。コンプライアンス監査・インシデント後に実行 |
| 分析基盤 | AthenaPaなど + パーティション設計でコスト最適化 |
| リアルタイム監視 | CloudWatch Logsへの転送 + メトリクスフィルター |
| 連携先 | GuardDuty・Security Hub・Detectiveと組み合わせて多層防御 |
CloudTrailの組織証跡は、マルチアカウント環境のセキュリティ監査基盤の土台だ。ログを集めるだけでなく、Athenaで検索できる状態にすること、整合性を検証できること、重要な操作をリアルタイムで検知できることまで揃えて初めて「本番品質の監査基盤」と言える。コスト設計を誤ると毎月の請求が無視できない額になるため、データイベントの対象範囲と保管期間のライフサイクルポリシーは設計初期から慎重に決めてほしい。
PR
AWSではじめるクラウドセキュリティ(松本照吾ほか/テッキーメディア)
CloudTrail・GuardDuty・IAMを中心にAWSのセキュリティ設計を体系的に解説した一冊。組織証跡の設計からインシデント対応まで、本記事の内容をさらに深掘りしたい方に最適だ。
