目次
1. 全体の考え方(クラウド特有の観点)
- クラウドでは「API呼び出し」が多くの操作ログの源泉(例:AWS CloudTrail、Azure Activity Log)。APIログが第一の観測点。
- ネットワークは仮想化されているため VPC Flow / NSG Flow / ALBアクセスログ 等がネットワーク挙動の把握に役立つ。
- アイデンティティ(IAM / Azure AD)が支配的:認証・権限の乱用が主要な侵入経路になる。
- ログは分散(各サービスごと)なので、CloudTrail / CloudWatch / GuardDuty(AWS)/Azure Monitor / Defender / Sentinel(Azure) の相関が必要。
2. 代表的な攻撃シナリオと検知ポイント
シナリオA:盗まれたAPIキー/長期認証情報による不正操作(横展開・暗号化・課金悪用)
攻撃の流れ:漏洩したアクセスキーでAPIを呼び、インスタンス作成・スナップショット作成・データ転送や外部S3へデータアップロード/外部サーバへ転送。
見るログ
- AWS: CloudTrail(CreateInstance、RunInstances、CreateAccessKey、PutObject、CreateSnapshot、Ec2:RunInstances等)/VPC Flow Logs(外向きの大量トラフィック)/S3 Access Logs/GuardDuty Findings(異常なAPI呼び出し、異常な認証位置)
- Azure: Azure Active Directory サインインログ(新規アプリ・トークン利用)、Activity Log(VM作成、Storageアクセス)、NSG flow logs、Azure Defenderのアラート
サンプルCloudTrail抜粋
eventTime: 2025-10-01T12:05:30Z
eventName: CreateAccessKey
userIdentity: arn:aws:iam::123456789012:user/deploy-bot
sourceIPAddress: 203.0.113.5
userAgent: aws-cli/2.0
検知のヒント
- 通常動かない時間帯の大量API呼び出し
- 突然の
CreateAccessKey
/ConsoleLogin
from unknown IP - 同一キーで複数リージョンのリソースが短時間に作られる
初動 - 対象アクセスキーを無効化、関連IAMユーザーのログイン資格をロック/パスワード・キーのローテーション
- GuardDuty/DefenderのFinding IDを根拠に横展開調査(S3 PUT、EC2起動等)
予防 - 短期キーは利用しない(短期トークン・AssumeRole推奨)、キーの最小権限化、キー使用のアノマリ検知
シナリオB:公開S3/Blob によるデータ漏洩(設定ミス)
攻撃の流れ:バケット/コンテナがパブリックになっており、攻撃者がデータをダウンロードまたは改竄。
見るログ
- AWS: S3 Access Logs / CloudTrail
GetObject
/PutBucketPolicy
イベント / AWS Config (public bucket checks) - Azure: Storage Analytics / Activity Log for role assignments & container ACL changes / Azure Policy データ
サンプルS3アクセスログ
2025-10-02T03:22:10Z my-bucket [GET] 198.51.100.77 /sensitive/report.csv
検知のヒント
- 突然の大量の
GetObject
リクエスト、または海外IPからのリクエスト増加 PutBucketPolicy
/PutBucketAcl
イベントで公開レベル変更が行われたログ
初動- バケットのアクセス設定を即時「private」に変更、ログを保全
- ダウンロード元IPや時間帯を調査、漏えい範囲の特定と通知
予防 - バケット公開の自動検出(AWS Config / Azure Policy)、公開禁止ポリシー、SSE・アクセスログの有効化
シナリオC:権限昇格(IAMポリシーの付与、不適切なロールチェーン)
攻撃の流れ:既存アカウントが権限付与を悪用して管理者権限を獲得し、横展開や復号鍵へのアクセスを行う。
見るログ
- CloudTrail
PutRolePolicy
/AttachUserPolicy
/UpdateAssumeRolePolicy
- Azure Activity Log の RoleAssignment / RoleDefinition変更
サンプルCloudTrail
eventName: AttachUserPolicy
userIdentity: arn:aws:iam::123456789012:user/dev1
requestParameters: policyArn: arn:aws:iam::aws:policy/AdministratorAccess
検知のヒント
- 普段権限付与しないユーザーによる
AttachUserPolicy
、または短時間に複数のポリシー変更
初動 - 変更のロールバック、関係ユーザーの資格情報無効化、関連操作(ログイン・リソース作成)の横展開調査
予防 - IAM変更には承認・ワークフロー、CloudTrailに対する整合的アラート、IAM Access Analyzer
シナリオD:コンテナ/クラウドネイティブ環境の侵害(Kubernetes / AKS / EKS)
攻撃の流れ:コンテナイメージに脆弱性があり乗っ取り/イメージレジストリからの機密情報取り出し/クラスタ内ネットワーク横展開。
見るログ
- Kubernetes Audit Logs(API Serverへの不審なリクエスト)
- Container registry access logs(pull/push)
- Podネットワーク通信(VPC Flow / NSG flow)
検知のヒント - 予期しない
kubectl exec
、ServiceAccountトークンの不審利用、イメージpullの増加
初動 - Pod隔離、ServiceAccountトークンローテーション、レジストリのアクセス制御
予防 - イメージスキャン(CVE検出)、最小権限のServiceAccount、ネットワークポリシー
シナリオE:クラウドアカウントの不正なサードパーティ連携(OAuth / Service Principal悪用)
攻撃の流れ:悪意ある外部アプリやサービスが権限を得てデータ読み出し・書き込みを行う。
見るログ
- Azure AD Sign-in / Enterprise Application consent logs(新しい同意、AppRole割当)
- AWSでの外部IDプロバイダログ(AssumeRoleWithWebIdentity)
検知のヒント - 突然の新規アプリ同意、特権権限を要求するアプリの作成・同意
初動 - 該当アプリの同意取り消し、トークン無効化、詳細アクセスログで横展開確認
予防 - 同意式アプリの管理ポリシー、ユーザー同意制限、OAuth監査
3. 具体的なログ断片(サンプル)と読み方
A. AWS CloudTrail — EC2 作成(疑わしい)
{
"eventTime": "2025-10-01T12:10:45Z",
"eventName": "RunInstances",
"userIdentity": {
"type": "IAMUser",
"arn": "arn:aws:iam::123456789012:user/deploy-bot",
"principalId": "AID...DEP"
},
"sourceIPAddress": "198.51.100.77",
"requestParameters": {
"imageId": "ami-0abcd1234",
"minCount": 1,
"maxCount": 1
}
}
→ 見るべきは userIdentity
(誰が呼んだか)、sourceIPAddress
(見慣れないIPか)、eventTime
(通常の作業時間外か)。
B. Azure AD サインインログ — Impossible Travel の例
{
"time": "2025-10-02T03:05:22Z",
"userPrincipalName": "j.sato@contoso.com",
"ipAddress": "203.0.113.99",
"location": "Moscow, RU",
"conditionalAccessStatus": "success",
"deviceDetail": {"isCompliant": false}
}
→ 同一ユーザーの過去ログと照合してImpossible Travelを検出。deviceDetail
やconditionalAccessStatus
は対応のヒント。
4. SIEM / Sentinel の概念的クエリ例(学習用)
実装するSIEMに合わせて構文は変える。以下は概念→KQL風例。
- CloudTrailで短時間に複数リージョンでのRunInstancesを検出
CloudTrail
| where EventName == "RunInstances"
| summarize cnt = count(), regions = make_set(AwsRegion) by UserIdentity_PrincipalId, bin(TimeGenerated, 1h)
| where cnt > 3 and array_length(regions) > 1
- S3への外部大量ダウンロード検出(短時間で大量GetObject)
S3AccessLogs
| summarize downloads = count() by BucketName, SrcIP, bin(TimeGenerated, 10m)
| where downloads > 100
- Azure AD:Impossible Travel 検出(概念)
SigninLogs
| where TimeGenerated > ago(1d)
| summarize by UserPrincipalName, Location, bin(TimeGenerated, 1h)
| join kind=inner (SigninLogs | where TimeGenerated > ago(1d)) on UserPrincipalName
| where Location != Location1 and abs(datetime_diff("minute", TimeGenerated, TimeGenerated1)) < 60
5. 初動(トリアージ)チェックリスト(テンプレ)
- 事象の分類:API操作か、認証か、データアクセスか
- 影響範囲:関係リソース(S3バケット、VM、Service Principal)を列挙
- 証拠保全:CloudTrail / Activity Log / Storage access logs をエクスポート(アーカイブ)
- 即時封じ込め:該当APIキー無効化、バケットのACL変更、VM隔離、アカウントロック
- 横展開調査:同一IP/同一キー/同一UserAgentで他操作が無いか検索
6. 防御(改善)策まとめ
- ログの有効化 & 長期保存:CloudTrail, Storage Access Logs, VPC Flow, Azure Activity を有効にし、SIEMに送る
- 検知ルールの整備:CreateAccessKey、ConsoleLogin from anomalous IP、大量GetObject等を監視
- 最小権限の原則:IAMロールとポリシーを最小化、AssumeRoleの使用で短期認証を推奨
- MFA・条件付きアクセス:管理操作やコンソールログインはMFA必須、条件付きアクセスでリスクベース制御
- 自動化(SOAR):高信頼度の検知なら自動でキー無効化・リソース隔離を行うプレイブック
- 定期的なセキュリティレビュー:公開ストレージ検出、自動検査(AWS Config / Azure Policy)
- 脆弱性管理 & イメージスキャン:コンテナやイメージはCI/CD段階でスキャン
7. 学習用演習(短い)
- CloudTrailログで
CreateAccessKey
を見つけたら、次にどのログを調べる?(→ ConsoleLogin, RunInstances, S3 PutObject) - S3 Access Logs で短時間に外部IPから多数
GetObject
が発生。優先度の高い初動は?(→ バケットをprivate化・ログ保全・ダウンロード元IPの特定) - Azure ADでImpossible Travelを見つけたら何を無効化する?(→ 該当セッション・アクセストークン・パスワードリセット・MFA再適用)
8. まとめ(学習ポイント)
- クラウド監視の本質は「APIとアイデンティティの監視」。まず CloudTrail / Activity Log / AD Sign-in を見に行けること。
- ログは分散しているので横断的相関が鍵(SIEMでの相関検知が重要)。
- 最初の兆候(不審なAPI呼び出し・異常な認証・短命ドメインへのトラフィック・大量のオブジェクト取得)を見つけたら即時封じ込め→調査の流れを踏む。
- 事前の防御(最小権限、MFA、公開ストレージの制御、監査ログの有効化)が被害軽減に直結する。
コメント