STACKIT KMS – Verschlüsselungsschlüssel verwalten
Verschlüsselung ist nur so sicher wie die Verwaltung der Schlüssel. Wenn du Daten in der Cloud verschlüsselst, brauchst du einen zentralen Ort, um Schlüssel sicher zu generieren, zu speichern und zu rotieren. STACKIT KMS (Key Management Service) bietet genau das.
Was ist KMS?
Ein Key Management Service verwaltet den gesamten Lebenszyklus kryptografischer Schlüssel:
- Sichere Generierung – Schlüssel werden in Hardware Security Modules (HSM) erzeugt
- Zentrale Verwaltung – Alle Schlüssel an einem Ort mit Zugriffskontrolle
- Automatische Rotation – Regelmäßiger Schlüsselwechsel ohne Downtime
- Envelope Encryption – Datenschlüssel werden mit einem Master Key verschlüsselt
- Audit-Trail – Jede Schlüsselverwendung wird protokolliert
:::info KMS-Schlüssel verlassen niemals das HSM im Klartext – alle kryptografischen Operationen finden innerhalb der sicheren Hardware statt. :::
Tutorial: Verschlüsselung mit STACKIT KMS
1. Master Key erstellen
stackit kms key create \
--name my-master-key \
--project-id your-project-id \
--key-type AES_256 \
--description "Master Key für Produktionsdaten"
2. Envelope Encryption verstehen
Beim Envelope-Encryption-Pattern verschlüsselst du Daten mit einem Data Key, der wiederum vom Master Key geschützt wird:
graph TD
A[Master Key im HSM] -->|verschlüsselt| B[Data Key verschlüsselt]
A -->|erzeugt| C[Data Key Klartext]
C -->|verschlüsselt| D[Deine Daten]
B -->|gespeichert neben| D
3. Data Key generieren
stackit kms key generate-data-key \
--key-id your-master-key-id \
--project-id your-project-id \
--key-spec AES_256
4. Envelope Encryption in der Anwendung
import base64
from cryptography.fernet import Fernet
# Data Key vom KMS anfordern
data_key_response = kms_client.generate_data_key(
key_id="your-master-key-id"
)
plaintext_key = data_key_response["plaintext"]
encrypted_key = data_key_response["ciphertext"]
# Daten verschlüsseln
fernet = Fernet(base64.urlsafe_b64encode(plaintext_key))
encrypted_data = fernet.encrypt(b"Sensible Daten hier")
# Klartext-Key sofort aus dem Speicher löschen
del plaintext_key
# Verschlüsselten Key + Daten zusammen speichern
store(encrypted_key, encrypted_data)
5. Daten entschlüsseln
# Verschlüsselten Data Key vom KMS entschlüsseln lassen
decrypted_key = kms_client.decrypt(
key_id="your-master-key-id",
ciphertext=encrypted_key
)
fernet = Fernet(base64.urlsafe_b64encode(decrypted_key["plaintext"]))
original_data = fernet.decrypt(encrypted_data)
6. Automatische Schlüsselrotation
stackit kms key update \
--key-id your-master-key-id \
--project-id your-project-id \
--rotation-interval 90d \
--auto-rotation enabled
:::tip Bei der Rotation wird ein neuer Schlüssel erzeugt, aber der alte bleibt zum Entschlüsseln bestehender Daten verfügbar. :::
7. Zugriff einschränken
{
"policy": {
"statements": [
{
"effect": "Allow",
"principals": ["service-account:backend-app"],
"actions": ["kms:Encrypt", "kms:Decrypt", "kms:GenerateDataKey"],
"resources": ["keys/your-master-key-id"]
}
]
}
}
:::danger
Vergib niemals kms:*-Berechtigungen. Beschränke den Zugriff auf die minimal notwendigen Operationen.
:::
Nächste Schritte
- Integriere KMS mit STACKIT Object Storage für serverseitige Verschlüsselung (SSE)
- Richte Audit-Logging ein, um alle Schlüsselzugriffe zu überwachen
- Implementiere Key Policies für verschiedene Umgebungen (Dev, Staging, Prod)
- Plane ein Notfall-Verfahren für den Fall, dass ein Schlüssel kompromittiert wird