Zum Hauptinhalt springen

Schlüsselverwaltung

Gilt für:
AWS KMSExternal Key StoreKey Lifecycle

Ü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​

1

Externen Schlüssel im Schlüsselmanager erstellen

Erstellen Sie einen 256-Bit-AES-Schlüssel in Ihrem externen Schlüsselmanager.

Vault-Transit-Schlüssel erstellenBASH
# 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

KMS-Schlüssel in AWS erstellen

KMS-Schlüssel erstellenBASH
# 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

Alias erstellen

Schlüssel-Alias erstellenBASH
# 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

Schlüsselrichtlinie festlegen

Schlüsselrichtlinie konfigurierenBASH
# 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

Verwaltung des Schlüssellebenszyklus​

Schlüssel aktivieren und deaktivieren​

VorgangBefehlAuswirkung
Schlüssel deaktivierenaws kms disable-key --key-id $KEY_IDAlle kryptografischen Vorgänge schlagen fehl, bis der Schlüssel wieder aktiviert wird
Schlüssel aktivierenaws kms enable-key --key-id $KEY_IDStellt den betriebsbereiten Zustand des Schlüssels wieder her
Schlüssel aktivieren/deaktivierenBASH
# 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

Schlüssellöschung planen​

Warnung

Nach dem Löschen werden alle mit diesem Schlüssel verschlüsselten Daten unwiederbringlich!

Schlüssellöschung planenBASH
# 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 externer Schlüssel​

Wichtig

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:

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
VorteileNachteile
Keine Änderungen in AWS KMS erforderlichAlte Daten lassen sich ohne Versionserhaltung möglicherweise nicht entschlüsseln
Anwendungen laufen ohne Änderung weiterErfordert Versionsunterstützung durch den Schlüsselmanager
Behält dieselbe KMS-Schlüssel-ID und denselben Alias bei

Schlüsselerkennung und -inventar​

Schlüssel auflisten und beschreibenBASH
# 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

Schlüssel-Grants​

Schlüssel-Grants verwaltenBASH
# 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

Schlüsselvorgänge testen​

Verschlüsselung/Entschlüsselung testenBASH
# 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

Fehlerbehebung bei Schlüsselvorgängen​

Best Practices​

Best Practices für die Schlüsselverwaltung

Aussagekräftige Namen verwendenSinnvolle Beschreibungen und Tags für Schlüssel
Least PrivilegeNur die minimal erforderlichen Berechtigungen gewähren
Regelmäßige AuditsSchlüsselnutzung und Berechtigungen regelmäßig prüfen
Schlüsselzweck dokumentierenDokumentation darüber führen, was jeder Schlüssel schützt
Schlüsselnutzung überwachenCloudWatch-Alarme für ungewöhnliche Aktivitäten einrichten
Umgebungen trennenUnterschiedliche Schlüssel für Entwicklung, Staging und Produktion verwenden

Tagging-Strategie​

Einheitliche Tags anwendenBASH
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

Nächste Schritte​