横断 / 全セクション
🎯 Deep Dive
事故ケース集
セキュリティインシデント事例集
サービス別の典型事故と再発防止
実運用で繰り返し発生する典型インシデントを 原因 → 影響 → 検知 → 復旧 → 予防の構造で深掘り。「同じ落とし穴を踏まない」ためのナレッジベースとして PCSE 設計判断の補強に。
0. Severity / 対応 SLA 早見表
Severity の判断軸を統一しておくと、インシデント発生時のエスカレーション判断が高速化する。
| Severity | 定義 | 初動 SLA | 例 |
| SEV1 | 全社業務停止 / 大量データ漏洩 / 不可逆破壊 | 15 分以内 | 全プロジェクト Owner 喪失、PHI 大量流出 |
| SEV2 | 主要サービス停止 / 限定範囲の漏洩 | 30 分以内 | 本番 BigQuery クエリ全停止、特定バケット公開 |
| SEV3 | 部分機能の劣化 / 軽微な設定逸脱 | 2 時間以内 | 監査ログ取り込み遅延、SHA Finding High |
| SEV4 | 軽微な逸脱 / 改善要望 | 営業日内 | 未使用 IAM Role 検出、ローテーション通知 |
A. IAM / Identity の事故
CASE A-01
SEV1
IAM
組織管理者ロールを誤って外部ドメインに付与し、外部からプロジェクト乗っ取り
シナリオの再現
運用エンジニアが Terraform で IAM Binding を追加する際、メールアドレスをタイプミス(admin@oursomain.com → 偶然外部実在ドメイン)。許可ドメイン制約がなかったため適用成功。
タイムライン
T+8分
外部からログインに成功(Cloud Audit Log google.cloud.audit.AuditLog)
T+27分
外部から組織ポリシー変更を試行 → Deny ポリシー(残存)で一部ブロック
T+34分
SCC ETD 「Brute force / Impossible travel」検知 → PagerDuty
T+48分
SOC が break-glass Super Admin で対象アカウントを削除
T+90分
影響範囲調査完了、外部ドメインの全 Binding を一括削除
復旧手順
- 封じ込め break-glass Super Admin で対象プリンシパルの全 Binding 削除(
gcloud projects remove-iam-policy-binding ... --member=user:bad@external.com を組織横断)
- 影響評価 Cloud Asset Inventory で対象プリンシパルのアクセス履歴を全期間分検索(
iamSearchAllIamPolicies)
- 追跡 Aggregated Sink → BigQuery で当該プリンシパルの全 API 呼び出しをタイムライン化
- 根本対策 組織ポリシー
iam.allowedPolicyMemberDomains を Enforce、Terraform に policy_validator を入れる
予防策(再発防止)
- 組織ポリシー
iam.allowedPolicyMemberDomains を すべての組織・フォルダで Enforce
- Terraform に policy-as-code(Open Policy Agent / Sentinel)で「許可ドメイン以外の binding を CI で reject」
SetIamPolicy Audit Log を即時 SIEM 連携、Slack へリアルタイム通知
- Super Admin に対し SCC Event Threat Detection の異常検知(impossible travel)を Premium Tier で有効化
5 Whys
- なぜ外部ドメインに付与できた? → 組織ポリシーで制限していなかった
- なぜ制限していなかった? → 過去の M&A で例外プロジェクトがあり、未整理
- なぜ未整理だった? → 統合プロジェクトの責任者不在
- なぜ責任者不在? → セキュリティ運用が Platform チームに完全移管されていなかった
- なぜ移管されていなかった? → セキュリティ運用のオーナーシップ移管プロセスが未定義 = 真因
CASE A-02
SEV2
IAM
退職者の Cloud Identity アカウントを 3 ヶ月放置 → SA 鍵経由でデータアクセス
予防策
- HR システム → Cloud Identity の自動 SCIM プロビジョニング(OneLogin / Okta / Azure AD)
- 退職トリガで 即時アカウント suspend + 所有していた SA 鍵を全 revoke
- SA 鍵の保有者を Cloud Asset Inventory で定期棚卸し
- そもそも SA 鍵を使わない方針(Workload Identity Federation)
CASE A-03
SEV2
IAP / SSO
IdP の SAML 署名証明書ローテーションを見落とし、全社員ログイン不能
復旧
Super Admin(SSO 適用外)で SAML 設定に新証明書を差し込み復旧。Super Admin が SSO 例外でなかったらロックアウトしていた。
予防策
- IdP 証明書の有効期限を Cloud Monitoring カスタムメトリックで監視、30 / 14 / 7 日前に通知
- IdP の鍵を 2 つ同時並行(dual key)で運用し、無停止でローテーション
- Super Admin は SSO 適用外、緊急時の break-glass 手順書を四半期演習
B. サービスアカウント の事故
CASE B-01
SEV1
SA Key
SA 鍵が GitHub Public リポジトリに誤コミット → 数分で暗号通貨マイナー展開
タイムライン
T+0
GitHub Public に SA 鍵を含む commit が push される
T+2分
攻撃者 bot が GitHub TruffleHog スキャンで検知
T+5分
SA トークンで GCE インスタンスを作成(gigantic マシンタイプ)
T+8分
4 リージョンに展開、XMRig マイナー稼働開始
T+14分
VM Threat Detectionがマイナー検出 → SCC Finding
T+16分
PagerDuty → SOC、対象 SA を即時 disable
T+22分
全マイナー VM を削除、Pub/Sub Sink で監査ログ確認
T+90分
Google サポートに課金免除を申請(後日認められた)
復旧手順
- 封じ込め 漏洩 SA を
gcloud iam service-accounts disable で即時無効化
- SA 鍵の全削除 該当 SA の鍵を全 list → 全 delete
- SA トークンの即時失効
gcloud iam service-accounts keys revoke + 既発行トークンの待機期間が問題なら SA を削除
- VM の一括削除 Cloud Asset Inventory で対象 SA 起動の VM を抽出 → 一括削除
- 請求書対応 Google サポートにインシデント詳細を提示し課金調整を申請
予防策
- そもそも SA 鍵を発行しない:組織ポリシー
iam.disableServiceAccountKeyCreation
- CI/CD は Workload Identity Federation(GitHub OIDC)
- GitHub Advanced Security の Secret Scanning + Push Protection
- クォータで VM の最大 vCPU 数を組織レベルで制限(Cloud Quotas)
- SCC Premium の VM Threat Detection を組織全体で有効化
CASE B-02
SEV2
Workload Identity
Workload Identity Federation の attribute-condition 未指定で全リポジトリが本番 SA を借りられる状態
復旧
- WIF Provider を
--attribute-condition で repository / ref を絞り更新
- SA の
workloadIdentityUser binding を principalSet://...attribute.repository/特定REPO に限定
- STS Audit Log を全期間検索し、想定外の impersonate が無いか確認
予防策
- WIF Provider 作成は Terraform module 化し、attribute-condition を必須引数に
- SHA カスタムモジュールで「attribute-condition が空の Provider」を検出し SEV2 通知
CASE B-03
SEV3
Default SA
既定 Compute SA の Editor 権限経由で開発 VM が本番 GCS を上書き
復旧
Object Versioning が有効だったため、前バージョンに rollback。Versioning 無しなら不可逆だった。
予防策
- 組織ポリシー
iam.automaticIamGrantsForDefaultServiceAccounts Deny
- 本番 GCS は Object Versioning + Object Lifecycle(古いバージョン 30 日保持)
- 本番リソースへのアクセスは 環境分離プロジェクト+VPC SC でクロスプロジェクト egress 禁止
C. VPC Service Controls の事故
CASE C-01
SEV2
VPC SC
VPC SC 境界を Enforce した瞬間、Cloud Build / Dataflow パイプラインが全停止
復旧
- 境界を一時 Dry Run に変更(影響復旧優先)
- Policy Denied Audit Log を抽出し、必要な Ingress / Egress Rule をリスト化
- Ingress Rule(Cloud Build SA / Dataflow worker SA)を追加
- 再度 Enforce に切替、回復確認
予防策
- VPC SC は 必ず Dry Run 4 週間で違反候補を洗い出してから Enforce
- 典型サービス(Cloud Build / Dataflow / Composer / Vertex AI Training)の Ingress Rule テンプレを保有
- 境界変更前後で
dryRunPolicy を一時保持し、ロールバック容易に
- 変更は CI/CD の Change Window 内のみ、24/7 デプロイ禁止
CASE C-02
SEV3
VPC SC
Egress Rule で開発者の業務サイト(GitHub)への aiplatform アクセスを誤許可
予防策
- Ingress / Egress Rule は identities / operations を必ず限定
- 境界 YAML を peer review必須、CODEOWNERS に SOC を入れる
- VPC SC ポリシーは月次でレビュー(Policy Recommender + 手動)
D. Network / Firewall の事故
CASE D-01
SEV1
VPC Firewall
誤って 0.0.0.0/0 で SSH(22) を許可、ボットネット侵入で内部偵察
予防策
- Hierarchical Firewall Policyで組織レベル「外部 SSH/RDP Deny」を強制(プロジェクト個別ルールで上書き不可)
- OS Login + 2FA を組織ポリシーで強制
- 運用上のアクセスは IAP TCP Forwarding 経由のみ
- SHA Finding
OPEN_FIREWALL を SEV1 アラート(Cloud Functions で自動 close)
CASE D-02
SEV2
Cloud NAT
Cloud NAT ポート枯渇で出力トラフィックの一部断続的に失敗
復旧
- Cloud NAT に外部 IP を 3 つ追加
- Dynamic port allocation 有効化
- 該当外部 API への接続を PSC for Google APIsに切替(プライベート消費)
予防策
port_usage_factor を 70% でアラート
- 大量 egress には PSC / 内部 LB / Cloud Run の sidecar pattern 検討
- NAT Logs + VPC Flow Logs で集約宛先を可視化
CASE D-03
SEV2
Cloud Armor
Cloud Armor の WAF プリセットを Enforce 直後、正規 API クライアントを誤検知ブロック
予防策
- WAF プリセットは必ず
preview: true で 1 週間運用し、誤検知率を計測
- 正規クライアントの IP を allow ルール(優先度低)で先に許可
- 段階的に Sensitivity を上げる(1 → 2 → 3)
E. Cloud KMS / EKM の事故
CASE E-01
SEV1
CMEK
本番 CMEK 鍵を誤って destroy → BigQuery テーブル復号不能
復旧
destroy は 30 日の grace period。gcloud kms keys versions restoreで即時復元成功。
予防策
- 本番鍵に IAM Deny ポリシーで
cloudkms.cryptoKeyVersions.destroy を運用者から禁止
- Cloud Asset Inventory で「この鍵で暗号化されたリソース」を可視化(Terraform plan で表示)
- 鍵 destroy / restore を SEV1 アラート対象
- 誤って 30 日経過した場合に備え、過去データの cold backup(別鍵で暗号化)を別バケット保持
CASE E-02
SEV1
EKM
外部 KMS の障害で GCP 上の暗号化データが全停止(カスケード障害)
予防策
- 外部 KMS の SLA を 99.99% 以上で契約、二拠点冗長
- EKM via VPC(プライベート経路)でネットワーク要因を排除
- 外部 KMS 障害シミュレーションを四半期演習
- 非クリティカルなデータは EKM ではなく Cloud HSM(GCP 内)に分離
CASE E-03
SEV2
CMEK
サービスエージェントへの cryptoKeyEncrypterDecrypter 付与忘れで BigQuery テーブル作成失敗
予防策
- CMEK 鍵作成 Terraform module に サービスエージェントへの自動 bindingを含める
- CMEK 対応サービスごとに必要な service agent をドキュメント化
F. Sensitive Data Protection の事故
CASE F-01
SEV2
SDP / Cloud DLP
Discovery を全データセットに無自覚で走らせ、月次課金が $15,000 超過
予防策
- Discovery は scope を機微対象データセットに限定
- サンプリング率を低めに設定(最初は 0.1%)
- SDP の API 使用量
dlp.googleapis.com/quota/processed_bytes を Cloud Monitoring で日次監視
- 大規模スキャンは 事前見積もりを Pricing Calculator で実施
CASE F-02
SEV2
SDP
De-identify に使う KMS 鍵を destroy し、過去のトークン再識別不能に
予防策
- SDP 用 KMS 鍵にも Deny ポリシーで destroy 禁止
- SDP の wrappedKey 参照を Cloud Asset Inventory で可視化
- SDP テンプレートと使用 KMS 鍵を マッピング表として運用ドキュメント化
G. Cloud Storage の事故
CASE G-01
SEV1
GCS
誤って allUsers にバケットを公開、3 時間 PHI 12 GB が外部からアクセス可能
復旧
- allUsers / allAuthenticatedUsers の Binding を即時削除
- GCS Access Log + Audit Data Access ログから外部 IP 一覧を抽出
- 影響対象データの分類 → 規制(HIPAA / GDPR)に基づく報告手順
- 72 時間以内の規制当局通知(GDPR の場合)
予防策
- 組織ポリシー
iam.allowedPolicyMemberDomains に allUsers / allAuthenticatedUsers を含めない
- 組織ポリシー
storage.publicAccessPrevention を Enforce(バケット公開を完全禁止)
- SHA Finding
PUBLIC_BUCKET_ACL を SEV1、Cloud Functions で自動 close
- Uniform bucket-level access を強制(ACL を完全排除)
CASE G-02
SEV2
GCS
ランサムウェアで Cloud Storage オブジェクトが上書き / 削除
復旧
Object Versioning + Object Lifecycle で過去バージョン保持 → rollback。Bucket Lock があれば削除不可でさらに安全。
予防策
- 本番バケットは Object Versioning + 90 日保持
- WORM 要件があれば Bucket Lock + Retention
- SA 鍵運用禁止 + Workload Identity
- SHA
BUCKET_POLICY_ONLY_DISABLED 検出
H. BigQuery の事故
CASE H-01
SEV2
BigQuery
誤って Policy Tags を削除し、機密列が全アナリストに露出
予防策
- Policy Tags の削除は Deny ポリシーで SOC グループ以外禁止
- Taxonomy の変更は Terraform 経由のみ、変更レビュー必須
- BigQuery Data Access ログを SIEM で監視、Policy Tag 列への大量 SELECT を異常検知
CASE H-02
SEV3
BigQuery
Authorized View の参照先データセットを削除し、ダウンストリーム BI 全停止
予防策
- 削除前に Data Catalog / INFORMATION_SCHEMAで依存関係を確認
- 機密 / 共有データセットは 削除前承認フロー(PAM Entitlement)
CASE H-03
SEV2
BigQuery
クエリ実行コスト爆発:on-demand で SELECT * 連発し $30k/日
予防策
- Project / User 単位で Custom Quota(query usage per day)を設定
- BigQuery Editions(Capacity-based)で予算固定
- Cost Control チェック:
SELECT * をブロック、partition フィルタ必須を Custom Rule で
I. GKE / Binary Authorization の事故
CASE I-01
SEV2
Binary Auth
Attestor の鍵をローテーション失敗、全デプロイ停止
復旧
Breakglass モードで一時デプロイ許可(監査ログ警告)→ Attestor 設定修正
予防策
- Attestor 鍵は dual keyでローテーション、古い鍵を 30 日保持
- Breakglass 使用は SEV2 アラート、SOC レビュー必須
- Cloud Build パイプラインで Attestor の health check
CASE I-02
SEV3
GKE / SCC
Container Threat Detection で reverse shell 検知、攻撃者は Pod から escape 試行
復旧
- 該当 Pod を即時削除、Node を cordon → drain
- Network Policy で該当 namespace の egress を一時遮断
- Audit Log + auditd Log でアクティビティ追跡
- イメージの SBOM を確認、CVE スキャンで侵入経路特定
予防策
- GKE Autopilot or Confidential GKE Nodes でホスト分離強化
- PodSecurity Admission で privileged Pod 禁止
- Network Policy をデフォルト Deny、必要な通信のみ許可
- Workload Identity でメタデータサーバ経由のトークン漏洩防止
J. Secret Manager の事故
CASE J-01
SEV2
Secret Manager
シークレットを「最新バージョン」で参照、ローテーション直後にアプリ起動失敗
予防策
- 本番アプリは 明示的なバージョン参照、デプロイで新バージョンに切替
- ローテーションは blue-greenパターン(古いバージョンと新バージョン同時有効期間あり)
- Pub/Sub 通知 → アプリの hot reload
CASE J-02
SEV1
Secret Manager
シークレット値が Cloud Logging のエラーメッセージに含まれて流出
復旧
- 該当シークレットを即時ローテーション
- Cloud Logging から該当ログを削除(exclusion filter + bucket purge)
- SIEM 経由で外部にエクスポートされていれば連絡
予防策
- シークレットは 環境変数ではなく起動時 API 取得
- エラーログに環境変数を含めない(structured logging の sensitive field 除外)
- SDP Cloud Logging Sink 経由スキャンでシークレットパターン検出
- Secret Manager の annotationで「最終ローテーション日」を記録
K. SCC / Audit Log の事故
CASE K-01
SEV2
Audit Log
Data Access ログを全 BigQuery で有効化し、月次取り込み料金 $40k
予防策
- Data Access は 機微データセットのみ有効化
- Exclusion Filterでヘルスチェック / 内部 SA / 高頻度低リスク操作を除外
- Log Bucket の Retention を短く(30〜90 日)、長期は GCS Coldline へ Sink
- 取り込み量を Cloud Monitoring の
logging.googleapis.com/byte_count で日次監視
CASE K-02
SEV1
Audit Log
Aggregated Sink の Pub/Sub Topic 障害でログが 6 時間欠落
予防策
- Sink writerIdentity の IAM Binding を Deny ポリシーで改変禁止
- Sink エラーメトリック
logging.googleapis.com/exports/error_count を 1 分粒度で監視
- Sink を 2 重化(Pub/Sub + BigQuery 両方)してフェイルセーフ
- Log Bucket への保存も並行、原本は GCS Coldline に残す
CASE K-03
SEV2
SCC
SCC の Finding 通知が Slack で埋もれ、Critical を 36 時間放置
予防策
- Severity 別に通知チャネル分離(Critical → PagerDuty / High → Slack / その他 → メール)
- SLO 設定:Critical は 1 時間、High は 4 時間、Medium は 24 時間で対応
- 未対応 Finding を BigQuery でレポート化、週次レビュー
- Cloud Functions で自動エンリッチメント(影響範囲・推奨アクション)
L. Assured Workloads / Access Approval の事故
CASE L-01
SEV2
Assured Workloads
Highest level Enforce で Terraform apply が連鎖失敗、開発停止
予防策
- Assured Workloads 配下では 許可サービスを Terraform validator で事前 check
- 違反操作モードは初期
Configurable で運用、警告から徐々に Enforce
- サンドボックスの非規制プロジェクトで先に検証
CASE L-02
SEV2
Access Approval
Access Approval を有効化したが承認チームが不在で Google サポート停滞
予防策
- Access Approval 有効化前に 24/7 承認体制を構築(時差を考慮)
- Pub/Sub Sink → PagerDuty 連動
- SLA 合意:承認 RTO 1 時間以内
- Pre-approved SA で限定シナリオは自動承認
- 定期演習:「承認しないとどうなるか」のシミュレーション
99. ポストモーテムテンプレート
インシデント対応後、24〜72 時間以内にポストモーテムを書く運用にしておくと組織知が蓄積される。
ポストモーテム標準フォーマット(Google SRE 流)
- Incident ID / Date / Severity / Author
- Summary(3 行以内で何が起きたか)
- Impact(ユーザー影響・ビジネス影響・金額)
- Root Cause(5 Whys で深掘り)
- Trigger(具体的な引き金)
- Resolution(復旧手順)
- Detection(どう検知したか / どうあるべきだったか)
- Timeline(タイムスタンプ付き時系列)
- What Went Well(うまくいった点)
- What Went Wrong(うまくいかなかった点)
- Action Items(再発防止アクション、オーナー、期日)
- Lessons Learned(組織として学ぶべき教訓)
原則:Blameless(責任追及せず)でシステム / プロセスの問題として扱う。