Bewährte Praktiken für die Verwaltung von Geheimnissen und sensiblen Daten in Kubernetes-Clustern
Sichern Sie Kubernetes-Geheimnisse mit RBAC, etcd-Verschlüsselung, sichereren Mounts, externen Geheimnisspeichern, CSI-Treiber und Rotation.
Bewährte Praktiken für die Verwaltung von Geheimnissen und sensiblen Daten in Kubernetes-Clustern
Kubernetes-Geheimnisse sind praktisch, aber sie sind nicht automatisch sicher, nur weil das Objekt Secret heißt. Wenn Ihre RBAC zu weit gefasst ist oder etcd nicht verschlüsselt ist, kann ein durchgesickertes Token Datenbankpasswörter, API-Schlüssel und private Zertifikate in Ihrem gesamten Cluster offenlegen.
Verwenden Sie Kubernetes-Geheimnisse als eine Schicht und fügen Sie dann Verschlüsselung, Zugriffskontrolle, sicherere Injektionsmuster und externe Geheimnisspeicher hinzu, wo das Risiko dies rechtfertigt.
Kubernetes-Geheimnisse verstehen: Der Standardmechanismus
Kubernetes führt das Secret-Objekt ein, das speziell für die Aufbewahrung sensibler Informationen entwickelt wurde. Obwohl es nützlich ist, ist es entscheidend, seine Einschränkungen und das Standardverhalten in Bezug auf Sicherheit zu verstehen.
Standardverhalten und Einschränkungen
Standardmäßig sind Kubernetes-Geheimnisse nicht im Ruhezustand verschlüsselt in etcd, dem Backend-Speicher des Clusters für alle Konfigurationsdaten. Sie sind lediglich Base64-kodiert, was keine tatsächliche Verschlüsselung bietet. Jeder mit Zugriff auf den etcd-Datenspeicher (z. B. Cluster-Administratoren, kompromittierte Knoten) kann diese Werte leicht dekodieren.
Warnung: Verlassen Sie sich niemals ausschließlich auf das standardmäßige Kubernetes-Secret-Objekt für hochsensible Daten, ohne Verschlüsselungsmaßnahmen anzuwenden.
Base64-Kodierung vs. Verschlüsselung
Es ist ein häufiges Missverständnis, dass Base64-Kodierung Sicherheit bietet. Base64 ist ein Kodierungsschema, kein Verschlüsselungsschema. Es ist leicht umkehrbar:
# Beispiel für das Dekodieren eines Kubernetes-Secret-Werts
echo 'c3VwZXItc2VjcmV0Cg==' | base64 -d
# Ausgabe: super-secret
Schicht 1: Sicherung von Geheimnissen im Ruhezustand (etcd-Verschlüsselung)
Der grundlegendste Schritt zur Sicherung von Geheimnissen besteht darin, sicherzustellen, dass sie auf der Speicherebene (etcd) verschlüsselt sind. Dies schützt Daten, selbst wenn die zugrunde liegende Datenbank direkt zugegriffen wird.
Aktivieren der Verschlüsselung im Ruhezustand
Die Verschlüsselung im Ruhezustand wird über den Kubernetes-API-Server mithilfe eines EncryptionConfiguration-Objekts konfiguriert. Diese Konfiguration gibt an, welche Anbieter zur Verschlüsselung verschiedener Arten von in etcd gespeicherten Daten verwendet werden sollen, einschließlich secrets.
Schlüsselkomponenten der Verschlüsselungskonfiguration:
kind: EncryptionConfiguration: Deklariert den Ressourcentyp.resources: Gibt an, welche API-Ressourcen verschlüsselt werden sollen.providers: Definiert den Verschlüsselungsmechanismus. Häufige Anbieter sindaescbc,aesgcmund KMS-Anbieter (wie AWS KMS oder GCP KMS).
Bewährte Praxis: Verwenden Sie einen KMS-Anbieter, wenn Ihre Plattform dies unterstützt. Wenn Sie lokale Schlüssel verwenden, verwalten Sie die Schlüsselrotation sorgfältig und behalten Sie alte Schlüssel, bis vorhandene Daten erneut verschlüsselt wurden.
Schicht 2: Sicherung von Geheimnissen während der Übertragung und bei der Verwendung
Während die etcd-Verschlüsselung das Problem "im Ruhezustand" löst, werden Geheimnisse vom Kubelet entschlüsselt, wenn sie in einen Pod eingebunden werden. Wir müssen kontrollieren, wie und wo diese Geheimnisse erscheinen.
Strategie 1: Volume-Mounting von Geheimnissen
Die Standardmethode zum Injizieren von Secret-Daten in einen Container besteht darin, sie als Volume zu mounten (was oft zu einer Datei im Dateisystem des Containers führt).
apiVersion: v1
kind: Pod
metadata:
name: secure-app
spec:
containers:
- name: my-container
image: nginx
volumeMounts:
- name: secret-volume
mountPath: "/etc/config/db"
readOnly: true
volumes:
- name: secret-volume
secret:
secretName: my-sensitive-secret
Sicherheitsaspekt: Gemountete Secret-Volumes werden auf Linux-Knoten normalerweise durch tmpfs unterstützt, aber die Werte sind immer noch für den Containerprozess und für jeden mit ausreichendem Knoten- oder Pod-Zugriff sichtbar. Verwenden Sie readOnly: true, vermeiden Sie das Ausgeben von Umgebungs- oder Konfigurationsdateien in Protokolle und beschränken Sie den Shell-Zugriff auf Produktions-Pods.
Strategie 2: Umgebungsvariablen (für hohe Sensitivität nicht empfohlen)
Obwohl praktisch, wird die Verwendung von Umgebungsvariablen, die aus Geheimnissen stammen, für hochwertige Geheimnisse im Allgemeinen nicht empfohlen. Umgebungsvariablen können leicht durch Folgendes durchsickern:
- Containerprotokolle, die von schlecht konfigurierten Anwendungen generiert werden.
- Lesen von
/proc/1/environinnerhalb des Containers oder anderer privilegierter Container. - Container-Inspektionswerkzeuge.
Verwenden Sie Umgebungsvariablen nur für Konfigurationsdaten mit geringer Sensitivität, wenn Sie sie verwenden müssen.
Schicht 3: Erweiterte Verwaltung mit externen Geheimnisspeichern
Das sicherste Muster besteht darin, sensible Daten vollständig außerhalb der Kubernetes-Steuerungsebene (etcd) zu halten und sie zur Laufzeit mithilfe spezieller Werkzeuge dynamisch abzurufen.
Verwendung externer Geheimnis-Operatoren
Externe Geheimnis-Operatoren überbrücken die Lücke zwischen einem sicher in einem dedizierten Tresor (wie HashiCorp Vault, AWS Secrets Manager, Azure Key Vault) gespeicherten Geheimnis und dem nativen Kubernetes-Secret-Objekt.
- Speicher: Das eigentliche Geheimnis lebt nur im externen Tresor.
- Synchronisieren/Injizieren: Ein Operator überwacht eine benutzerdefinierte Ressource (wie
ExternalSecret) und ruft die Daten aus dem Tresor ab. - Erstellung: Der Operator erstellt dann lokal ein standardmäßiges Kubernetes
Secret-Objekt, das dann in die Pods eingebunden werden kann.
Vorteil: Die Quelle der Wahrheit bleibt außerhalb des Clusters, was Rotation und Prüfbarkeit verbessert. Das synchronisierte Kubernetes-Secret existiert jedoch weiterhin im Cluster, sodass Sie weiterhin RBAC, etcd-Verschlüsselung und Namespace-Isolierung benötigen.
Verwendung des Secrets Store CSI-Treibers
Für Anwendungen, die einen direkten, flüchtigen Zugriff benötigen, ohne das Geheimnis lokal in etcd zu speichern, ist der Secrets Store CSI-Treiber die überlegene Wahl.
- Der Treiber nutzt einen Anbieter (z. B. Vault-Anbieter, Azure-Anbieter).
- Er mountet das Geheimnis direkt aus dem externen Speicher in das Dateisystem des Pods als temporäres Volume, wodurch vermieden wird, die Geheimnisdaten jemals in etcd zu schreiben.
Dies bietet das höchste Sicherheitsniveau, indem das Geheimnis vollständig aus der etcd-Datenbank entfernt wird.
Betriebliche bewährte Praktiken für die Geheimnisverwaltung
Über die technischen Speichermechanismen hinaus ist betriebliche Hygiene entscheidend für die Aufrechterhaltung einer sicheren Haltung.
1. Prinzip der geringsten Privilegien (PoLP)
Stellen Sie sicher, dass das einem Pod zugeordnete Dienstkonto nur Berechtigungen hat, um das spezifische Geheimnis zu lesen, das es benötigt, und keine anderen. Verwenden Sie die rollenbasierte Zugriffskontrolle (RBAC), um Berechtigungen eng zu begrenzen.
2. Geheimnisse häufig rotieren
Implementieren Sie automatisierte Rotationspläne für alle Anmeldeinformationen. Langlebige Geheimnisse vergrößern das Zeitfenster für eine Kompromittierung. Werkzeuge, die in externe Tresore integriert sind, übernehmen diese Rotation oft automatisch.
3. Zugriff prüfen und überwachen
Konfigurieren Sie die Audit-Protokollierung, um zu verfolgen, wer Secret-Objekte liest oder ändert. Werkzeuge, die in externe Tresore integriert sind (wie Vault-Agenten oder CSI-Treiber), sollten ebenfalls Zugriffsversuche auf den externen Speicher protokollieren.
4. Geheimnisse niemals in Git committen
Dies ist eine grundlegende Regel. Speichern Sie niemals rohe oder sogar Base64-kodierte Geheimnisse in Git-Repositorys, selbst in privaten. Verwenden Sie Werkzeuge wie git-secrets oder Konfigurationsmanagement-Templating-Werkzeuge (wie Helm oder Kustomize) in Kombination mit externen Geheimnisinjektionsmechanismen, um Bereitstellungsmanifeste zu verwalten.
Beispiel mit Kustomize (Externe Referenz):
Bei Verwendung von Templating könnten Sie Platzhalter in Ihren Manifestdateien verwenden und sich auf einen Build-Schritt oder eine CI/CD-Pipeline verlassen, um die tatsächlichen Geheimniswerte, die sicher aus einem Tresor abgerufen wurden, vor dem Anwenden des YAML auf den Cluster zu injizieren.
Vergleich der Verwaltungsstrategien
| Strategie | Sicherheitsstufe | etcd-Exposition? | Komplexität | Am besten geeignet für |
|---|---|---|---|---|
| Standard-K8s-Secret (keine etcd-Verschlüsselung) | Sehr niedrig | Ja (Klartext) | Niedrig | Nur temporäre Tests |
| K8s-Secret mit etcd-Verschlüsselung | Mittel | Ja (Verschlüsselt) | Mittel | Allgemeine Konfigurationsdaten |
| Externer Geheimnis-Operator | Hoch | Ja (Operator-verwaltetes Secret) | Hoch | Standardisierung der Geheimnisverwaltung |
| Secrets Store CSI-Treiber | Am höchsten | Nein (Direkter Mount) | Hoch | Hochsensible Anmeldeinformationen und Token |
Beginnen Sie mit der Aktivierung der etcd-Verschlüsselung und der Verschärfung von RBAC. Entscheiden Sie dann, ob jede Arbeitslast synchronisierte Geheimnisse, direkte CSI-Mounts oder dynamische Anmeldeinformationen aus einem externen Tresor verwenden kann. Das beste Setup ist dasjenige, das einschränkt, wer das Geheimnis lesen kann, wo es gespeichert ist und wie lange es nach der Offenlegung nützlich bleibt.