Gestion des clés
Gestion des clés
Créez, gérez et effectuez la rotation des clés KMS dans votre magasin de clés externe AWS
Vue d'ensemble
La gestion des clés dans un magasin de clés externe diffère de celle des clés KMS standard, car chaque clé KMS est associée à une clé externe dans votre gestionnaire de clés (HashiCorp Vault, CyberArk, etc.). Vous devez coordonner les opérations entre AWS KMS et votre gestionnaire de clés externe.
Prérequis
- Magasin de clés externe connecté dans AWS KMS
- Clé externe créée au préalable dans votre gestionnaire de clés
- Autorisations IAM et gestionnaire de clés correctement configurées
Création de clés KMS
Créer une clé externe dans le gestionnaire de clés
Créez une clé AES 256 bits dans votre gestionnaire de clés externe.
# 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=falseCréer la clé KMS dans AWS
# 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"Créer un alias
# 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-encryptionDéfinir la politique de clé
# 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.jsonGestion du cycle de vie des clés
Activation et désactivation des clés
| Opération | Commande | Impact |
|---|---|---|
| Désactiver la clé | aws kms disable-key --key-id $KEY_ID | Toutes les opérations cryptographiques échouent jusqu'à réactivation |
| Activer la clé | aws kms enable-key --key-id $KEY_ID | Rétablit la clé à l'état opérationnel |
# 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_IDPlanification de la suppression des clés
Une fois supprimée, toutes les données chiffrées avec cette clé deviennent irrécupérables !
# 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_IDRotation des clés externes
Contrairement aux clés KMS standard, les magasins de clés externes ne prennent pas en charge la rotation automatique des clés. Vous devez faire tourner les clés manuellement dans votre gestionnaire de clés externe.
Faites tourner le matériel de clé dans votre gestionnaire de clés externe tout en conservant le même ID de clé :
# HashiCorp Vault - rotate key material
vault write -f transit/keys/my-external-key/rotate
# Verify new version
vault read transit/keys/my-external-key| Avantages | Inconvénients |
|---|---|
| Aucune modification nécessaire dans AWS KMS | Les anciennes données peuvent ne pas se déchiffrer sans conservation des versions |
| Les applications continuent sans modification | Nécessite la prise en charge des versions par le gestionnaire de clés |
| Conserve le même ID et alias de clé KMS |
Découverte et inventaire des clés
# 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 tableOctrois de clés
# 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_IDTest des opérations de clé
# 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.jsonDépannage des opérations de clé
Bonnes pratiques
Bonnes pratiques de gestion des clés
Stratégie d'étiquetage
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