シークレット管理とKMS
🔥 Vibe プロンプト
「自動キーローテーション付きKMSを設定。AWS Secrets Managerにシークレットを保存。エンベロープ暗号化を実装。」
KMS
resource "aws_kms_key" "app" {
description = "アプリケーション暗号化キー"
enable_key_rotation = true
}
resource "aws_kms_alias" "app" {
name = "alias/app-key"
target_key_id = aws_kms_key.app.key_id
}
エンベロープ暗号化
import boto3
kms = boto3.client('kms')
# データキー生成
response = kms.generate_data_key(KeyId='alias/app-key', KeySpec='AES_256')
plaintext_dek = response['Plaintext']
ciphertext_dek = response['CiphertextBlob']
# DEKでデータを暗号化
fernet = Fernet(plaintext_dek)
encrypted_data = fernet.encrypt(b"機密データ")
# 復号: まずDEKを復号
plaintext_dek = kms.decrypt(CiphertextBlob=ciphertext_dek)['Plaintext']
fernet = Fernet(plaintext_dek)
data = fernet.decrypt(encrypted_data)
AWS Secrets Manager
resource "aws_secretsmanager_secret" "db" {
name = "prod/db_password"
rotation_rules {
automatically_after_days = 30
}
}
Secrets Manager vs Parameter Store
| 機能 | Secrets Manager | Parameter Store | |------|----------------|----------------| | 最大サイズ | 64 KB | 8 KB | | ローテーション | 組み込み | 手動 | | 価格 | $0.40/シークレット/月 | 無料(標準) |
ベストプラクティス
- 大量データにはエンベロープ暗号化
- キーとシークレットを定期的にローテーション
- KMSキーポリシーは最小権限
- シークレットをコードにハードコードしない
- EC2/LambdaにはIAMロールを使用
- 環境ごとにキーを分離
重要なポイント
- コアコンセプトをしっかり理解する
- ハンズオンコード例で実践する
- 実世界の問題に応用する
- 演習で知識を強化する
さらに学ぶ
- 公式ドキュメント
- GitHubのオープンソースプロジェクト
- コミュニティフォーラムとディスカッション
- 関連コースとチュートリアル