implementing-cloud-trail-log-analysis について
AWS のセキュリティ・運用チーム向けの CloudTrail ログ分析スキルです。ログ設定、クエリ、アラートの手順を扱い、API 操作の追跡、インシデント調査、既知の攻撃パターンの検出に役立ちます。
主な機能
- 01組織全体の CloudTrail ログ設定
- 02Athena によるログクエリ
- 03Logs Insights による操作分析
- 04メトリクスフィルターとアラームの作成
- 05認証情報の操作追跡とログ完全性確認
活用シーン
- 01侵害された認証情報による API 操作の調査
- 02AWS の管理・データアクセス監査
- 03未認可 API 呼び出しやルート利用の検出
- 04セキュリティ分析向け API 行動基準の構築
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill implementing-cloud-trail-log-analysisインストール後、Claude Code で/implementing-cloud-trail-log-analysisを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEreferences/api-reference.mdscripts/agent.py詳細
CloudTrail ログ分析の実装
使用するタイミング
- AWS API アクティビティに対するセキュリティ監視パイプラインを構築するとき
- セキュリティインシデントを調査し、攻撃者の操作を AWS サービス全体で追跡するとき
- コンプライアンス要件により、すべての管理操作およびデータアクセス操作の監査ログが必要なとき
- AWS 環境における既知の攻撃パターンを検出するルールを作成するとき
- 異常検知のためにAPI の通常の動作のベースラインを確立するとき
使用しないでください リアルタイムの脅威検出には (CloudTrail を既に分析している GuardDuty を使用してください)、アプリケーションレベルのログには (CloudWatch Application Logs を使用してください)、ネットワークトラフィック分析には (VPC Flow Logs を使用してください)。
前提条件
- すべてのアカウントで管理イベントと、必要に応じてデータイベントを有効にした CloudTrail
- 適切な保持ポリシーを設定し、CloudTrail の配信チャネルとして構成された S3 バケット
- アドホッククエリ用に CloudTrail ログテーブルを設定した Amazon Athena
- Logs Insights によるリアルタイム分析のための CloudWatch Logs サブスクリプション
- 本番環境の監視用の SIEM 連携 (Splunk、Elastic、または Security Lake)
ワークフロー
ステップ 1: 包括的なログ記録のための CloudTrail の設定
CloudTrail が組織全体で関連するすべてのイベントタイプを取得するように設定します。
# Create an organization trail (captures all accounts)
aws cloudtrail create-trail \
--name org-security-trail \
--s3-bucket-name cloudtrail-logs-org-ACCOUNT \
--is-organization-trail \
--is-multi-region-trail \
--include-global-service-events \
--enable-log-file-validation \
--kms-key-id alias/cloudtrail-key \
--cloud-watch-logs-log-group-arn arn:aws:logs:us-east-1:ACCOUNT:log-group:cloudtrail-org:* \
--cloud-watch-logs-role-arn arn:aws:iam::ACCOUNT:role/CloudTrailCloudWatchRole
# Start logging
aws cloudtrail start-logging --name org-security-trail
# Enable data events for S3 and Lambda
aws cloudtrail put-event-selectors \
--trail-name org-security-trail \
--advanced-event-selectors '[
{
"Name": "S3DataEvents",
"FieldSelectors": [
{"Field": "eventCategory", "Equals": ["Data"]},
{"Field": "resources.type", "Equals": ["AWS::S3::Object"]}
]
},
{
"Name": "LambdaDataEvents",
"FieldSelectors": [
{"Field": "eventCategory", "Equals": ["Data"]},
{"Field": "resources.type", "Equals": ["AWS::Lambda::Function"]}
]
}
]'
# Verify trail configuration
aws cloudtrail describe-trails --trail-name-list org-security-trail
ステップ 2: CloudTrail クエリ分析のための Athena の設定
SQL で CloudTrail ログをクエリするための Athena テーブルを作成します。
-- Create CloudTrail Athena table
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<
attributes:STRUCT<mfaAuthenticated:STRING, creationDate:STRING>,
sessionIssuer:STRUCT<type:STRING, principalId:STRING, arn:STRING, accountId:STRING, userName:STRING>
>
>,
eventTime STRING,
eventSource STRING,
eventName STRING,
awsRegion STRING,
sourceIPAddress STRING,
userAgent STRING,
errorCode STRING,
errorMessage STRING,
requestParameters STRING,
responseElements STRING,
additionalEventData STRING,
requestId STRING,
eventId STRING,
readOnly STRING,
resources ARRAY<STRUCT<arn:STRING, accountId:STRING, type:STRING>>,
eventType STRING,
apiVersion STRING,
recipientAccountId STRING,
sharedEventId STRING,
vpcEndpointId STRING
)
PARTITIONED BY (region STRING, year STRING, month STRING, day STRING)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
LOCATION 's3://cloudtrail-logs-org-ACCOUNT/AWSLogs/ORG_ID/';
-- Add partitions for recent data
ALTER TABLE cloudtrail_logs ADD
PARTITION (region='us-east-1', year='2026', month='02', day='23')
LOCATION 's3://cloudtrail-logs-org-ACCOUNT/AWSLogs/ORG_ID/ACCOUNT/CloudTrail/us-east-1/2026/02/23/';
ステップ 3: セキュリティに焦点を当てた Athena クエリの実行
一般的な攻撃パターンや不審なアクティビティを検出するためのクエリを実行します。
-- Detect console logins without MFA
SELECT eventtime, useridentity.username, sourceipaddress, useridentity.arn
FROM cloudtrail_logs
WHERE eventname = 'ConsoleLogin'
AND additionalEventData LIKE '%"MFAUsed":"No"%'
AND errorcode IS NULL
ORDER BY eventtime DESC;
-- Find IAM privilege escalation attempts
SELECT eventtime, useridentity.arn, eventname, errorcode, sourceipaddress
FROM cloudtrail_logs
WHERE eventname IN (
'CreatePolicyVersion', 'SetDefaultPolicyVersion', 'AttachUserPolicy',
'AttachRolePolicy', 'PutUserPolicy', 'PutRolePolicy',
'CreateAccessKey', 'CreateLoginProfile', 'UpdateLoginProfile',
'PassRole', 'AssumeRole'
)
ORDER BY eventtime DESC
LIMIT 100;
-- Detect CloudTrail tampering
SELECT eventtime, useridentity.arn, eventname, requestparameters, sourceipaddress
FROM cloudtrail_logs
WHERE eventname IN ('StopLogging', 'DeleteTrail', 'UpdateTrail', 'PutEventSelectors')
ORDER BY eventtime DESC;
-- Find API calls from Tor exit nodes or unusual IPs
SELECT eventtime, useridentity.arn, eventname, sourceipaddress, awsregion
FROM cloudtrail_logs
WHERE sourceipaddress NOT LIKE '10.%'
AND sourceipaddress NOT LIKE '172.%'
AND sourceipaddress NOT LIKE '192.168.%'
AND useridentity.type = 'IAMUser'
AND errorcode IS NULL
GROUP BY eventtime, useridentity.arn, eventname, sourceipaddress, awsregion
ORDER BY eventtime DESC
LIMIT 200;
-- Detect unauthorized API calls (AccessDenied patterns)
SELECT useridentity.arn, eventname, COUNT(*) as denied_count
FROM cloudtrail_logs
WHERE errorcode IN ('AccessDenied', 'UnauthorizedAccess', 'Client.UnauthorizedAccess')
AND eventtime > date_format(date_add('day', -7, now()), '%Y-%m-%dT%H:%i:%sZ')
GROUP BY useridentity.arn, eventname
HAVING COUNT(*) > 10
ORDER BY denied_count DESC;
ステップ 4: CloudWatch Logs Insights によるリアルタイム検出の構築
アクティブなセキュリティ監視のためのリアルタイムクエリを作成します。
# Detect root account usage
aws logs start-query \
--log-group-name cloudtrail-org \
--start-time $(date -d "24 hours ago" +%s) \
--end-time $(date +%s) \
--query-string '
fields @timestamp, eventName, sourceIPAddress, userAgent
| filter userIdentity.type = "Root"
| sort @timestamp desc
'
# Detect security group changes
aws logs start-query \
--log-group-name cloudtrail-org \
--start-time $(date -d "24 hours ago" +%s) \
--end-time $(date +%s) \
--query-string '
fields @timestamp, userIdentity.arn, eventName, requestParameters.groupId, sourceIPAddress
| filter eventName in ["AuthorizeSecurityGroupIngress", "AuthorizeSecurityGroupEgress", "RevokeSecurityGroupIngress", "CreateSecurityGroup"]
| sort @timestamp desc
'
# Detect new IAM users or access keys created
aws logs start-query \
--log-group-name cloudtrail-org \
--start-time $(date -d "24 hours ago" +%s) \
--end-time $(date +%s) \
--query-string '
fields @timestamp, userIdentity.arn, eventName, requestParameters.userName, sourceIPAddress
| filter eventName in ["CreateUser", "CreateAccessKey", "CreateLoginProfile"]
| sort @timestamp desc
'
ステップ 5: CloudWatch メトリクスフィルターとアラームの作成
CIS Benchmark の推奨事項に基づき、重大なセキュリティイベントに対する自動アラートを設定します。
# CIS 3.1: Unauthorized API calls alarm
aws logs put-metric-filter \
--log-group-name cloudtrail-org \
--filter-name unauthorized-api-calls \
--filter-pattern '{($.errorCode = "*UnauthorizedAccess") || ($.errorCode = "AccessDenied*")}' \
--metric-transformations '[{"metricName":"UnauthorizedAPICalls","metricNamespace":"CISBenchmark","metricValue":"1"}]'
aws cloudwatch put-metric-alarm \
--alarm-name cis-unauthorized-api-calls \
--metric-name UnauthorizedAPICalls --namespace CISBenchmark \
--statistic Sum --period 300 --threshold 10 \
--comparison-operator GreaterThanThreshold --evaluation-periods 1 \
--alarm-actions arn:aws:sns:us-east-1:ACCOUNT:security-alerts
# CIS 3.3: Root account usage alarm
aws logs put-metric-filter \
--log-group-name cloudtrail-org \
--filter-name root-account-usage \
--filter-pattern '{$.userIdentity.type = "Root" && $.userIdentity.invokedBy NOT EXISTS && $.eventType != "AwsServiceEvent"}' \
--metric-transformations '[{"metricName":"RootAccountUsage","metricNamespace":"CISBenchmark","metricValue":"1"}]'
# CIS 3.4: IAM policy changes alarm
aws logs put-metric-filter \
--log-group-name cloudtrail-org \
--filter-name iam-policy-changes \
--filter-pattern '{($.eventName=CreatePolicy) || ($.eventName=DeletePolicy) || ($.eventName=AttachRolePolicy) || ($.eventName=DetachRolePolicy) || ($.eventName=AttachUserPolicy) || ($.eventName=DetachUserPolicy)}' \
--metric-transformations '[{"metricName":"IAMPolicyChanges","metricNamespace":"CISBenchmark","metricValue":"1"}]'
# CIS 3.5: CloudTrail configuration changes alarm
aws logs put-metric-filter \
--log-group-name cloudtrail-org \
--filter-name cloudtrail-changes \
--filter-pattern '{($.eventName = StopLogging) || ($.eventName = DeleteTrail) || ($.eventName = UpdateTrail)}' \
--metric-transformations '[{"metricName":"CloudTrailChanges","metricNamespace":"CISBenchmark","metricValue":"1"}]'
主要な概念
| 用語 | 定義 |
|---|---|
| CloudTrail | AWS サービスに対して行われた API 呼び出しを記録する AWS サービスであり、ユーザー、ロール、サービスが実行した操作の監査証跡を提供します |
| 管理イベント | リソースの作成、IAM の変更、サービスの構成など、コントロールプレーンの操作に関する CloudTrail イベント |
| データイベント | S3 オブジェクトへのアクセスや Lambda 関数の呼び出しなど、データプレーンの操作に関する CloudTrail イベントで、きめ細かなアクティビティログを提供します |
| ログファイルの検証 | 配信後にログファイルが改ざんされていないことを検証するためのダイジェストファイルを作成する CloudTrail の機能 |
| CloudTrail Lake | Athena テーブルや S3 データを管理することなく SQL ベースのクエリを可能にする、CloudTrail イベント用のマネージドデータレイク |
| 組織の証跡 | AWS Organizations 内のすべてのアカウントの API アクティビティを、中央の S3 バケットに記録する単一の証跡 |
ツールとシステム
- Amazon Athena: S3 に保存された CloudTrail ログを大規模に分析するためのサーバーレス SQL クエリエンジン
- CloudWatch Logs Insights: 過去 30 日間の CloudTrail を対話的に分析するためのリアルタイムログクエリサービス
- CloudTrail Lake: 組み込みの SQL クエリ機能と 7 年間の保持期間を備えたマネージドイベントデータレイク
- Amazon Security Lake: CloudTrail データを OCSF 形式に正規化し、SIEM で利用できるようにする集中型セキュリティデータレイク
- AWS CloudTrail: AWS アカウントおよびサービス全体の API アクティビティをすべて記録するコア監査ログサービス
一般的なシナリオ
シナリオ: CloudTrail を使った IAM 認証情報の侵害の調査
背景: GuardDuty が、開発者のアクセスキーについて UnauthorizedAccess:IAMUser/MaliciousIPCaller のアラートを発報しました。セキュリティチームは、侵害された認証情報によって実行されたすべてのアクションを追跡する必要があります。
手順:
- すべてのリージョンを対象に、侵害された AccessKeyId によるすべてのイベントを CloudTrail で照会する
- API 呼び出しのタイムラインを作成し、攻撃の流れを把握する
- 初期侵入の起点を特定する(悪意のある IP から、そのキーが最初に使用された時点)
- 攻撃者によって作成、変更、またはアクセスされたすべてのリソースを洗い出す
- 永続化の仕組みを確認する(新しいユーザー、アクセスキー、Lambda 関数、EC2 インスタンスなど)
- CloudTrail が改ざんされていないことを確認する(StopLogging や UpdateTrail のイベントを確認する)
- インシデント対応レポートのために、攻撃の全体像と影響範囲を文書化する
注意点: CloudTrail のイベントが S3 や CloudWatch Logs に表示されるまでに最大 15 分かかる場合があります。アクティブなインシデントの最中にリアルタイムで状況を把握する必要がある場合は、S3 に対する Athena クエリではなく、CloudTrail Lake または CloudWatch Logs Insights を使用してください。リージョンをまたぐ攻撃では、Athena で複数のリージョンのパーティションに対してクエリを実行する必要があります。
出力形式
CloudTrail Security Analysis Report
======================================
Account: 123456789012
Analysis Period: 2026-02-16 to 2026-02-23
Trail: org-security-trail (organization-wide)
SECURITY EVENTS DETECTED:
Root account logins: 2
Console logins without MFA: 7
Privilege escalation attempts: 12
CloudTrail configuration changes: 0
Security group modifications: 34
Unauthorized API calls: 156
HIGH-PRIORITY FINDINGS:
[CT-001] Console Login Without MFA
User: admin-user
Time: 2026-02-22T14:30:00Z
IP: 203.0.113.50
Action Required: Enforce MFA via IAM policy
[CT-002] IAM Privilege Escalation
User: dev-user
Time: 2026-02-23T03:15:00Z
Events: CreatePolicyVersion -> AttachRolePolicy
IP: 185.x.x.x (suspicious)
Action Required: Investigate credential compromise
ALERTING STATUS:
CIS metric filters configured: 14 / 14
CloudWatch alarms active: 14 / 14
Alerts fired (last 7 days): 8