第3章:秘密情報管理(トークン/鍵/ログ/Issue貼り付け禁止)

この章で学ぶこと

  • 秘密情報(鍵/トークン/パスワード)の種類と取り扱いを理解する
  • ログ/Issue/チャットへの貼り付けが事故になる理由を理解する
  • 漏えい時の初動(失効/ローテーション)を知る

成果物(または判断基準)

  • 秘密情報の取り扱いルール(保管/出力/共有の禁止事項)
  • チェック項目(付録: 秘密情報チェック

本文

秘密情報は露出した時点で失効/ローテーションが必要になり、対応コストが大きい。最初から露出しない設計/運用に寄せる。

最小の運用

  • 保管: Secret Manager などに集約
  • 出力: ログ/CI 出力に出さない
  • 共有: Issue/PR に貼らない(マスク/伏字)
  • 事故時: 失効/ローテーション/影響範囲の確認

ログマスキング(最低限)

ログは「調査に必要な最小情報」と「追跡のための識別子」を残し、秘密情報/個人情報は必ず伏字にする。

残す情報(調査に十分な情報)

  • request-id / trace-id / span-id(相関ID)
  • エンドポイント(パスのみ。query string は原則マスク)
  • ステータスコード、エラーコード、レイテンシ
  • 実行環境(prod/stg など)、リリース版(version / commit hash)

伏字にする情報(貼り付け禁止)

  • HTTPヘッダ: Authorization, Cookie, Set-Cookie
  • APIキー/アクセストークン/リフレッシュトークン/セッションID
  • 個人情報: メール、電話、住所、氏名、ユーザー識別子の紐付け情報

禁止例→推奨例(抜粋)

禁止例

Authorization: Bearer <token>
Cookie: session=<session_id>
GET /reset-password?token=<token>&email=user@example.com
{"email":"user@example.com","password":"plain-text","refresh_token":"<token>"}

推奨例

Authorization: [REDACTED]
Cookie: [REDACTED]
GET /reset-password?token=[REDACTED]&email=[REDACTED]  # request-id=<uuid>
{"email":"[REDACTED]","password":"[REDACTED]","refresh_token":"[REDACTED]","request_id":"<uuid>"}

IAM/権限で事故につながりやすい差分(例)

権限は「過剰に付与していないか」「期限があるか」「監査できるか」を中心に確認する。

ワイルドカード(*)の危険

  • 悪い例: Action: * / Resource: * を恒常的に付与する
  • 良い例: 必要な操作だけに絞る(最小権限)。例外が必要なら、期限付きで付与し、Issue/PR で理由と証跡を残す

管理者権限の恒久付与の危険

  • 悪い例: 管理者ロールを恒久的に付与したままにする
  • 良い例: Breakglass(緊急用)を前提にし、平時は必要最小限 + 承認フロー + 証跡(監査ログ)で運用する

期限付き権限の推奨

  • 可能なら短命トークン / OIDC / STS などを使い、「使い捨て・期限付き」に寄せる
  • 期限付きでも、監査ログ(誰が/いつ/何を)と棚卸し(定期確認)は必要

具体例(悪い例→良い例)

悪い例

Issue にトークンを貼って相談
ログにもAPIキーが出ている

良い例

Issue には伏字と影響範囲のみ記載
秘密情報はSecret Managerへ移動
漏えい疑いがあるため、失効とローテーションを実施

チェックリスト

  • 秘密情報をIssue/PR/ログに出していない
  • 保管場所が決まっている
  • 漏えい時の手順(失効/ローテーション)がある

まとめ

  • 秘密情報は保管/出力/共有のルールを先に決め、ログ/Issue/チャットへの貼り付けを防止する
  • 漏えいが疑われる場合は、失効/ローテーションと影響範囲の確認を最優先で実施する

次章への接続