メインコンテンツへスキップ
Kubernetes Secrets漏えい時の初動対応:確認・ローテーション・影響調査
チュートリアル 中級

Kubernetes Secrets漏えい時の初動対応:確認・ローテーション・影響調査

チュートリアル 中級

Kubernetes Secretsの漏えい疑いに対し、最初の15分で行う失効・再発行、Podと外部サービスの切り替え、監査ログ・RBAC・etcd暗号化の確認方法を解説。情シス、開発者、SRE、SaaS管理者向けに、危険度判断、証拠保全、記録項目、やってはいけない対応をチェックリストで整理します。

この記事の目次 13項目から選ぶ

冒頭要約

Gitリポジトリ、CI/CDログ、チャット、チケット、アプリケーションログ、バックアップなどにKubernetes Secretの値が露出した疑いがある場合、Secretオブジェクトを削除するだけでは対応完了になりません。Secretに保存されていたAPIキー、データベースパスワード、証明書、トークンを、発行元のサービス側で失効させる必要があります。

最初に、対象クラスタ、namespace、Secret名、値の種類、発見時刻、露出場所、参照しているワークロードを記録します。次に上流の認証情報を失効・再発行し、新しい値へ切り替え、Kubernetes監査ログと接続先サービスのログで不審な利用を確認します。

この記事では、情シス、開発者、SRE、クラウド・SaaS管理者、CSIRTが、最初の15分、封じ込め、影響調査、復旧、再発防止へ進む判断基準を解説します。漏えい値の動作確認や侵入再現は行わず、防御・確認・記録に必要な内容だけを扱います。

秘密値をチケットやチャットへ貼り直さない

調査や本人確認のためでも、Secretの値をコピーして共有しないでください。識別にはクラスタ、namespace、Secret名、キー名、発見元の参照情報を使い、秘密値そのものを増やさないようにします。


Kubernetes Secretsとは:base64との違い

Kubernetes Secretsは、パスワード、OAuthトークン、SSH鍵などの機密情報をPodへ渡すためのオブジェクトです。SecretはVolumeや環境変数などを通じてコンテナから参照できますが、値を利用するアプリケーション、ログ、デバッグ出力、バックアップまで自動的に安全にする仕組みではありません。

Kubernetes公式ドキュメントは、Secretマニフェストのbase64表現は暗号化ではなく、平文と同等に機密情報として扱うよう注意しています。リポジトリへ登録されたマニフェスト、CI/CDの出力、Issueへ貼られたYAMLは、文字列が読みにくく見えても漏えいとして扱います。

「Secretが漏れた」を4種類に分ける

状況最初に確認すること
値そのものが露出マニフェスト、ログ、画面、バックアップに秘密値が含まれた閲覧範囲、露出期間、上流サービスでの失効可否
Secretを読める権限が露出kubeconfig、クラスタ管理者ID、サービスアカウントトークンが漏れた対象主体のRBAC、到達できるnamespace、監査ログ
ワークロード経由で露出アプリのデバッグ画面やログが環境変数を出力した対象Pod、ログ転送先、同じ値を使う他環境
etcd・バックアップが露出control planeやetcdのスナップショットへ第三者がアクセスした保存時暗号化、復号鍵、バックアップの閲覧者と複製先

「Secretオブジェクトが見つかった」という事実と、「保存されている認証情報が第三者に使われた」という事実は分けて記録します。ただし、利用の証拠がまだ見つからなくても、値が閲覧可能だったなら失効・再発行を優先します。


読者別の影響:誰が何を確認するか

読者・担当まず確認すること主な責任範囲
開発者Secretを参照するDeployment、Job、CI/CD、アプリ設定新しい値への切り替え、動作確認、ログへの再露出防止
SRE・クラスタ管理者クラスタ、namespace、RBAC、監査ログ、etcd暗号化読み取り主体の特定、権限制限、段階的な再起動と復旧
情シス・SaaS管理者APIキーやパスワードの発行元、所有者、接続先データ失効・再発行、SaaS監査ログ、顧客・業務影響の確認
クラウド管理者クラウドIAM、Secret管理サービス、KMS、監査ログ権限範囲、別リソースへの到達、鍵・トークンの失効
CSIRT・SOC発見経路、露出期間、不審利用、同時に露出した情報優先度判断、証拠保全、調査範囲、経営・法務への報告
個人開発者公開リポジトリ、個人クラスタ、課金、外部API値の失効、権限・請求確認、公開履歴と複製先の確認

Secretの値が本番と開発環境で共有されている場合、発見したクラスタだけを直しても封じ込めになりません。値を軸に、同じ認証情報を使うリポジトリ、CI/CD、別クラスタ、ローカル環境、SaaS連携を確認します。


