Kubernetes机密可以存储换行符吗?

时间:2018-11-14 10:05:32

标签: kubernetes

我已经使用以下命令从文件中创建了一个秘密:

kubectl create secret generic laravel-oauth \
        --from-file=./.work-in-progress/oauth_private.key \
        --from-file=./.work-in-progress/oauth_public.key

但是,似乎从文件中删除了新行(当使用秘密作为ENV变量时)。

文档中有一个“编码”说明,说明:

  

秘密数据的序列化JSON和YAML值被编码为   base64字符串。换行符在这些字符串中无效,并且必须   被省略。在Darwin / macOS上使用base64实用程序时,用户应   避免使用-b选项分割长行。相反,Linux用户   应该将选项-w 0添加到base64命令或管道base64 |   tr -d'\ n'如果-w选项不可用。

但是我认为这仅适用于通过YAML文件“手动”创建的机密。

3 个答案:

答案 0 :(得分:2)

您所指的注释是针对base64编码的字符串本身的(不是编码的内容)。

将机密用作env var可能会通过仪表板“预览孔”将其公开(如果使用Kube仪表板),则应将其安装到目录中,并让应用从那里加载它们;我也很喜欢这个,感到惊讶的是我能够看到这个秘密。

我还没有遇到换行符的剥离,因为上面的命令只会对内容进行base64处理(包括换行符)。就是说,存储经过b64编码的秘密也不是完全安全的,您应该考虑使用密封秘密(bitnami),它的工作方式与普通秘密一样,但实际上是在静止时进行了加密。

HTH, 亚历克斯

答案 1 :(得分:1)

也不会删除新行,文件也只是base64编码,如其他答案中所述。例如:

# mycert.pem
-----BEGIN CERTIFICATE-----
xxxxxx
xxxxxx
...
-----END CERTIFICATE-----

然后:

$ kubectl create secret generic mysecret --from-file=./cert.pem

然后:

$ kubectl get secret mysecret -o=yaml

apiVersion: v1
data:
  cert.pem: <base64 encoded string>
kind: Secret
metadata:
  creationTimestamp: 2018-11-14T18:11:46Z
  name: mysecret
  namespace: default
  resourceVersion: "20180431"
  selfLink: /api/v1/namespaces/default/secrets/mysecret
  uid: xxxxxx
type: Opaque

然后,如果将其解码,您将获得原始秘密。

$ echo '<base64 encoded string>' | base64 -D
-----BEGIN CERTIFICATE-----
xxxxxx
xxxxxx
...
-----END CERTIFICATE-----

此外,这不一定是安全的。如果您正在寻找更高的安全性,则可以使用类似Hashicorp Vault或@Alex Bitnami's sealed secrets所暗示的名称。

答案 2 :(得分:0)

换行符似乎工作正常(也许我早些时候遇到过另一个问题)。

这是一个完整的例子:

#!/usr/bin/env bash
set -euo pipefail

printf "123\n456\n789" > ./.work-in-progress/example.txt

kubectl create secret generic example-test \
        --from-file=./.work-in-progress/example.txt \
        --dry-run -o yaml | kubectl apply -f -

cat <<EOF | kubectl apply -f -
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: example
  labels:
    app: example
spec:
  replicas: 1
  selector:
    matchLabels:
      app: example
  template:
    metadata:
      labels:
        app: example
    spec:
      volumes:
      - name: example-test-volume
        secret:
          secretName: example-test
      containers:
        - name: app
          command: ["sleep", "99999999"]
          image: busybox:latest
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - name: example-test-volume
              mountPath: /tmp/example
          env:
            - name: exampleenv
              valueFrom:
                secretKeyRef:
                  name: example-test
                  key: example.txt


EOF