「全アカウントのCloudTrail、ちゃんと有効になってますか?」——監査法人にこう聞かれて、即答できる組織は多くありません。
アカウントは増えます。dev・staging・prod、チームごと、プロダクトごと、買収先ごと。気づけば10、20とアカウントが並び、それぞれで誰かが個別にCloudTrailを設定し(あるいは忘れ)、ログはバラバラのバケットに散らばり、横断調査は不可能になっている——これがマルチアカウント環境で最もよく見る監査の破綻です。
私はマルチアカウント・多段商流のB2B SaaSや、サーバーレス(Lambda + DynamoDB)の決済プラットフォームの信頼性レイヤーを設計・運用し、本番二重課金0件を維持してきました。その経験から断言できるのは、監査基盤は「各アカウントの善意」ではなく「組織のコードで強制」しないと必ず破綻するということです。アカウントは無限に増えてよい。だが監査は1か所に集約し、改ざんできない形で固定する。これがマルチアカウント・ガバナンスの中核です。
この記事は、AWS Organizations を前提に CloudTrail を「全社の監査基盤」として設計するための実装ガイドです。組織トレイル・委任管理者・ログアーカイブアカウント・SCP・Control Tower を、Terraform / JSON / CLI の実コードで一気通貫に組みます。
この記事の前提と関連記事:CloudTrail 単体の仕組み(4つのイベント種別/証跡の作り方/SSE-KMS/ログ整合性検証/公式セキュリティBP)は、本記事では繰り返しません。基礎は柱記事 AWS CloudTrail 完全ガイド を参照してください。本記事はマルチアカウント/組織トレイルに特化して深掘りします。仕様・料金・条件は AWS 公式ドキュメント(2026年6月時点) に照合済みですが、本番投入前に必ず最新ドキュメントを確認してください。アカウントID・組織ID・バケット名は例示です。
0. メンタルモデル:「アカウントは増える。監査は1か所に集約する」
設計を始める前に、目指す全体像を一行で固定します。
全社CloudTrail監査基盤 = 組織トレイルを1本だけ作り、全メンバーアカウントの証跡を、専用のログアーカイブアカウントの集中バケットに、改ざんできない形で集約する。
図にするとこうです。
AWS Organizations (all features enabled)
│
├─ 管理アカウント (Management account) ── ※SCPが効かない特別なアカウント
│ └─ 組織トレイル(organization trail)を所有
│ └─ 委任管理者(Security/Audit account)へ運用を委譲
│
├─ ログアーカイブアカウント (Log Archive account)
│ └─ 集中S3バケット (SSE-KMS + 整合性検証 + Object Lock)
│ └─ AWSLogs/<組織ID>/<アカウントID>/CloudTrail/<region>/...
│ ↑ 全メンバーのログがここに集まる
│
├─ メンバーアカウント A (prod) ── トレイルは「見える」が変更不可
├─ メンバーアカウント B (dev) ── 同上。SCPでStopLogging等をDeny
└─ メンバーアカウント C (...) ── アカウント追加時に自動でトレイル適用
この図の各要素——「組織トレイルを1本」「委任管理者へ委譲」「ログアーカイブアカウントへ集約」「SCPで守る」——を、これから1つずつコードで組んでいきます。まず、なぜアカウント単位の証跡が破綻するのかを言語化します。
1. なぜアカウント単位の証跡では破綻するか
マルチアカウントで「各アカウントに個別のトレイルを作る」アプローチは、規模が小さいうちは動きますが、必ず4つの問題で崩れます。
| 問題 | アカウント単位トレイルで起きること |
|---|---|
| 増殖 | アカウントが増えるたびに手作業でトレイルを作る。設定値(暗号化・リージョン・整合性検証)がアカウントごとにブレる |
| 抜け漏れ | 新規アカウントでトレイル作成を忘れる。「全アカウント有効」を証明できない(監査で詰む) |
| 改ざんリスク | 各アカウントの管理者が自分のトレイルを StopLogging / DeleteTrail できてしまう。侵害された攻撃者が真っ先に証跡を消す |
| 横断調査不能 | ログが各アカウントの別々のバケットに散らばり、「組織全体で誰がIAMポリシーを変更したか」を1クエリで追えない |
この4つを構造的に解決するのが組織トレイルです。「全アカウントに自動適用・メンバーは変更不可・ログは1か所に集約」を、組織の機能として実現します。順に見ていきます。
2. 組織トレイルの仕組み:一度作れば全メンバーに自動適用
2-1. 公式が保証する5つの性質
組織トレイルは AWS Organizations と統合された特別なトレイルです。公式ドキュメントが保証する性質を正確に押さえます(出典: Creating a trail for an organization)。
| 性質 | 公式の保証 |
|---|---|
| 作成元 | 管理アカウント、または委任管理者アカウントで作成する |
| 自動適用 | 「組織トレイルを作成すると、組織に属する各メンバーアカウントに、同じ名前のトレイルのコピーが作成される」。後からアカウントが追加されても「組織トレイルとサービスリンクロールが自動で追加され、そのアカウントのログ記録が自動的に開始される」 |
| メンバーは変更不可 | メンバーアカウントのユーザーは describe-trails 等で組織トレイルを参照できるが、「組織トレイルを削除したり、ログのオン/オフを切り替えたり、記録するイベント種別を変更したり、その他いかなる変更も行う十分な権限を持たない」 |
| ログは非参照(既定) | 「デフォルトでは、管理アカウントのみがトレイルのS3バケットとその中のログにアクセスできる」。メンバーは自分のログすら見られない |
| 共通ARN | トレイルのARNは全メンバーアカウントで同一(例: arn:aws:cloudtrail:us-east-1:111111111111:trail/MyOrgTrail) |
ここが効きます。メンバーアカウントの管理者であっても、組織トレイルを止められない・消せない。これが「各アカウントの善意に依存しない」監査基盤の核心です。
2-2. 前提条件(CLI/Terraformで作る場合)
公式が要求する前提を満たしていないと、組織トレイルは作れません(出典: Prepare for creating a trail for your organization)。
- 組織で「すべての機能(all features)」が有効であること。「一括請求(consolidated billing)のみ」では作れません。
- CloudTrail の信頼されたアクセス(trusted access)を Organizations で有効化していること。CLI/API で作るなら手動で有効化が必要です(コンソール作成時は暗黙的に有効化されます)。
- 管理アカウントに
AWSServiceRoleForCloudTrailサービスリンクロールが必要(CloudTrail が各メンバーでログを記録するため)。
コスト注意:組織トレイルは、メンバーアカウントに既存のトレイルがあっても、それに追加で作成されます。あるメンバーが「同じ管理イベントを収集する2本目のトレイル」を持つと、2本目のコピー分は課金されます(管理イベントのリージョンごと1コピー目は無料)。組織トレイルを入れたら、メンバー側の重複トレイルは整理しましょう。料金の詳細は CloudTrail料金最適化ガイド を参照。
2-3. Terraform で組織トレイルを作る
aws_cloudtrail リソースに is_organization_trail = true を指定します。CLI/Terraform のデフォルトはシングルリージョンなので、全社監査では必ず is_multi_region_trail = true を明示します。
# 管理アカウント(または委任管理者アカウント)のプロバイダで実行する。
# S3バケットとKMSキーは ログアーカイブアカウント側にある(後述)。
resource "aws_cloudtrail" "org" {
name = "org-audit-trail"
# ── ログアーカイブアカウントの集中バケット ──
s3_bucket_name = "org-cloudtrail-logs-central" # Log Archiveアカウントのバケット
kms_key_id = var.central_kms_key_arn # 同アカウントのCMK
# ── 全社監査の必須設定 ──
is_organization_trail = true # ★全メンバーに自動適用
is_multi_region_trail = true # ★全リージョンを記録(既定はsingle)
enable_log_file_validation = true # ★ログ整合性検証(SHA-256 digest)
include_global_service_events = true # IAM/STS等のグローバルイベント
# 管理イベントは全アカウント分を確実に記録
advanced_event_selector {
name = "Log all management events"
field_selector {
field = "eventCategory"
equals = ["Management"]
}
}
depends_on = [aws_organizations_organization.this] # 信頼されたアクセスを先に
}
Terraform AWS provider の
is_organization_trailは「Can only be created in the organization master account」と明記されています。委任管理者から作る場合も、組織の管理アカウントが所有者になります。
これで「組織トレイル1本」が立ち上がりました。ただしこのままだと、トレイルの所有・運用はすべて管理アカウントで行うことになります。次はこれを監査チームに委譲します。
3. 委任管理者でガバナンスを分離する
3-1. なぜ委任管理者が必要か
管理アカウント(請求の親アカウント)は、組織で最も強力なアカウントです。ここの認証情報を日常運用で使うのは、最小権限の原則に反します。そこで CloudTrail は委任管理者(delegated administrator) をサポートします。
委任管理者 = 組織内のメンバーアカウントで、(一部の例外を除き)CloudTrail において管理アカウントと同じ管理タスクを実行できるアカウント(出典: Delegated administrator)。
これにより、セキュリティ/監査チーム専用のアカウントから組織トレイルを運用し、管理アカウントは「組織の構成変更」だけに限定できます。AWS Security Reference Architecture(SRA) でいう Security Tooling アカウントがこの役割を担うのが定石です。
| 項目 | 公式仕様 |
|---|---|
| 最大数 | 組織あたり最大3つの CloudTrail 委任管理者 |
| 所有権 | 委任管理者が作成したトレイル等のリソースは、所有者は管理アカウントのまま。委任管理者を解除してもリソースは削除されない |
| 登録元 | 管理アカウントの管理者のみが委任管理者を登録できる |
| 委任管理者ができないこと | 委任管理者の追加/削除、組織トレイルのアカウントレベルへの変換 等は管理アカウント専用 |
3-2. 委任管理者を登録する(CLI)
CloudTrail のネイティブAPIで登録します(管理アカウントで実行)。
# 管理アカウントで実行: メンバーアカウント(Security/Auditアカウント)を委任管理者に登録
aws cloudtrail register-organization-delegated-admin \
--member-account-id 222222222222
解除するときは、パラメータ名が --member-account-id ではなく --delegated-admin-account-id に変わる点に注意してください(公式CLIリファレンスで確認済み)。
# 委任管理者を解除する(管理アカウントで実行)
aws cloudtrail deregister-organization-delegated-admin \
--delegated-admin-account-id 222222222222
CloudTrail のネイティブCLI/APIで登録すると、必要なサービスリンクロール(
AWSServiceRoleForCloudTrailなど)が自動作成されます。一方、Organizations 側のCLI/API(organizations register-delegated-administrator)で登録すると、CloudTrailのサービスリンクロールは自動作成されません。CloudTrail のコマンドを使うのが安全です。
3-3. 登録に必要なIAM権限
委任管理者を割り当て/解除するIAMプリンシパルには、公式が定める以下のアクションが必要です(出典: Required permissions to assign a delegated administrator)。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AssignDelegatedAdminForCloudTrail",
"Effect": "Allow",
"Action": [
"cloudtrail:RegisterOrganizationDelegatedAdmin",
"cloudtrail:DeregisterOrganizationDelegatedAdmin",
"organizations:RegisterDelegatedAdministrator",
"organizations:DeregisterDelegatedAdministrator",
"organizations:ListAWSServiceAccessForOrganization",
"iam:CreateServiceLinkedRole",
"iam:GetRole"
],
"Resource": "*"
}
]
}
注意:この委任管理者割り当て用ポリシーには
organizations:EnableAWSServiceAccessやorganizations:ListAccountsは含まれません。それらは「組織トレイルの作成」に必要な別ポリシーの権限です。役割を混同しないこと。CloudTrail の service principal はcloudtrail.amazonaws.com、イベントコンテキスト用はcontext.cloudtrail.amazonaws.comです。
これで「運用は監査チームのアカウント、所有は管理アカウント」という権限分離が完成しました。次は、ログの集約先を専用アカウントに固めます。
4. ログアーカイブアカウントへ集約する(AWS SRA準拠)
4-1. なぜ専用アカウントなのか
組織トレイルのログを、管理アカウントや本番アカウントのバケットに置くのは悪手です。AWS Security Reference Architecture(SRA) は、専用の「Log Archive アカウント」にすべてのセキュリティログを集約することを推奨しています(出典: Security OU – Log Archive account)。
「Log Archive アカウントは、すべてのセキュリティ関連ログとバックアップを取り込み・アーカイブすることに専念する。AWS SRA で示す主要ログには CloudTrail(組織トレイル)が含まれる。」
SRA のアカウント構成は次の3つが基本です。
| アカウント | 役割 |
|---|---|
| Org Management account(管理アカウント) | 組織を所有。CloudTrail の信頼されたアクセスを許可し、組織トレイルを作成・所有する |
| Security Tooling account | セキュリティサービスの委任管理者。ここから組織トレイルを運用する |
| Log Archive account | 集中S3バケット+KMSキーを保持。全アカウントのログがここに集まる |
正確を期す(UNVERIFIED に近い注意):SRA の権威ある記述では、組織トレイルそのものは管理アカウントが信頼されたアクセス経由で作成・所有し、ログは Log Archive アカウントのバケットに集約します。「CloudTrail を Security Tooling アカウントに委任管理する」のは可能(§3)ですが、SRA が明示的に委任管理者へ委譲するサービス一覧(Config・GuardDuty・Security Hub 等)に CloudTrail は列挙されていません。委任管理者の利用は有効な選択肢ですが、SRA の標準形は「管理アカウントが組織トレイルを所有し、Log Archive にログを集約」である点を押さえてください。
4-2. 組織トレイル用のS3バケットポリシー(HCL)
組織トレイル用のバケットポリシーは、単一アカウントのものとresource ARN が違います。公式は3つのステートメントを定義します(出典: Amazon S3 bucket policy for CloudTrail – organization trail)。
- AclCheck:
s3:GetBucketAcl(バケットARN) - Write(管理アカウント分):
AWSLogs/<管理アカウントID>/*— 組織トレイルを単一アカウントトレイルに戻したときのため - OrganizationWrite:
AWSLogs/<組織ID>/*— ★組織のパス(アカウントIDではなく組織IDo-xxxxxxxxxx)
重要なのは、3つすべての aws:SourceArn が管理アカウントIDを使ったトレイルARNであることです。公式は「組織トレイルでは aws:SourceArn の値は管理アカウントが所有し、管理アカウントIDを使うトレイルARNでなければならない」と明言します。
# ログアーカイブアカウントのプロバイダで実行する。
# 例: bucket=org-cloudtrail-logs-central, org=o-abc123example,
# mgmt account=111111111111, region=us-east-1, trail=org-audit-trail
data "aws_iam_policy_document" "org_trail_bucket" {
# 1) ACLチェック
statement {
sid = "AWSCloudTrailAclCheck20150319"
effect = "Allow"
actions = ["s3:GetBucketAcl"]
principals {
type = "Service"
identifiers = ["cloudtrail.amazonaws.com"]
}
resources = [aws_s3_bucket.central.arn]
condition {
test = "StringEquals"
variable = "aws:SourceArn"
values = [local.org_trail_arn] # arn:aws:cloudtrail:us-east-1:111111111111:trail/org-audit-trail
}
}
# 2) 管理アカウント分の書き込み(組織トレイル→単一に戻す場合の保険)
statement {
sid = "AWSCloudTrailWrite20150319"
effect = "Allow"
actions = ["s3:PutObject"]
principals {
type = "Service"
identifiers = ["cloudtrail.amazonaws.com"]
}
resources = ["${aws_s3_bucket.central.arn}/AWSLogs/111111111111/*"]
condition {
test = "StringEquals"
variable = "s3:x-amz-acl"
values = ["bucket-owner-full-control"]
}
condition {
test = "StringEquals"
variable = "aws:SourceArn"
values = [local.org_trail_arn]
}
}
# 3) ★組織全体の書き込み(組織IDのパス)
statement {
sid = "AWSCloudTrailOrganizationWrite20150319"
effect = "Allow"
actions = ["s3:PutObject"]
principals {
type = "Service"
identifiers = ["cloudtrail.amazonaws.com"]
}
resources = ["${aws_s3_bucket.central.arn}/AWSLogs/o-abc123example/*"]
condition {
test = "StringEquals"
variable = "s3:x-amz-acl"
values = ["bucket-owner-full-control"]
}
condition {
test = "StringEquals"
variable = "aws:SourceArn"
values = [local.org_trail_arn]
}
}
}
aws:SourceOrgIDも使える:混乱した代理人(confused deputy)対策として、AWS はaws:SourceArn/aws:SourceAccountに加え、グローバル条件キーaws:SourceOrgIDをサポートし、組織単位でのアクセス制限に推奨しています(出典: IAM confused deputy)。aws:SourceOrgIDを組織IDに設定すると「組織外のCloudTrailログがバケットへ書き込むこと」を防げます。ただし公式の組織トレイル標準例はaws:SourceArn+ 組織IDパスで構成されており、aws:SourceOrgIDはそれを補強する条件キーとして使うのが正確な理解です。
4-3. KMSキーポリシー(CloudTrailがCMKで暗号化できるように)
集中バケットを SSE-KMS で暗号化する場合、CMK のキーポリシーに CloudTrail の暗号化を許可するステートメントが必要です(出典: Configure AWS KMS key policies for CloudTrail)。
{
"Sid": "AllowCloudTrailEncryptLogs",
"Effect": "Allow",
"Principal": { "Service": "cloudtrail.amazonaws.com" },
"Action": "kms:GenerateDataKey*",
"Resource": "*",
"Condition": {
"StringEquals": {
"aws:SourceArn": "arn:aws:cloudtrail:us-east-1:111111111111:trail/org-audit-trail"
},
"StringLike": {
"kms:EncryptionContext:aws:cloudtrail:arn": "arn:aws:cloudtrail:*:111111111111:trail/*"
}
}
}
aws:SourceArn には組織トレイルのARN(管理アカウントID)を、aws:SourceAccount 相当には管理アカウントIDを使う点が、組織トレイルならではの注意点です。
4-4. 改ざん耐性を「コードで」固める
ログアーカイブバケットは、攻撃者・運用者の双方から守る必要があります。柱記事のセキュリティBPに加え、マルチアカウントでは特に以下を固定します。
- S3 Object Lock(コンプライアンスモード) または MFA Delete:ログの上書き・削除を物理的に不可能にする。
- ライフサイクル:
Glacierへの階層移行とコンプライアンス要件に応じた保持期間。 - 最小権限:監査チームの読み取り以外、バケットへの書き込みは CloudTrail サービスプリンシパルのみ。
AWSCloudTrail_FullAccessの付与を最小化:このマネージドポリシーは最も重要な監査機能を無効化できる。SRA も「付与する人数を可能な限り少なく」と警告しています。
5. SCPで証跡を守る:「止められない」を組織で強制する
組織トレイルは「メンバーがそのトレイルを変更できない」ことは保証しますが、メンバーが自分のアカウントで別の悪さをする(例: ログ送信先のバケットを攻撃する、Insights を無効化する)余地は残ります。そこで SCP(Service Control Policy) で、CloudTrail の無効化操作そのものを組織的にDenyします。
5-1. 証跡無効化を禁止するSCP
AWS Control Tower の必須コントロール「Disallow Configuration Changes to CloudTrail」が、まさにこの目的のAWS純正SCPです。汎用化すると次の形になります。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ProtectCloudTrail",
"Effect": "Deny",
"Action": [
"cloudtrail:StopLogging",
"cloudtrail:DeleteTrail",
"cloudtrail:UpdateTrail",
"cloudtrail:PutEventSelectors"
],
"Resource": "*"
}
]
}
Control Tower の純正版は、自動化ロールを例外にしつつ対象を自社トレイルARNに絞っています(参考: Control Tower mandatory controls)。
{
"Sid": "GRCLOUDTRAILENABLED",
"Effect": "Deny",
"Action": [
"cloudtrail:DeleteTrail",
"cloudtrail:PutEventSelectors",
"cloudtrail:StopLogging",
"cloudtrail:UpdateTrail"
],
"Resource": ["arn:aws:cloudtrail:*:*:trail/aws-controltower-*"],
"Condition": {
"ArnNotLike": {
"aws:PrincipalARN": "arn:aws:iam::*:role/AWSControlTowerExecution"
}
}
}
5-2. 設計上の急所:SCPは管理アカウントに効かない
ここを外すと設計が崩れます。公式が繰り返し明言しています(出典: Service control policies (SCPs))。
「SCPは管理アカウントのユーザーやロールには影響しない。 メンバーアカウントにのみ影響する。」 「SCPで制限できないタスク:管理アカウントが実行するあらゆるアクション」
つまり——
- SCPは「メンバーアカウントが証跡を無効化すること」は防げる。委任管理者として指定されたメンバーアカウントにもSCPは適用されます。
- SCPは「管理アカウントで起きること」は一切防げない。組織トレイルを管理アカウントが所有している場合、SCPでそのトレイルを保護することはできません。管理アカウントのアクセスは別手段(厳格なIAM、認証情報の保管、CloudTrailのイベント監視)で守る必要があります。
- SCPは「すべての機能(all features)」が有効な組織でのみ使える。一括請求のみの組織では使えません。
管理アカウントの認証情報を日常運用から排除し(§3の委任管理者)、管理アカウントでの操作自体を監視対象にする——「SCPで守れない領域」をどう埋めるかが、ガバナンス設計の腕の見せどころです。AWS公式のSCPサンプルは aws-samples/service-control-policy-examples にも集約されています。
6. Control Tower を使う場合:自動構成と自前構築の使い分け
ここまでを自前で組む代わりに、AWS Control Tower のランディングゾーンを使えば、組織トレイルとログアーカイブ/監査アカウントが自動構成されます。
6-1. Control Tower が自動構成するもの
公式の明言(出典: Logging with CloudTrail)。
「AWS Control Tower はランディングゾーンのセットアップ時に新しい CloudTrail トレイルを設定する。これは組織レベルのトレイルで、管理アカウントと全メンバーアカウントのすべてのイベントを記録する。」
| Control Tower が作るもの | 内容 |
|---|---|
| 組織トレイル | 管理アカウントに組織レベルのCloudTrailトレイルをデプロイ(信頼されたアクセス経由) |
| Log Archive アカウント | 既定名「Log archive」。全ログを集中保管するS3バケットを持つ共有アカウント |
| Audit アカウント | 既定名「Audit」。クロスアカウントのセキュリティ監査用の共有アカウント |
| 必須SCP | CloudTrail/Config バケットの暗号化・ライフサイクル変更や StopLogging 等を禁止するSCPを自動適用 |
歴史的な重要変更(確認済み):Control Tower はかつて各メンバーアカウントに個別トレイルを作っていましたが、landing zone version 3.0 で組織トレイルへ移行しました。公式は「3.0 に更新すると、CloudTrailトレイルが組織トレイルになる。各アカウントレベルのトレイルは削除されるが、既存のログファイルはS3バケットに保持される」と明記しています。古い記事の「Control Towerはアカウントごとにトレイルを作る」という記述は現在は誤りです。
6-2. 自前構築 vs Control Tower
| 観点 | 自前(本記事§2-5) | Control Tower |
|---|---|---|
| 立ち上げ速度 | 遅い(自分で全部組む) | 速い(ランディングゾーンが一括構成) |
| 柔軟性 | 高い(要件に完全に合わせられる) | 中(Control Towerの枠内。3.0以降は組織トレイルの管理をオプトアウトして自前運用も可能) |
| ガードレール | 自分でSCPを書く | 必須・推奨コントロールが標準装備 |
| 向くケース | 既存の独自マルチアカウント、IaCで全管理したい | これから組織を立ち上げる、ベストプラクティス準拠を最短で |
Control Tower が自前の組織トレイルを使う/自前トレイルを別途運用する選択肢は、landing zone 3.0以降で提供されています(オプトアウトして自分で CloudTrail を管理可能)。なお Control Tower は自身の組織トレイルを管理アカウントの信頼されたアクセスで運用しており、CloudTrailの委任管理者を登録するわけではありません。
7. 全社の横断調査:クロスアカウントAthenaとLake
ログが1か所に集まったら、組織全体を1クエリで調査できます。
7-1. クロスアカウントAthena(推奨)
監査担当(Audit アカウント)が、Log Archive アカウントの集中バケットを Athena でクエリする標準パターンです。バケットがKMS暗号化されているため、AWSは3つの許可を求めます(出典: Athena cross-account access)。
- Log Archive アカウントのS3バケットポリシーが、Auditアカウントの引き受けロールに
s3:GetObject/s3:ListBucket等を許可。 - Log Archive アカウントのKMSキーポリシーが、同ロールに
kms:Decrypt/kms:DescribeKey等を許可。 - Audit アカウントのIAMロールが、対向のバケットとキーへのアクセスを許可。
これが揃えば、組織IDパーティション付きのテーブルに対して、こう問えます。
-- 組織全体で、過去24時間に「ルートユーザー」が行った操作をすべて洗い出す
SELECT eventtime, recipientaccountid, eventsource, eventname, sourceipaddress
FROM org_cloudtrail_logs
WHERE useridentity.type = 'Root'
AND eventtime > to_iso8601(current_timestamp - interval '1' day)
ORDER BY eventtime DESC;
recipientaccountid でどのメンバーアカウントの操作かが分かるのが、組織トレイルならではの強みです。Athenaのパーティション設計やパーティション射影の詳細は柱記事のAthena節を参照してください。
7-2. CloudTrail Lake の組織イベントデータストア(現状の注意)
CloudTrail Lake の組織イベントデータストアは、組織内の全アカウント・複数リージョンのイベントを1か所に集約し、Trino互換のSQLで横断クエリできます。管理アカウントまたは委任管理者から作成でき、委任管理者が作っても実体は管理アカウントに存在します。
重要(確認済み):CloudTrail Lake は 2026年5月31日をもって新規顧客の受付を終了しました(既存顧客は継続利用可)。公式は「Lake は重要なバグ修正とセキュリティ更新のみ受ける」とし、Lakeデータの Amazon CloudWatch への移行を推奨しています(出典: CloudTrail Lake service availability change)。これから全社監査基盤を新規に作るなら、分析基盤は Athena + 集中S3 を本線に据えるのが現実的です。
7-3. 検知(脅威検知は別記事へ)
組織トレイルを EventBridge / CloudWatch Logs に流せば、「ルートユーザーのログイン」「StopLogging の試行」などを組織横断でニアリアルタイム検知できます。脅威検知・インシデントレスポンスの設計は、姉妹記事 CloudTrailによる脅威検知とインシデントレスポンス と、GuardDutyのマルチアカウント脅威検知 に譲ります。本記事の主眼は「証跡を全社で集約・保全する基盤」です。
8. まとめ:全社CloudTrail監査基盤チェックリスト
マルチアカウントのCloudTrail監査基盤は、「各アカウントの善意」ではなく「組織のコードで強制」して初めて成立します。最後に、本番投入前のチェックリストで締めます。
組織トレイル
- 組織で「すべての機能(all features)」が有効
- CloudTrail の信頼されたアクセスを有効化
- 組織トレイルを1本作成(
is_organization_trail = true) - マルチリージョン(
is_multi_region_trail = true、CLI/TF既定はsingle) - ログ整合性検証(
enable_log_file_validation = true) - グローバルサービスイベントを含める
ガバナンス分離
- Security/Audit アカウントを委任管理者に登録(管理アカウントの認証情報を日常運用に使わない)
- 委任管理者は最大3つ・所有者は管理アカウントのまま、を理解
ログ集約(SRA準拠)
- 専用のログアーカイブアカウントに集中S3バケット
- 組織トレイル用バケットポリシー(
AWSLogs/<組織ID>/*、aws:SourceArnは管理アカウントのトレイルARN) - SSE-KMS(CMKキーポリシーに
aws:SourceArn条件) - S3 Object Lock / MFA Delete・ライフサイクル・最小権限
-
AWSCloudTrail_FullAccessの付与を最小化
証跡の保全
- SCPで
StopLogging/DeleteTrail/UpdateTrail/PutEventSelectorsをDeny - SCPは管理アカウントに効かない前提で、管理アカウントを別手段で防御
横断調査
- クロスアカウントAthena(S3+KMS+IAMの3点許可)
- 新規構築の分析基盤はAthena+S3を本線に(Lakeは新規受付終了)
アカウントは、これからも増えます。事業が伸びれば、チームが増え、買収もあり、環境も分かれる。増えてよいのです。 監査が1か所に集約され、改ざんできない形で固定され、組織のコードで強制されている限り。
私は一人 × 生成AI(Claude Code)という体制で、マルチアカウント・多段商流のB2B SaaSや本番二重課金0件のサーバーレス決済基盤を、速く・安全に設計・運用してきました。その肝は常に「正しさを運用の注意深さではなく、コードの構造とガバナンスで保証する」ことにあります。本記事の組織トレイル・委任管理者・SCP・ログアーカイブアカウントは、まさにその思想をAWS Organizations 上で具現化したものです。
全社AWSガバナンスの相談:「アカウントが増えて監査が追えない」「ランディングゾーンをコードで設計したい」「監査法人に証跡を求められた」——こうした課題は、組織トレイルとログアーカイブアカウントの設計で構造的に解けます。マルチアカウント・ガバナンス/ランディングゾーン設計のご相談は お問い合わせ からどうぞ。鍵レスCI/CD(GitHub Actions OIDC)やコスト最適化(Terraform FinOps)と合わせ、速く・安く・安全なAWS基盤を一気通貫で設計します。