まず確認すること:最初の15分チェックリスト

1. 対象を識別する

  • クラスタ、namespace、Secret名、キー名を記録した。
  • パスワード、APIキー、トークン、証明書、秘密鍵など値の種類を特定した。
  • Secretの所有チーム、発行元サービス、利用目的を確認した。
  • 本番、検証、開発のどの環境で使われているか確認した。
  • 発見時刻、発見者、通知元、チケット番号を記録した。

秘密値を復号・表示して照合するのではなく、Secret名、キー名、発行元の識別子、所有者台帳、デプロイ設定を使います。値の種類を特定できない場合は、未確認のまま低優先度にせず、複数の認証情報が含まれる可能性を残します。

2. 露出経路と閲覧範囲を確認する

  • Publicリポジトリ、社内リポジトリ、ログ、チャット、チケット、バックアップのどこで露出したか確認した。
  • 露出開始時刻と、最後に安全を確認できた時刻を記録した。
  • 閲覧できた利用者、外部共有、フォーク、ミラー、ログ転送先を確認した。
  • 同じファイルやログに別のSecret、内部URL、顧客情報が含まれていないか確認した。
  • 漏えい元の削除前に、URL、コミット、ログIDなど必要な参照情報を保全した。

Git履歴やログ保存先から見えなくしただけでは、すでに取得された値は無効になりません。公開範囲の縮小と認証情報の失効を別の作業として管理します。

3. 依存するワークロードを確認する

  • SecretをVolumeまたは環境変数で参照するDeployment、StatefulSet、DaemonSet、Jobを確認した。
  • Ingress、Operator、CI/CD、バックアップ、監視など周辺コンポーネントの参照を確認した。
  • 同じ値を使う別namespace、別クラスタ、別リージョンを確認した。
  • 失効時に停止する業務、復旧目標、メンテナンス責任者を確認した。
  • 新しい値を安全に配布し、切り替えを確認できる担当者を確保した。

環境変数として読み込んだ値は、Secretオブジェクトを更新しただけでは既存プロセスへ反映されません。Volumeでも、アプリケーションが値を再読み込みするかは実装によります。Secret更新、ワークロード切り替え、旧値失効を一つの変更計画として扱います。

4. 読み取り権限とログの有無を確認する

  • RBACでSecretのgetlistwatchを持つ利用者・グループ・サービスアカウントを確認した。
  • 対象namespaceでPodを作成・変更できる主体を確認した。
  • Kubernetes Audit Logが有効か、保存期間と記録レベルを確認した。
  • Secretの読み取り、更新、削除と、RBAC変更のイベントを確認した。
  • 発行元サービス側のサインイン、API利用、データアクセス、権限変更ログを確認した。

Kubernetes公式ガイドは、Secretへのlist権限が返却対象の値を取得できること、Secretを直接読めなくても、そのSecretを参照するPodを作れる主体が値へ到達できる場合があることを説明しています。RoleBindingだけでなく、Pod作成・変更権限も確認対象です。


初動対応:やること、やらないこと、記録すること

やること

  1. 対象Secretと上流の認証情報を特定し、所有者とインシデント責任者を決める。
  2. 発行元サービスで新しい認証情報を作成し、権限と有効範囲を必要最小限にする。
  3. 組織で承認された経路を使い、Kubernetes側のSecretと依存ワークロードを新しい値へ切り替える。
  4. 新しい値で業務が継続することを確認し、旧値を発行元サービス側で失効する。
  5. 旧値が使えないことを正規の管理画面と監査ログで確認する。
  6. Kubernetes監査ログと接続先サービスのログを突き合わせ、不審な読み取りと利用を調査する。
  7. 同じ露出経路、同じRBAC、同じ保管先にある他のSecretも確認する。

漏えいがPublicな場所で発生した、強い権限を持つ、すでに不審利用がある場合は、通常の変更手順より封じ込めを優先します。停止影響が大きい場合も、漏えいした値を有効なまま放置せず、サービス所有者とCSIRTが代替経路、段階的切り替え、緊急停止を判断します。

やってはいけないこと

  • 漏えいした値を使い、接続や権限を試さない。
  • Secretオブジェクトだけを削除し、発行元のAPIキーやパスワードを有効なまま残さない。
  • 依存関係を確認せず、全Podや全クラスタを一斉に再起動しない。
  • 記録を残さず、Secret、ログ、リポジトリ、サービスアカウントを削除しない。
  • base64表現や非公開リポジトリを、安全性の根拠にしない。
  • 監査ログがないことを「利用されていない証明」にしない。
  • Secretの値、顧客情報、内部URLを通常のチャット、公開Issue、個人端末へ複製しない。

記録すること

