如何通过yaml将秘密文件设置为kubernetes的秘密?

时间:2016-04-27 11:04:27

标签: kubernetes yaml kubernetes-secrets

我想将文件存储在Kubernetes Secrets中,但我还没有找到如何使用yaml文件。

我已经能够使用带有kubectl

的cli来创建它
kubectl create secret generic some-secret --from-file=secret1.txt=secrets/secret1.txt

但是当我在yaml中尝试类似的东西时:

apiVersion: v1
kind: Secret
metadata:
  name: some-secret
type: Opaque
data:
  secret1.txt: secrets/secret1.txt

我收到了这个错误:

[pos 73]: json: error decoding base64 binary 'assets/elasticsearch.yml': illegal base64 data at input byte 20

我正在遵循本指南http://kubernetes.io/docs/user-guide/secrets/。它解释了如何使用yaml创建秘密,而不是如何使用yaml文件创建秘密。

有可能吗?如果是这样,我该怎么做?

6 个答案:

答案 0 :(得分:26)

正如前一篇文章所述,我们需要为文件提供编码为based64的证书/密钥。

以下是certiticate(在本例中为SSL)的通用示例:

secret.yml.tmpl

    apiVersion: v1    

    kind: Secret
    metadata:
         name: test-secret
         namespace: default
    type: Opaque
    data:
        server.crt: SERVER_CRT
        server.key: SERVER_KEY

预处理文件以包含证书/密钥:

sed "s/SERVER_CRT/`cat server.crt|base64 -w0`/g" secret.yml.tmpl | \
sed "s/SERVER_KEY/`cat server.key|base64 -w0`/g" | \
kubectl apply -f -

请注意,证书/密钥使用base64编码,没有空格(-w0)。

对于TLS可以简单地说:

kubectl create secret tls test-secret-tls --cert=server.crt --key=server.key

答案 1 :(得分:8)

当使用CLI格式时,您基本上是在使用yaml的生成器之前将其发布到服务器端。

由于Kubernetes是客户端 - 服务器应用程序,其中包含REST API,并且操作需要是原子的,因此发布的YAML需要包含文件的内容,最好的方法是将其嵌入为base64格式排队。如果文件可以嵌入其中会很好(缩进可能用于创建文件的边界),但直到现在我还没有看到任何这样的例子。

话虽如此,在yaml上放置文件引用是不可能的,没有yaml的pre-flight呈现以包含内容。

答案 2 :(得分:2)

只需执行以下操作,即可使用secodebase64编码的字符串替换秘密值:

secode secrets.yaml > secrets_base64.yaml

当在列表(data)中定义时,它对所有kind:Secret文件进行编码,并为每个yaml文件使用多个秘密(kind: List)。

免责声明:我是作者

答案 3 :(得分:1)

您可以使用--dry-run标志来准备包含文件中数据的YAML。

kubectl create secret generic jwt-certificates --from-file=jwt-public.cer --from-file=jwt-private.pfx --dry-run=true  --output=yaml > jwt-secrets.yaml

答案 4 :(得分:0)

对于会议室中的Windows用户,分别对.cer和.key使用此代码(示例显示对.key进行编码以插入到YAML文件中):

$Content = Get-Content -Raw -Path C:\ssl-cert-decrypted.key

[Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($Content)) | Out-File -FilePath C:\ssl-cert-decrypted.key.b64

打开新的.b64文件并将(单行)输出粘贴到您的YAML文件中-请注意,如果将YAML文件签入到包含此信息的源代码回购中,则密钥将有效由于base64不是加密,因此受到损害。

答案 5 :(得分:0)

所以我刚刚了解了我错过的超级有用的k8s基础,然后发现它具有与之相关的安全漏洞,并提出了解决方案。

TLDR:
您可以在秘密存储库中将cleartext多行字符串/文本文件作为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获得秘密的应用程序设置-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创建秘密的通用appsettings --from-file appsettings.Dummy.json --namespace = api

注2:支持声明性appsettings-secret.yaml的另一个原因是,当需要编辑kubectl时,apply -f将配置密码,但是如果运行该create命令,它将说错误已经存在,并且必须先将其删除,然后才能再次运行create命令。

注3:kubectl创建秘密通用名称--from-file文件--namespace的原因/反对secret.yaml的原因是,kubectl show secret不会在上一次编辑该秘密时向您显示。与create命令一样,由于必须先删除它,然后才能重新创建它,所以您会根据其存在的时间知道它的上次编辑时间,因此对于审计试用非常有用。 (但是有更好的审计方法)

kubectl apply -f cleartext-appsettings-secret.yaml
kubectl注释秘密应用程序设置-n = api kubectl.kubernetes.io/last-applied-configuration-
kubectl获取秘密应用程序设置-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