Schlüsselverwaltung
Schlüsselverwaltung
Erstellen, verwalten und rotieren Sie KMS-Schlüssel in Ihrem AWS External Key Store
Überblick
Die Verwaltung von Schlüsseln in einem External Key Store unterscheidet sich von standardmäßigen KMS-Schlüsseln, da jeder KMS-Schlüssel einem externen Schlüssel in Ihrem Schlüsselmanager (HashiCorp Vault, CyberArk usw.) zugeordnet ist. Sie müssen Vorgänge zwischen AWS KMS und Ihrem externen Schlüsselmanager koordinieren.
Voraussetzungen
- External Key Store in AWS KMS verbunden
- Externer Schlüssel zuerst in Ihrem Schlüsselmanager erstellt
- Ordnungsgemäße IAM- und Schlüsselmanager-Berechtigungen konfiguriert
KMS-Schlüssel erstellen
Externen Schlüssel im Schlüsselmanager erstellen
Erstellen Sie einen 256-Bit-AES-Schlüssel in Ihrem externen Schlüsselmanager.
# 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=falseKMS-Schlüssel in AWS erstellen
# 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"Alias erstellen
# 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-encryptionSchlüsselrichtlinie festlegen
# 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.jsonVerwaltung des Schlüssellebenszyklus
Schlüssel aktivieren und deaktivieren
| Vorgang | Befehl | Auswirkung |
|---|---|---|
| Schlüssel deaktivieren | aws kms disable-key --key-id $KEY_ID | Alle kryptografischen Vorgänge schlagen fehl, bis der Schlüssel wieder aktiviert wird |
| Schlüssel aktivieren | aws kms enable-key --key-id $KEY_ID | Stellt den betriebsbereiten Zustand des Schlüssels wieder her |
# 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_IDSchlüssellöschung planen
Nach dem Löschen werden alle mit diesem Schlüssel verschlüsselten Daten unwiederbringlich!
# 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 externer Schlüssel
Im Gegensatz zu standardmäßigen KMS-Schlüsseln unterstützen External Key Stores keine automatische Schlüsselrotation. Sie müssen Schlüssel manuell in Ihrem externen Schlüsselmanager rotieren.
Rotieren Sie das Schlüsselmaterial in Ihrem externen Schlüsselmanager, während Sie dieselbe Schlüssel-ID beibehalten:
# HashiCorp Vault - rotate key material
vault write -f transit/keys/my-external-key/rotate
# Verify new version
vault read transit/keys/my-external-key| Vorteile | Nachteile |
|---|---|
| Keine Änderungen in AWS KMS erforderlich | Alte Daten lassen sich ohne Versionserhaltung möglicherweise nicht entschlüsseln |
| Anwendungen laufen ohne Änderung weiter | Erfordert Versionsunterstützung durch den Schlüsselmanager |
| Behält dieselbe KMS-Schlüssel-ID und denselben Alias bei |
Schlüsselerkennung und -inventar
# 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 tableSchlüssel-Grants
# 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_IDSchlüsselvorgänge testen
# 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.jsonFehlerbehebung bei Schlüsselvorgängen
Best Practices
Best Practices für die Schlüsselverwaltung
Tagging-Strategie
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