キー管理
キー管理
AWS 外部キーストアでの KMS キーの作成、管理、およびローテーション
適用対象:
AWS KMSExternal Key StoreKey Lifecycle
概要
外部キーストアでのキー管理は標準の KMS キーとは異なります。これは、各 KMS キーがキーマネージャー(HashiCorp Vault、CyberArk など)内の外部キーに関連付けられているためです。AWS KMS と外部キーマネージャーの間で操作を調整する必要があります。
前提条件
- AWS KMS で外部キーストアが接続済み
- 最初にキーマネージャーで外部キーを作成済み
- 適切な IAM およびキーマネージャーの権限が構成済み
KMS キーの作成
1
キーマネージャーでの外部キーの作成
外部キーマネージャーで 256 ビットの AES キーを作成します。
Create Vault Transit KeyBASH
# Create a new encryption key in Vault Transit engine
vault write transit/keys/my-external-key type=aes256-gcm96
# Verify the key was created
vault read transit/keys/my-external-key
# Configure the key
vault write transit/keys/my-external-key/config \
exportable=false \
allow_plaintext_backup=false2
AWS での KMS キーの作成
Create KMS KeyBASH
# Set variables
KEYSTORE_ID="cks-1234567890abcdef0"
EXTERNAL_KEY_ID="my-external-key"
# Create KMS key
aws kms create-key \
--custom-key-store-id $KEYSTORE_ID \
--xks-key-id $EXTERNAL_KEY_ID \
--description "Production encryption key for S3 buckets" \
--tags TagKey=Environment,TagValue=Production \
TagKey=Application,TagValue=DataStorage \
--region us-east-1
# Capture the key ID
KEY_ID=$(aws kms create-key \
--custom-key-store-id $KEYSTORE_ID \
--xks-key-id $EXTERNAL_KEY_ID \
--query 'KeyMetadata.KeyId' \
--output text)
echo "Created KMS Key: $KEY_ID"3
エイリアスの作成
Create Key AliasBASH
# Create alias
aws kms create-alias \
--alias-name alias/production-s3-encryption \
--target-key-id $KEY_ID
# Verify alias
aws kms describe-key --key-id alias/production-s3-encryption4
キーポリシーの設定
Configure Key PolicyBASH
# Create key policy JSON
cat > key-policy.json <<EOF
{
"Version": "2012-10-17",
"Id": "xks-key-policy",
"Statement": [
{
"Sid": "Enable IAM User Permissions",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:root"
},
"Action": "kms:*",
"Resource": "*"
},
{
"Sid": "Allow S3 to use the key",
"Effect": "Allow",
"Principal": {
"Service": "s3.amazonaws.com"
},
"Action": [
"kms:Decrypt",
"kms:GenerateDataKey"
],
"Resource": "*"
}
]
}
EOF
# Apply key policy
aws kms put-key-policy \
--key-id $KEY_ID \
--policy-name default \
--policy file://key-policy.jsonキーライフサイクル管理
キーの有効化と無効化
| 操作 | コマンド | 影響 |
|---|---|---|
| キーの無効化 | aws kms disable-key --key-id $KEY_ID | 再度有効化されるまですべての暗号操作が失敗する |
| キーの有効化 | aws kms enable-key --key-id $KEY_ID | キーを運用可能な状態に復元する |
Enable/Disable KeysBASH
# Disable the key
aws kms disable-key --key-id $KEY_ID
# Verify key state
aws kms describe-key --key-id $KEY_ID \
--query 'KeyMetadata.KeyState' \
--output text
# Output: Disabled
# Enable the key
aws kms enable-key --key-id $KEY_IDキー削除のスケジュール
警告
一度削除されると、このキーで暗号化されたすべてのデータは復元不可能になります!
Schedule Key DeletionBASH
# Schedule key deletion (7-30 days waiting period)
aws kms schedule-key-deletion \
--key-id $KEY_ID \
--pending-window-in-days 30
# Verify deletion is scheduled
aws kms describe-key --key-id $KEY_ID \
--query 'KeyMetadata.{State:KeyState,DeletionDate:DeletionDate}' \
--output json
# Cancel deletion if needed
aws kms cancel-key-deletion --key-id $KEY_ID外部キーのローテーション
重要
標準の KMS キーとは異なり、外部キーストアは自動キーローテーションをサポートしていません。外部キーマネージャーでキーを手動でローテーションする必要があります。
同じキー ID を維持したまま、外部キーマネージャーでキーマテリアルをローテーションします。
In-Place RotationBASH
# HashiCorp Vault - rotate key material
vault write -f transit/keys/my-external-key/rotate
# Verify new version
vault read transit/keys/my-external-key| 長所 | 短所 |
|---|---|
| AWS KMS での変更が不要 | バージョン保持がないと古いデータが復号できない可能性がある |
| アプリケーションが変更なしで継続できる | キーマネージャーのバージョンサポートが必要 |
| 同じ KMS キー ID とエイリアスを維持 |
キーの検出とインベントリ
List and Describe KeysBASH
# Get key details
aws kms describe-key --key-id $KEY_ID \
--query 'KeyMetadata.{
KeyId:KeyId,
XksKeyId:XksKeyId,
KeyState:KeyState,
CreationDate:CreationDate,
CustomKeyStoreId:CustomKeyStoreId,
Origin:Origin
}' \
--output json
# List all aliases for a key
aws kms list-aliases \
--key-id $KEY_ID \
--query 'Aliases[*].AliasName' \
--output text
# Get key usage metrics
aws cloudwatch get-metric-statistics \
--namespace AWS/KMS \
--metric-name NumberOfCalls \
--dimensions Name=KeyId,Value=$KEY_ID \
--start-time $(date -u -d '7 days ago' '+%Y-%m-%dT%H:%M:%S') \
--end-time $(date -u '+%Y-%m-%dT%H:%M:%S') \
--period 3600 \
--statistics Sum \
--output tableキーグラント
Manage Key GrantsBASH
# Create grant for specific operations
GRANT_TOKEN=$(aws kms create-grant \
--key-id $KEY_ID \
--grantee-principal arn:aws:iam::123456789012:role/LambdaExecutionRole \
--operations Encrypt Decrypt GenerateDataKey \
--query 'GrantToken' \
--output text)
# Create grant with constraints
aws kms create-grant \
--key-id $KEY_ID \
--grantee-principal arn:aws:iam::123456789012:role/DataProcessingRole \
--operations Decrypt \
--constraints EncryptionContextSubset={Department=Finance} \
--name "Finance-Data-Processing-Grant"
# List grants
aws kms list-grants --key-id $KEY_ID \
--query 'Grants[*].{
GrantId:GrantId,
GranteePrincipal:GranteePrincipal,
Operations:Operations,
Name:Name
}' \
--output table
# Revoke grant
aws kms revoke-grant \
--key-id $KEY_ID \
--grant-id $GRANT_IDキー操作のテスト
Test Encryption/DecryptionBASH
# Create test file
echo "Sensitive data for testing" > test-plaintext.txt
# Encrypt data
aws kms encrypt \
--key-id $KEY_ID \
--plaintext fileb://test-plaintext.txt \
--output text \
--query CiphertextBlob | base64 -d > test-encrypted.bin
echo "Encryption successful"
# Decrypt the data
aws kms decrypt \
--ciphertext-blob fileb://test-encrypted.bin \
--output text \
--query Plaintext | base64 -d > test-decrypted.txt
# Verify decrypted content matches original
diff test-plaintext.txt test-decrypted.txt && echo "Decryption successful"
# Generate data key
aws kms generate-data-key \
--key-id $KEY_ID \
--key-spec AES_256 \
--query '{Plaintext:Plaintext,CiphertextBlob:CiphertextBlob}' \
--output json > data-key.jsonキー操作のトラブルシューティング
ベストプラクティス
キー管理のベストプラクティス
わかりやすい名前を使用するキーに意味のある説明とタグを付ける
最小権限必要最小限の権限を付与する
定期的な監査キーの使用状況と権限を定期的に監査する
キーの用途を文書化する各キーが保護する対象のドキュメントを維持する
キーの使用状況を監視する異常なアクティビティに対して CloudWatch アラームを設定する
環境を分離する開発、ステージング、本番で異なるキーを使用する
タグ付け戦略
Apply Consistent TagsBASH
aws kms tag-resource \
--key-id $KEY_ID \
--tags \
TagKey=Environment,TagValue=Production \
TagKey=Application,TagValue=CustomerData \
TagKey=Owner,TagValue=SecurityTeam \
TagKey=CostCenter,TagValue=IT-Security \
TagKey=Compliance,TagValue=PCI-DSS \
TagKey=DataClassification,TagValue=Confidential \
TagKey=BackupRequired,TagValue=Yes \
TagKey=RotationSchedule,TagValue=Quarterly