PCSE 合格対策
横断 / 全セクション 🎯 Deep Dive 事故ケース集

セキュリティインシデント事例集
サービス別の典型事故と再発防止

実運用で繰り返し発生する典型インシデントを 原因 → 影響 → 検知 → 復旧 → 予防の構造で深掘り。「同じ落とし穴を踏まない」ためのナレッジベースとして PCSE 設計判断の補強に。

中堅〜シニア向け Architecture Framework Google Cloud CSIRT

このページの目次

  1. 0. Severity / SLA 早見表
  2. A. IAM / Identity
  3. B. Service Account
  4. C. VPC SC
  5. D. Network / Firewall
  6. E. Cloud KMS / EKM
  7. F. Sensitive Data Protection
  8. G. Cloud Storage
  9. H. BigQuery
  10. I. GKE / Binary Auth
  11. J. Secret Manager
  12. K. SCC / Audit Log
  13. L. Assured Workloads / Access Approval
  14. 99. ポストモーテムテンプレート

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

組織管理者ロールを誤って外部ドメインに付与し、外部からプロジェクト乗っ取り

原因iam.allowedPolicyMemberDomains 未設定 + ヒューマンエラー
検知Audit Log SetIamPolicy アラート(30 分遅延)
影響外部から組織ポリシー変更・SA 鍵作成・ログ消去未遂
RTO復旧 90 分

シナリオの再現

運用エンジニアが Terraform で IAM Binding を追加する際、メールアドレスをタイプミス(admin@oursomain.com → 偶然外部実在ドメイン)。許可ドメイン制約がなかったため適用成功。

タイムライン

T+0
Terraform apply で誤付与
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 を一括削除

復旧手順

  1. 封じ込め break-glass Super Admin で対象プリンシパルの全 Binding 削除(gcloud projects remove-iam-policy-binding ... --member=user:bad@external.com を組織横断)
  2. 影響評価 Cloud Asset Inventory で対象プリンシパルのアクセス履歴を全期間分検索(iamSearchAllIamPolicies
  3. 追跡 Aggregated Sink → BigQuery で当該プリンシパルの全 API 呼び出しをタイムライン化
  4. 根本対策 組織ポリシー 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
  1. なぜ外部ドメインに付与できた? → 組織ポリシーで制限していなかった
  2. なぜ制限していなかった? → 過去の M&A で例外プロジェクトがあり、未整理
  3. なぜ未整理だった? → 統合プロジェクトの責任者不在
  4. なぜ責任者不在? → セキュリティ運用が Platform チームに完全移管されていなかった
  5. なぜ移管されていなかった? → セキュリティ運用のオーナーシップ移管プロセスが未定義 = 真因
CASE A-02 SEV2 IAM

退職者の Cloud Identity アカウントを 3 ヶ月放置 → SA 鍵経由でデータアクセス

原因HR 連動の自動 deprovisioning 未実装
検知四半期 IAM Recommender 棚卸し(91 日後)
影響退職者が保有していた SA 鍵で BigQuery 読み取り可能だった

予防策

  • 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 署名証明書ローテーションを見落とし、全社員ログイン不能

原因IdP 側証明書ローテーション通知の見落とし
検知業務開始時の問い合わせ殺到
影響1.5 時間 全社員 GCP コンソールアクセス不能

復旧

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 リポジトリに誤コミット → 数分で暗号通貨マイナー展開

原因SA 鍵 JSON を .gitignore 漏れでコミット
検知Cloud Billing 異常急増 / VM Threat Detection(push 後 14 分)
影響14 分で $42,000 の暗号通貨マイナー課金、GCE 4 リージョンに展開

タイムライン

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 サポートに課金免除を申請(後日認められた)

復旧手順

  1. 封じ込め 漏洩 SA を gcloud iam service-accounts disable で即時無効化
  2. SA 鍵の全削除 該当 SA の鍵を全 list → 全 delete
  3. SA トークンの即時失効 gcloud iam service-accounts keys revoke + 既発行トークンの待機期間が問題なら SA を削除
  4. VM の一括削除 Cloud Asset Inventory で対象 SA 起動の VM を抽出 → 一括削除
  5. 請求書対応 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 引数を省略
検知SCC SHA Finding「Workload Identity Pool provider has no attribute condition」
影響同組織配下のすべての GitHub リポジトリが本番 SA を impersonate 可能だった

復旧

  1. WIF Provider を --attribute-condition で repository / ref を絞り更新
  2. SA の workloadIdentityUser binding を principalSet://...attribute.repository/特定REPO に限定
  3. 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 を上書き

原因既定 SA に roles/editor が残置、開発 VM の起動スクリプトでパス間違い
影響本番バケットのデータ 12 ファイル上書き

復旧

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 なしで Enforce、Cloud Build 用 SA の Ingress Rule 不在
影響2 時間 全 CI/CD と ETL 停止、DAG 失敗多発

復旧

  1. 境界を一時 Dry Run に変更(影響復旧優先)
  2. Policy Denied Audit Log を抽出し、必要な Ingress / Egress Rule をリスト化
  3. Ingress Rule(Cloud Build SA / Dataflow worker SA)を追加
  4. 再度 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 アクセスを誤許可

原因Egress Rule で identities: ["*"] + 全 API 指定
影響境界外への Vertex AI model export が可能に

予防策

  • 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) を許可、ボットネット侵入で内部偵察

