detecting-s3-data-exfiltration-attempts について
ログ分析、脅威検知結果の確認、検知ルールの構築を通じて、S3 からのデータ流出の疑いを調査するセキュリティスキルです。流出の防止やデータ分類ではなく、検知と調査を扱います。
主な機能
- 01CloudTrail の S3 アクセスログ分析
- 02GuardDuty の S3 検知結果の確認
- 03Macie の機密データ検知結果との相関
- 04リアルタイム検知ルールの構築
活用シーン
- 01不審な送信元からの一括ダウンロード調査
- 02アクセスされた機密オブジェクトのリスク評価
- 03S3 データ損失の検知構築
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill detecting-s3-data-exfiltration-attemptsインストール後、Claude Code で/detecting-s3-data-exfiltration-attemptsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEreferences/api-reference.mdscripts/agent.py詳細
S3 のデータ持ち出しの試みを検出する
使用するタイミング
- GuardDuty が、見慣れない IP アドレスからの一括ダウンロードなど、異常な S3 アクセスパターンを検出した場合
- S3 に保存された機密データが関係するデータ侵害の疑いを調査する場合
- S3 のデータ損失防止を監視するための検出ルールを構築する場合
- 機密データへのアクセスや移動に関する Macie のアラートに対応する場合
- コンプライアンス要件により、機密データストアへのすべてのアクセスの監視と記録が必要な場合
使用しないでください。データの持ち出しを防止する場合(S3 バケットポリシー、VPC エンドポイント、SCP を使用してください)、データを分類する場合(Amazon Macie の検出ジョブを使用してください)、またはネットワークレベルでデータの持ち出しを検出する場合(ネットワーク分析ツールと VPC Flow Logs を使用してください)。
前提条件
- CloudTrail で S3 データイベントのログ記録(
GetObject、PutObject、CopyObject)が設定されていること - S3 Protection 機能を有効にした GuardDuty が有効になっていること
- 対象バケット内の機密データを検出するために Amazon Macie が有効になっていること
- 大規模な CloudTrail ログのクエリに CloudWatch Logs または Athena を使用できること
- S3 アクセスの監視に向けて VPC エンドポイントポリシーが設定されていること
ワークフロー
ステップ 1:CloudTrail で S3 データイベントのログ記録を有効にする
フォレンジック分析のため、すべての S3 オブジェクトレベルの操作を記録するように CloudTrail を設定します。
# Enable S3 data events on an existing trail
aws cloudtrail put-event-selectors \
--trail-name management-trail \
--event-selectors '[{
"ReadWriteType": "All",
"IncludeManagementEvents": true,
"DataResources": [{
"Type": "AWS::S3::Object",
"Values": ["arn:aws:s3:::sensitive-data-bucket/", "arn:aws:s3:::customer-records/"]
}]
}]'
# Verify data event configuration
aws cloudtrail get-event-selectors --trail-name management-trail \
--query 'EventSelectors[*].DataResources' --output json
# Enable GuardDuty S3 Protection
aws guardduty update-detector \
--detector-id $(aws guardduty list-detectors --query 'DetectorIds[0]' --output text) \
--data-sources '{"S3Logs":{"Enable":true}}'
ステップ 2:CloudTrail で異常な S3 アクセスパターンをクエリする
CloudTrail ログを分析し、一括ダウンロードのアクティビティ、通常と異なるアクセス時間、見慣れない送信元 IP アドレスを調べます。
# Athena query: Top S3 downloaders by volume in last 24 hours
cat << 'EOF'
SELECT
useridentity.arn as principal,
sourceipaddress,
COUNT(*) as request_count,
SUM(CAST(json_extract_scalar(requestparameters, '$.bytesTransferredOut') AS bigint)) as bytes_downloaded
FROM cloudtrail_logs
WHERE eventname = 'GetObject'
AND eventsource = 's3.amazonaws.com'
AND eventtime > date_add('hour', -24, now())
GROUP BY useridentity.arn, sourceipaddress
ORDER BY request_count DESC
LIMIT 50
EOF
# CloudWatch Logs Insights: S3 GetObject requests from unusual IPs
aws logs start-query \
--log-group-name cloudtrail-logs \
--start-time $(date -d "24 hours ago" +%s) \
--end-time $(date +%s) \
--query-string '
fields @timestamp, userIdentity.arn, sourceIPAddress, requestParameters.bucketName, requestParameters.key
| filter eventName = "GetObject"
| stats count() as requestCount by sourceIPAddress, userIdentity.arn
| sort requestCount desc
| limit 25
'
# Detect cross-account copies (potential exfiltration)
aws logs start-query \
--log-group-name cloudtrail-logs \
--start-time $(date -d "7 days ago" +%s) \
--end-time $(date +%s) \
--query-string '
fields @timestamp, userIdentity.arn, sourceIPAddress, requestParameters.bucketName
| filter eventName in ["CopyObject", "ReplicateObject", "UploadPart"]
| filter userIdentity.accountId != "OUR_ACCOUNT_ID"
| sort @timestamp desc
| limit 100
'
ステップ 3:GuardDuty の S3 検出結果を確認する
データ持ち出しのアクティビティを示す、GuardDuty の S3 固有の検出結果タイプを確認します。
# List active S3 exfiltration-related findings
aws guardduty list-findings \
--detector-id $(aws guardduty list-detectors --query 'DetectorIds[0]' --output text) \
--finding-criteria '{
"Criterion": {
"type": {
"Eq": [
"Exfiltration:S3/MaliciousIPCaller",
"Exfiltration:S3/ObjectRead.Unusual",
"Discovery:S3/MaliciousIPCaller.Custom",
"Discovery:S3/BucketEnumeration.Unusual",
"UnauthorizedAccess:S3/MaliciousIPCaller.Custom",
"UnauthorizedAccess:S3/TorIPCaller",
"Impact:S3/AnomalousBehavior.Delete"
]
}
}
}' --output json
# Get detailed finding information
aws guardduty get-findings \
--detector-id $(aws guardduty list-detectors --query 'DetectorIds[0]' --output text) \
--finding-ids FINDING_IDS \
--query 'Findings[*].{Type:Type,Severity:Severity,Resource:Resource.S3BucketDetails[0].Name,Action:Service.Action}' \
--output table
ステップ 4:機密データへのアクセスに関する Macie の検出結果を分析する
Macie の検出結果を確認し、データの機密性とアクセスの異常を関連付けます。
# List Macie findings for sensitive data exposure
aws macie2 list-findings \
--finding-criteria '{
"criterion": {
"category": {"eq": ["CLASSIFICATION"]},
"severity.description": {"eq": ["High", "Critical"]}
}
}' \
--sort-criteria '{"attributeName": "updatedAt", "orderBy": "DESC"}' \
--max-results 25
# Get detailed finding with data classification
aws macie2 get-findings \
--finding-ids FINDING_IDS \
--query 'findings[*].{Type:type,Severity:severity.description,Bucket:resourcesAffected.s3Bucket.name,SensitiveDataTypes:classificationDetails.result.sensitiveData[*].category}' \
--output table
# Run a sensitive data discovery job on target bucket
aws macie2 create-classification-job \
--job-type ONE_TIME \
--name "exfiltration-investigation" \
--s3-job-definition '{
"bucketDefinitions": [{
"accountId": "ACCOUNT_ID",
"buckets": ["sensitive-data-bucket"]
}]
}'
ステップ 5:自動検出ルールを構築する
リアルタイムでデータの持ち出しを検出するため、CloudWatch アラームと EventBridge ルールを作成します。
# CloudWatch metric filter for high-volume S3 downloads
aws logs put-metric-filter \
--log-group-name cloudtrail-logs \
--filter-name s3-bulk-download \
--filter-pattern '{$.eventName = "GetObject" && $.eventSource = "s3.amazonaws.com"}' \
--metric-transformations '[{
"metricName": "S3GetObjectCount",
"metricNamespace": "SecurityMetrics",
"metricValue": "1",
"defaultValue": 0
}]'
# Alarm for anomalous download volume (>1000 objects/hour)
aws cloudwatch put-metric-alarm \
--alarm-name s3-exfiltration-alert \
--metric-name S3GetObjectCount \
--namespace SecurityMetrics \
--statistic Sum \
--period 3600 \
--threshold 1000 \
--comparison-operator GreaterThanThreshold \
--evaluation-periods 1 \
--alarm-actions arn:aws:sns:us-east-1:ACCOUNT:security-alerts
# EventBridge rule for GuardDuty S3 findings
aws events put-rule \
--name guardduty-s3-exfiltration \
--event-pattern '{
"source": ["aws.guardduty"],
"detail-type": ["GuardDuty Finding"],
"detail": {
"type": [{"prefix": "Exfiltration:S3/"}]
}
}'
ステップ 6:予防的コントロールを実装する
データの移動経路を制限するため、バケットポリシーと VPC エンドポイントポリシーをデプロイします。
# VPC endpoint policy restricting S3 access to specific buckets
aws ec2 modify-vpc-endpoint \
--vpc-endpoint-id vpce-ENDPOINT_ID \
--policy-document '{
"Statement": [{
"Sid": "RestrictToOwnBuckets",
"Effect": "Allow",
"Principal": "*",
"Action": ["s3:GetObject", "s3:PutObject"],
"Resource": ["arn:aws:s3:::approved-bucket-1/*", "arn:aws:s3:::approved-bucket-2/*"]
}]
}'
# Bucket policy denying access from outside the VPC
aws s3api put-bucket-policy --bucket sensitive-data-bucket --policy '{
"Version": "2012-10-17",
"Statement": [{
"Sid": "DenyNonVpcAccess",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::sensitive-data-bucket/*",
"Condition": {
"StringNotEquals": {
"aws:sourceVpce": "vpce-ENDPOINT_ID"
}
}
}]
}'
主な概念
| 用語 | 定義 |
|---|---|
| S3 データイベント | リクエストの詳細とともに、GetObject、PutObject、DeleteObject、CopyObject の API 呼び出しを記録する、CloudTrail のオブジェクトレベルのログ |
| GuardDuty S3 Protection | CloudTrail の S3 データイベントを分析し、異常なアクセスパターンやデータ持ち出しの試みを特定する脅威検出機能 |
| Amazon Macie | S3 内の機密データを検出・分類し、データ漏えいリスクに関する検出結果を生成するデータセキュリティサービス |
| VPC エンドポイントポリシー | S3 VPC エンドポイントを介してアクセスできるバケットとアクションを制限するアクセス制御ポリシー |
| データの持ち出し | 攻撃者が制御する外部の場所に、組織の S3 ストレージからデータを不正に転送すること |
| 異常な動作の検出 | プリンシパルについて確立されたベースラインから逸脱する S3 アクセスパターンを、機械学習に基づいて特定すること |
ツールとシステム
- AWS CloudTrail:フォレンジック分析と異常検出のために、S3 のオブジェクトレベルの操作を監査ログに記録します
- Amazon GuardDuty:データ持ち出しや不正アクセスに関する S3 固有の検出結果タイプを備えた、機械学習ベースの脅威検出サービスです
- Amazon Macie:機密データの検出と分類を行い、アクセスの異常とデータの機密性を関連付けます
- Amazon Athena:大規模な CloudTrail ログを分析し、一括ダウンロードのパターンを特定する SQL クエリエンジンです
- CloudWatch Logs Insights:CloudTrail データを対象にした検出クエリを構築できる、リアルタイムのログ分析ツールです
一般的なシナリオ
シナリオ:侵害された IAM 認証情報を使用した S3 データの一括ダウンロード
コンテキスト:GuardDuty が Exfiltration:S3/ObjectRead.Unusual の検出結果を報告しました。この結果は、開発者のアクセスキーが、午前 3 時に外国の IP アドレスから機密データバケット内の数千個のオブジェクトをダウンロードしていることを示しています。
アプローチ:
- 侵害されたアクセスキーを直ちに無効化します
- 過去 72 時間に侵害されたプリンシパルが実行したすべての S3 アクションについて、CloudTrail をクエリします
- Athena のクエリを使用して、アクセスされたバケットとオブジェクトを特定します
- アクセスされたオブジェクトと Macie の分類結果を照合し、データの機密性を評価します
- 外部アカウントへの CopyObject 呼び出し(アカウント間のデータ流出)がないか確認します
- 認証情報がどのように侵害されたかを調査します(TruffleHog スキャン、フィッシング調査)
- VPC エンドポイントポリシーを実装し、今後の S3 アクセスを承認済みのネットワーク経路に制限します
注意点:CloudTrail の S3 データイベントは、膨大な量のログを生成する可能性があります。24 時間を超える期間を対象とするクエリでは、CloudWatch Logs Insights ではなく、パーティション分割されたテーブルと Athena を使用してください。GuardDuty のベースライン学習には 7~14 日かかるため、新しいアカウントでは通常のアクセスパターンが誤検出されることがあります。
出力形式
S3 Data Exfiltration Investigation Report
============================================
Account: 123456789012
Detection Source: GuardDuty Exfiltration:S3/ObjectRead.Unusual
Investigation Date: 2026-02-23
INCIDENT TIMELINE:
2026-02-23 02:47 UTC - First anomalous GetObject from 185.x.x.x
2026-02-23 02:47-04:12 UTC - 12,847 GetObject requests
2026-02-23 04:15 UTC - GuardDuty finding generated
2026-02-23 04:20 UTC - PagerDuty alert received by SOC
2026-02-23 04:25 UTC - Access key deactivated
COMPROMISED PRINCIPAL:
ARN: arn:aws:iam::123456789012:user/developer-jane
Access Key: AKIA...WXYZ
Source IP: 185.x.x.x (Tor exit node)
DATA IMPACT ASSESSMENT:
Buckets accessed: 3
Objects downloaded: 12,847
Total data volume: 4.7 GB
Sensitive data types: PII (SSN, email), Financial (credit card)
Macie severity: CRITICAL
CONTAINMENT ACTIONS:
[x] Access key deactivated
[x] User password reset and MFA re-enrolled
[x] VPC endpoint policy applied to sensitive buckets
[x] Bucket policy restricting to VPC-only access
[x] TruffleHog scan initiated on developer repositories