所以我刚刚学习了一个非常有用的 k8s 基础,我错过了,然后发现它有一个与之相关的安全漏洞,并想出了一个解决方案。
TLDR:
您可以在您的秘密仓库中将明文多行字符串/文本文件作为 secret.yaml !:)
(注意我建议将其存储在 Hashicorp Vault 中,您可以存储具有秘密的版本化配置文件,并通过 Vault 网页轻松查看/编辑它们,并且与 git repo 不同,您可以进行细粒度访问控制,管道可以使用REST API 来提取更新的秘密,这也使密码轮换变得很容易。)
cleartext-appsettings-secret.yaml
appsettings.Dummy.json 是默认文件名(密钥的密钥)
(我使用单词默认文件名,因为您可以在 yaml 挂载中覆盖它)
并且明文 json 代码是文件内容(秘密值)
apiVersion: v1
kind: Secret
metadata:
name: appsettings
namespace: api
type: Opaque
stringData:
appsettings.Dummy.json: |-
{
"Dummy": {
"Placeholder": {
"Password": "blank"
}
}
}
当我
kubectl apply -f cleartext-appsettings-secret.yaml
kubectl get secret appsettings -n=api -o yaml
秘密在注释中显示明文...
apiVersion: v1
data:
appsettings.Dummy.json: ewogICJEdW1teSI6IHsKICAgICJQbGFjZWhvbGRlciI6IHsKICAgICAgIlBhc3N3b3JkIjogImJsYW5rIgogICAgfQogIH0KfQ==
kind: Secret
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Secret","metadata":{"annotations":{},"name":"appsettings","namespace":"api"},"stringData":{"appsettings.Dummy.json":"{\n \"Dummy\": {\n \"Placeholder\": {\n \"Password\": \"blank\"\n }\n }\n}"},"type":"Opaque"}
creationTimestamp: 2019-01-31T02:50:16Z
name: appsettings
namespace: api
resourceVersion: "4909"
selfLink: /api/v1/namespaces/api/secrets/appsettings
uid: f0629027-2502-11e9-9375-6eb4e0983acc
显然,用于创建注释中显示的秘密的 yaml 是 kubectl apply -f secret.yaml 自 2016 年以来的预期行为/已作为错误报告发布,但问题在没有解决的情况下关闭/他们忽略了它而不是修复它。
如果您是原始的 secret.yaml 是 base64 的,则注释至少是 base64 的,但在这种情况下,它是非 base64 的人类可读明文。
注意1:命令式秘密创建不会发生这种情况
kubectl create secret generic appsettings --from-file appsettings.Dummy.json --namespace=api
注意 2:支持声明性 appsettings-secret.yaml 的另一个原因是,当需要编辑 kubectl apply -f 时将配置密钥,但如果您运行该 create 命令,它会说错误已经存在,您必须删除它,然后它会让您再次运行创建命令。
注意 3: kubectl create secret generic name --from-file file --namespace / 反对 secret.yaml 的一个原因是 kubectl show secret 不会向您显示上次编辑秘密的时间。与创建命令一样,因为您必须在重新创建它之前将其删除,您将根据它存在的时间知道它最后一次编辑的时间,因此这对审计试用很有好处。(但有更好的审计方法)
kubectl apply -f cleartext-appsettings-secret.yaml
kubectl annotate secret appsettings -n=api kubectl.kubernetes.io/last-applied-configuration-
kubectl get secret appsettings -n=api -o yaml
抵消泄露
apiVersion: v1
data:
appsettings.Dummy.json: ewogICJEdW1teSI6IHsKICAgICJQbGFjZWhvbGRlciI6IHsKICAgICAgIlBhc3N3b3JkIjogImJsYW5rIgogICAgfQogIH0KfQ==
kind: Secret
metadata:
creationTimestamp: 2019-01-31T03:06:55Z
name: appsettings
namespace: api
resourceVersion: "6040"
selfLink: /api/v1/namespaces/api/secrets/appsettings
uid: 43f1b81c-2505-11e9-9375-6eb4e0983acc
type: Opaque