事案ID:
発見日時・発見者:
対象クラスタ / namespace / Secret名 / キー名:
値の種類・発行元・所有者:
露出場所・閲覧範囲・推定期間:
参照ワークロード・他環境:
旧値の失効日時・実施者:
新しい値への切り替え日時・確認者:
確認したログ・対象期間・保存上の制約:
確認された不審操作:
影響を受けるデータ・業務・利用者:
未確認事項・次回確認期限:
エスカレーション先・判断者:

記録テンプレートへ秘密値そのものを貼らないでください。必要な証跡は、アクセス制御された保存先で、収集者、収集時刻、取得元、ハッシュなど組織の証拠保全手順に従って管理します。


ローテーションの判断順:Secret更新と失効の違い

操作目的完了条件
新しい認証情報を発行旧値に依存しない復旧経路を用意する権限、有効期限、利用先が承認済みである
Kubernetes Secretを更新ワークロードへ新しい値を配布する対象環境のSecretが更新され、秘密値をログへ出していない
ワークロードを切り替える実行中プロセスに新しい値を利用させるヘルス、業務処理、監視で新しい値の利用を確認した
旧値を失効する第三者を含む旧値の利用を止める発行元で無効となり、旧値による利用が受け付けられない
露出元を修正する再配布と再検知を防ぐ履歴、ログ設定、テンプレート、権限の原因を修正した

Secretオブジェクトの削除は、外部サービスが発行した値の失効とは異なります。データベースパスワードならデータベース側、クラウドAPIキーならクラウドIAM、SaaSトークンならSaaS管理画面で旧値を止めます。

値が証明書や暗号鍵の場合は、単純な再発行だけでなく、信頼先、証明書チェーン、署名対象、復号可能なデータ、過去のバックアップへの影響も確認します。判断できない場合は、鍵管理担当者とCSIRTへエスカレーションします。


影響調査:監査ログで確認する観点

Kubernetes監査ログは、クラスタ内で「誰が、いつ、どのリソースへ、どの操作を要求したか」を追うための重要な証跡です。一方、Secretの値が外部APIへ実際に使われたかは、接続先サービスのログも確認しなければ分かりません。

Kubernetes側

  • Secretへのgetlistwatchと通常時からの変化。
  • Secretの作成、更新、削除、namespace間の複製。
  • Role、ClusterRole、RoleBinding、ClusterRoleBindingの変更。
  • 対象Secretを参照するPod、Job、Deploymentの作成・変更。
  • サービスアカウント、トークン、Admission設定、監査設定の変更。
  • 通常と異なる利用者、サービスアカウント、送信元、時刻のAPI操作。

監査方針がMetadataレベルの場合、主体、時刻、リソース、verbなどは記録できますが、リクエスト・レスポンス本文は含みません。Secretの値をログへ残すことが目的ではないため、初動で安易に高い記録レベルへ変更せず、機密性とログ量を考慮して監査方針を設計します。

接続先サービス側

  • データベース、クラウド、SaaS、外部APIへの通常と異なる接続。
  • IAM、権限、トークン、回復情報、連携アプリの変更。
  • データの大量閲覧、エクスポート、削除、共有範囲変更。
  • 新しいリソース、ユーザー、キー、永続的なアクセス経路の作成。
  • 利用量、請求、クォータ、エラー率の急な変化。
  • ログ保存、監視、通知設定の変更や欠損。

ログの対象期間は、発見時刻だけでなく、露出開始時刻、最後に安全を確認できた時点、保存期間を基準に決めます。ログが無効、保存期間外、閲覧権限不足の場合は、その制約を未確認事項として残します。


判断基準:危険度とエスカレーション条件

優先度条件推奨する判断
緊急クラスタ管理、クラウドIAM、顧客データ、Secret管理基盤へ到達できる即時失効、CSIRT招集、関連ID・Secret・ログの拡大調査
緊急不審なAPI利用、データ取得、権限変更、永続化、ログ変更がある侵害の可能性として封じ込め、証拠保全、経営・法務判断へ接続
Publicリポジトリ、公開ログ、外部共有へ露出した利用の証拠を待たず失効し、フォーク・複製・同時露出を確認
露出期間、値の種類、利用先、権限範囲のいずれかが不明未確認リスクとして失効・再発行し、所有者と依存先を特定する
閲覧範囲が限定され、権限が小さく、不審利用が確認されていないローテーション、ログ確認、原因修正を完了して判断根拠を残す
ダミーまたは失効済みで、実環境へ権限がないことを確認できた根拠を記録し、誤配置と検知ルールを改善する