原因「動作確認のため一時許可」のルールが残存
検知SHA Finding OPEN_FIREWALL / ETD Brute force SSH
影響4 時間で 30+ 万件のログイン試行、最終的に OS Login で阻止

予防策

  • 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 ポート枯渇で出力トラフィックの一部断続的に失敗

原因外部 API 1 つに 5,000 VM が同時接続、static port allocation で割り当て不足
検知Cloud Monitoring nat.googleapis.com/port_usage_factor 95% 超

復旧

  1. Cloud NAT に外部 IP を 3 つ追加
  2. Dynamic port allocation 有効化
  3. 該当外部 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 クライアントを誤検知ブロック

原因Sensitivity Level 3 を Preview なしで Enforce、SQL-like ヘッダで誤検知
影響パートナー API クライアントが 30 分間 403 を受領

予防策

  • WAF プリセットは必ず preview: true で 1 週間運用し、誤検知率を計測
  • 正規クライアントの IP を allow ルール(優先度低)で先に許可
  • 段階的に Sensitivity を上げる(1 → 2 → 3)

E. Cloud KMS / EKM の事故

CASE E-01 SEV1 CMEK

本番 CMEK 鍵を誤って destroy → BigQuery テーブル復号不能

原因運用者が「未使用鍵」と誤認、Terraform で destroy 適用
検知BigQuery クエリ全失敗 The key is destroyed or pending deletion
影響30 分間 本番分析停止 / 復号データセット 14 個

復旧

destroy は 30 日の grace periodgcloud 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 が GCP 側 SLA を下回り、外部側障害で連鎖
影響3 時間 EKM 暗号化対象の全データが復号不能

予防策

  • 外部 KMS の SLA を 99.99% 以上で契約、二拠点冗長
  • EKM via VPC(プライベート経路)でネットワーク要因を排除
  • 外部 KMS 障害シミュレーションを四半期演習
  • 非クリティカルなデータは EKM ではなく Cloud HSM(GCP 内)に分離
CASE E-03 SEV2 CMEK

サービスエージェントへの cryptoKeyEncrypterDecrypter 付与忘れで BigQuery テーブル作成失敗

原因CMEK 鍵作成時に bigquery-encryption@gcp-sa-bigquery.iam.gserviceaccount.com への権限付与漏れ
影響新規 BigQuery 取り込みパイプラインが起動失敗

予防策

  • CMEK 鍵作成 Terraform module に サービスエージェントへの自動 bindingを含める
  • CMEK 対応サービスごとに必要な service agent をドキュメント化

F. Sensitive Data Protection の事故

CASE F-01 SEV2 SDP / Cloud DLP

Discovery を全データセットに無自覚で走らせ、月次課金が $15,000 超過

原因SDP Discovery のスケジュールに scope 指定なし、PB 級データを全スキャン
検知Cloud Billing Budget Alert(既に消費後)

予防策

  • 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 し、過去のトークン再識別不能に

原因運用者が「古い鍵」と判断して destroy、SDP の wrappedKey で参照されていた
影響過去 6 ヶ月の Crypto Deterministic トークンが復号不能、再識別オペレーション停止

