ストーリー
田
田中VPoE
セキュリティパイプラインでコードの脆弱性を検出できるようになった。次は「シークレット管理」だ。パイプライン自体が安全でも、APIキーやパスワードの管理が杜撰なら全てが無意味になる
あなた
半年前にうちの組織でもAPIキーがGitHubに公開されるインシデントがありましたよね
あ
田
田中VPoE
まさにそれだ。GitHubに公開されたシークレットは数秒で自動スキャンされ、悪用される。公開から悪用までの時間は年々短くなっている。シークレット管理は「漏れた時にどうするか」ではなく「漏れないようにどう設計するか」が重要だ
あなた
環境変数にAPIキーを入れるのでは不十分ですか?
あ
田
田中VPoE
不十分だ。環境変数はログに出力されることがある。プロセスのメモリダンプで露出する。コンテナの環境変数はdocker inspectで見える。専用のシークレット管理基盤が必要だ
シークレットとは
シークレットの種類
| 種類 | 例 | リスク |
|---|
| APIキー | AWS Access Key, Stripe API Key | 不正利用、料金発生 |
| データベース認証情報 | PostgreSQL接続文字列 | データ漏洩、改ざん |
| 暗号鍵 | AES-256キー、RSA秘密鍵 | 暗号化の無力化 |
| OAuth/JWTシークレット | クライアントシークレット、署名鍵 | 認証のバイパス |
| TLS証明書/秘密鍵 | サーバー証明書の秘密鍵 | 通信の傍受 |
| サービスアカウントトークン | Kubernetes ServiceAccount | インフラへの不正アクセス |
| SSH鍵 | デプロイキー、サーバーアクセス鍵 | サーバーへの不正アクセス |
シークレット漏洩の統計
| 指標 | 数値 |
|---|
| GitHubで年間検出されるシークレット | 数百万件以上 |
| 公開から悪用までの平均時間 | 数分〜数時間 |
| シークレット漏洩が原因のセキュリティインシデント割合 | 約20% |
| 企業の平均シークレット数 | 数千〜数万件 |
| シークレットのスプロール率(管理外シークレット) | 約70% |
シークレット管理のアンチパターン
避けるべきパターン
| アンチパターン | 問題点 | 代替案 |
|---|
| ソースコードへのハードコード | git historyに残る、全開発者に公開 | シークレット管理サービス |
| 環境変数(平文) | ログ出力、docker inspect、プロセス一覧で露出 | シークレット管理サービスから動的取得 |
| 設定ファイル(.env) | 誤コミット、バックアップ経由の漏洩 | .gitignore + シークレット管理サービス |
| 共有シークレット | 誰がアクセスしたか追跡不能、ローテーション困難 | 個人/サービス別のシークレット |
| 長期間有効なシークレット | 漏洩時の影響期間が長い | 短期間トークン + 自動ローテーション |
| 暗号化されていないバックアップ | バックアップ経由の漏洩 | 暗号化バックアップ |
危険なパターン:
// ハードコード(最悪)
const apiKey = "sk-live-abc123def456";
// .env ファイル(git管理外でも危険)
// .env
DATABASE_URL=postgres://user:password@host:5432/db
// CI/CD の環境変数(改善の余地あり)
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
# → プロセス環境変数として全サブプロセスに公開
// 推奨パターン
// アプリケーション起動時にVaultから動的取得
const dbPassword = await vault.read("secret/data/myapp/database");
シークレット管理のアーキテクチャ
理想的なアーキテクチャ
シークレット管理の階層:
Layer 1: シークレットストア(Source of Truth)
├── HashiCorp Vault
├── AWS Secrets Manager
├── Azure Key Vault
└── Google Secret Manager
Layer 2: シークレット配布
├── Kubernetes Secrets(Vault Agent Injector経由)
├── AWS Parameter Store(Systems Manager)
├── 環境変数(Vault Agent経由で動的設定)
└── ファイルマウント(tmpfs経由、一時的)
Layer 3: アプリケーション統合
├── SDK/ライブラリ(Vault SDK, AWS SDK)
├── Sidecar/Init Container(Vault Agent)
├── CSI Driver(Secret Store CSI Driver)
└── 外部シークレット同期(External Secrets Operator)
Layer 4: 監査と監視
├── アクセスログ(誰が何のシークレットを読んだか)
├── 異常検出(通常と異なるアクセスパターン)
├── アラート(高感度シークレットへのアクセス通知)
└── コンプライアンスレポート
クラウド別のシークレット管理サービス比較
| 機能 | AWS Secrets Manager | HashiCorp Vault | Azure Key Vault | GCP Secret Manager |
|---|
| 自動ローテーション | あり(RDS, Redshift等) | あり(プラグイン) | あり | あり |
| 動的シークレット | なし | あり(DB認証情報等) | なし | なし |
| マルチクラウド | なし | あり | なし | なし |
| 暗号化 | AES-256(KMS) | AES-256-GCM | HSM/ソフトウェア | Envelope暗号化 |
| 監査ログ | CloudTrail | 内蔵監査ログ | Azure Monitor | Cloud Audit Logs |
| 料金 | $0.40/シークレット/月 | OSS無料 / Enterprise有料 | $0.03/操作 | $0.06/10,000操作 |
| PKI(証明書発行) | ACM(別サービス) | あり(内蔵PKI) | あり | なし |
「マルチクラウドや複雑な認証要件がある場合はVault、AWSに閉じるならSecrets Managerが現実的だ。重要なのは、どのサービスを選ぶかより、シークレットを一元管理する仕組みを作ることだ」 — 田中VPoE
シークレット管理の基本原則
| 原則 | 内容 | 実装例 |
|---|
| 最小権限 | 必要最小限のシークレットのみアクセス可能にする | Vault ポリシーでパス単位のアクセス制御 |
| 一元管理 | シークレットの散在(スプロール)を防ぐ | 全シークレットをVault/Secrets Managerに集約 |
| 暗号化 | 保存時・転送時ともに暗号化する | Vault の暗号化ストレージ + TLS通信 |
| 監査 | すべてのアクセスを記録する | Vault の監査ログ + CloudTrail |
| ローテーション | シークレットを定期的に更新する | 自動ローテーション(30-90日) |
| 短期間トークン | 長期間有効なシークレットを避ける | Vault の動的シークレット(TTL: 1時間) |
| 検出と防止 | シークレットの漏洩を検出・防止する | Gitleaks + GitHub Secret Scanning |
まとめ
| ポイント | 内容 |
|---|
| シークレットの種類 | APIキー、DB認証情報、暗号鍵、トークン、証明書等 |
| アンチパターン | ハードコード、平文環境変数、共有シークレット、長期間有効 |
| アーキテクチャ | シークレットストア→配布→アプリ統合→監査の4層構造 |
| 基本原則 | 最小権限、一元管理、暗号化、監査、ローテーション、短期間トークン |
チェックリスト
次のステップへ
次は「Vault設計パターン」を学びます。HashiCorp Vaultを中心に、エンタープライズ向けのシークレット管理基盤の設計方法を身につけましょう。
推定読了時間: 30分