次のいずれかに当てはまれば、担当チームだけで閉じずにエスカレーションします。

  • 顧客・従業員情報、決済、医療、契約上の機密へアクセスできる。
  • クラスタ管理者、クラウド管理者、Secret管理、IAM変更の権限がある。
  • 同じ値を複数環境・複数組織で共有している。
  • 不審な読み取り、データアクセス、権限変更、課金、ログ欠損がある。
  • 露出期間、閲覧者、依存先、失効完了のいずれかを説明できない。
  • サービス停止と漏えい継続のトレードオフを担当者だけで判断できない。

よくある誤解

「base64なので値は読めない」

base64はバイナリを文字列で表現する符号化であり、暗号化ではありません。Kubernetes公式ガイドも、base64で表現されたSecretマニフェストを共有・コミットしないよう注意しています。

「etcdを暗号化すればSecret漏えいは防げる」

etcd暗号化は、etcdやバックアップへ直接アクセスされた場合の保護に役立ちます。しかし、正規のKubernetes APIでSecretを読める主体、Secretを参照するPod、アプリケーションログからの露出は別の対策が必要です。

「Secretを更新すれば全Podがすぐ新しい値を使う」

反映方法は参照方法とアプリケーション実装で異なります。特に環境変数として読み込んだ値は、実行中プロセスへ自動反映されません。ワークロード所有者が切り替えと動作確認を計画します。

「監査ログに何もないので悪用されていない」

監査が有効だったか、対象操作が記録されるレベルか、保存期間内か、接続先サービスのログも確認したかを分けます。ログがないことと、操作がなかったことは同じではありません。

「外部Secret管理を使えばローテーションは不要」

Secrets Store CSI DriverExternal Secrets Operatorは、保管と配布を改善できますが、発行元での失効、依存アプリの再読み込み、権限、監査、障害時の復旧は引き続き設計が必要です。


再発防止:Secretの保管・権限・監査を見直す

権限を小さくする

  • 人とワークロードのSecret getlistwatchを必要最小限にする。
  • namespaceを分け、Secretを必要としないコンテナへマウントしない。
  • Pod作成・変更権限からSecretへ到達できる経路を含めてレビューする。
  • 共有サービスアカウントやクラスタ管理者権限を減らす。
  • 所有者、利用目的、依存先、更新期限を台帳化する。

長期の秘密値を減らす

  • 可能なら短期トークン、Workload Identity、マネージドIDを使う。
  • APIキーやパスワードに有効期限、スコープ、送信元制限を設定する。
  • 自動ローテーションと段階的切り替えを平時にテストする。
  • 外部Secret管理を使う場合も、Kubernetesへ同期・マウントされた後の露出を確認する。
  • Git、CI/CD、ログ、コンテナイメージに秘密値を含めない検査を行う。

保存と監査を強化する

  • 保存時暗号化を構成し、既存Secretにも適用されているか確認する。
  • KMSを使う場合は、復号権限、鍵ローテーション、障害時の復旧を確認する。
  • Secret操作は必要なメタデータを監査し、機密値をログ本文へ残さない。
  • 監査ログを改ざんされにくい保存先へ送り、保存期間と時刻同期を確認する。
  • Sealed Secretsなどを使う場合は、復号鍵の保護と漏えい時の再暗号化計画も用意する。

再発防止の完了条件は「Secretを作り直した」ではありません。次回は露出しにくく、露出しても短時間で失効でき、誰がどの範囲へアクセスできたか説明できる状態を目指します。


関連用語・関連ページ

次に確認することCyberLensのページ
KubernetesのSecret管理を理解するKubernetes Secretsetcd暗号化RBAC
外部Secret管理を比較するSecrets Store CSI DriverExternal Secrets OperatorSealed Secrets
漏えい対応を作業化するGitHub secret leak対応チェックリスト漏えい疑い初動テンプレートGitHubトークン漏えい初動テンプレート
似た認証情報漏えいを確認するサービスアカウントキー漏えい時の初動対応AWSアクセスキー漏えい時の初動対応
判断の基礎を学ぶインシデントレスポンス入門認証と認可の違いハッシュと暗号化の違い
知識を確認するKubernetes Secrets関連の5問クイズ

公式情報・参考情報


まとめ

Kubernetes Secretsの漏えいを疑ったら、クラスタ、namespace、Secret名、値の種類、発行元、露出場所、依存ワークロードを記録します。新しい認証情報へ安全に切り替えた後、旧値を発行元で失効し、Kubernetes監査ログと接続先サービスのログで影響を確認します。

Secretオブジェクトの削除、base64表現、etcd暗号化のいずれか一つだけでは、漏えい対応は完了しません。RBAC、Pod作成権限、長期認証情報、外部Secret管理、監査、ログへの再露出を見直し、確認できた事実と未確認事項を分けてエスカレーションしてください。

関連テーマを体系的に学ぶ インシデント対応ガイド:検知から復旧までの判断順序
ESC