予防策

  • 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 付与、削除忘れ
検知SHA Finding PUBLIC_BUCKET_ACL(10 分後)

復旧

  1. allUsers / allAuthenticatedUsers の Binding を即時削除
  2. GCS Access Log + Audit Data Access ログから外部 IP 一覧を抽出
  3. 影響対象データの分類 → 規制(HIPAA / GDPR)に基づく報告手順
  4. 72 時間以内の規制当局通知(GDPR の場合)

予防策

  • 組織ポリシー iam.allowedPolicyMemberDomainsallUsers / 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 オブジェクトが上書き / 削除

原因SA 鍵漏洩 → 攻撃者がバケット内オブジェクトを暗号化済みファイルで上書き

復旧

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 を削除し、機密列が全アナリストに露出

原因Taxonomy の整理中に Policy Tag を削除、列にタグなしの状態に
影響30 分間、PII 列がデータセット閲覧者全員に見える状態

予防策

  • Policy Tags の削除は Deny ポリシーで SOC グループ以外禁止
  • Taxonomy の変更は Terraform 経由のみ、変更レビュー必須
  • BigQuery Data Access ログを SIEM で監視、Policy Tag 列への大量 SELECT を異常検知
CASE H-02 SEV3 BigQuery

Authorized View の参照先データセットを削除し、ダウンストリーム BI 全停止

原因Authorized View の参照グラフを把握せずに削除

予防策

  • 削除前に 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 の鍵をローテーション失敗、全デプロイ停止

原因Cosign 鍵ローテで古い鍵を即削除、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 試行

復旧

  1. 該当 Pod を即時削除、Node を cordon → drain
  2. Network Policy で該当 namespace の egress を一時遮断
  3. Audit Log + auditd Log でアクティビティ追跡
  4. イメージの 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

シークレットを「最新バージョン」で参照、ローテーション直後にアプリ起動失敗

原因シークレットを latest 参照、ローテーション後に旧バージョンで動いていた接続が破断

予防策

  • 本番アプリは 明示的なバージョン参照、デプロイで新バージョンに切替
  • ローテーションは blue-greenパターン(古いバージョンと新バージョン同時有効期間あり)
  • Pub/Sub 通知 → アプリの hot reload
CASE J-02 SEV1 Secret Manager

シークレット値が Cloud Logging のエラーメッセージに含まれて流出

原因アプリのエラーハンドラがシークレット値を含む環境変数を dump

復旧

  1. 該当シークレットを即時ローテーション
  2. Cloud Logging から該当ログを削除(exclusion filter + bucket purge)
  3. 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 ログ有効化、低 PV プロジェクトも含む

予防策

  • 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 に Pub/Sub publisher 権限が剥がれていた
影響SIEM 側で 6 時間分の Findings が欠落、規制報告に支障

予防策

  • 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 時間放置

原因SCC Findings を全 severity で 1 channel に通知、Critical が low に埋もれる

予防策

  • 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 が連鎖失敗、開発停止

原因規制外サービスを Terraform で使用 → Enforce で全 reject

予防策

  • Assured Workloads 配下では 許可サービスを Terraform validator で事前 check
  • 違反操作モードは初期 Configurable で運用、警告から徐々に Enforce
  • サンドボックスの非規制プロジェクトで先に検証
CASE L-02 SEV2 Access Approval

Access Approval を有効化したが承認チームが不在で Google サポート停滞

原因承認チーム未編成、Pub/Sub 通知が誰にも届かず Google サポートの調査が停止
影響本番障害の Google 側調査が 8 時間遅延

予防策

  • Access Approval 有効化前に 24/7 承認体制を構築(時差を考慮)
  • Pub/Sub Sink → PagerDuty 連動
  • SLA 合意:承認 RTO 1 時間以内
  • Pre-approved SA で限定シナリオは自動承認
  • 定期演習:「承認しないとどうなるか」のシミュレーション

99. ポストモーテムテンプレート

インシデント対応後、24〜72 時間以内にポストモーテムを書く運用にしておくと組織知が蓄積される。

ポストモーテム標準フォーマット(Google SRE 流)

原則:Blameless(責任追及せず)でシステム / プロセスの問題として扱う。

📚 関連リソース