シークレット管理
パスワード、API キー、証明書などの機密情報を安全に保存・配布・ローテーションする手法
セキュリティ運用
シークレット管理とは
シークレット管理は、パスワード、API キー、DB 接続情報、TLS 証明書などの機密情報を安全に保存・配布・ローテーションする手法である。コードやリポジトリにシークレットをハードコードしない。
やってはいけないこと
// ❌ コードにハードコード
const API_KEY = 'sk-abc123def456';
// ❌ .env を Git にコミット
// .env
DATABASE_PASSWORD=secret123
// ❌ Lambda の環境変数に平文で設定 (CloudFormation テンプレートに残る)
シークレットの保存場所
| 方法 | セキュリティ | コスト | 用途 |
|---|---|---|---|
| Secrets Manager | 高い (暗号化 + ローテーション) | $0.40/月 | パスワード、API キー |
| SSM Parameter Store (SecureString) | 中程度 (暗号化) | 無料 | 設定値 |
| 環境変数 | 低い (平文) | 無料 | 非機密の設定値 |
シークレットのローテーション
1. Secrets Manager が新しいパスワードを生成
2. DB のパスワードを更新
3. アプリケーションが次回取得時に新パスワードを使用
→ 手動介入なしで定期的にパスワードが変更される
Git でのシークレット漏洩防止
# git-secrets: コミット時にシークレットを検出
git secrets --install
git secrets --register-aws
# .gitignore
.env
.env.local
*.pem
シークレットが漏洩した場合
1. 即座にシークレットをローテーション (新しいパスワードに変更)
2. 漏洩したシークレットを無効化
3. CloudTrail でアクセスログを確認
4. 影響範囲を調査
5. 再発防止策を実施
Kubernetes でのシークレット
Kubernetes の Secret は Base64 エンコード (暗号化ではない)。AWS Secrets Manager と連携する Secrets Store CSI Driver を使う。
さらに掘り下げるなら関連書籍が参考になる。