Aller au contenu principal

Gestion des clés

S'applique à :
AWS KMSExternal Key StoreKey Lifecycle

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​

1

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 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=false
2

Créer la clé KMS dans AWS

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

Créer un alias

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-encryption
4

Définir la politique de clé

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

Gestion du cycle de vie des clés​

Activation et désactivation des clés​

OpérationCommandeImpact
Désactiver la cléaws kms disable-key --key-id $KEY_IDToutes les opérations cryptographiques échouent jusqu'à réactivation
Activer la cléaws kms enable-key --key-id $KEY_IDRétablit la clé à l'état opérationnel
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

Planification de la suppression des clés​

Avertissement

Une fois supprimée, toutes les données chiffrées avec cette clé deviennent irrécupérables !

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

Rotation des clés externes​

Important

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é :

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
AvantagesInconvénients
Aucune modification nécessaire dans AWS KMSLes anciennes données peuvent ne pas se déchiffrer sans conservation des versions
Les applications continuent sans modificationNé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​

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

Octrois de clés​

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 des opérations de clé​

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

Dépannage des opérations de clé​

Bonnes pratiques​

Bonnes pratiques de gestion des clés

Utiliser des noms descriptifsDescriptions et étiquettes explicites pour les clés
Moindre privilègeAccorder le minimum d'autorisations nécessaires
Audits réguliersAuditer régulièrement l'utilisation et les autorisations des clés
Documenter l'objet des clésTenir à jour la documentation de ce que chaque clé protège
Surveiller l'utilisation des clésConfigurer des alarmes CloudWatch pour toute activité inhabituelle
Séparer les environnementsUtiliser des clés différentes pour le développement, la préproduction et la production

Stratégie d'étiquetage​

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

Étapes suivantes​