如何在 Kubernetes 秘密中生成随机字符串/密码
How to generate a random string / password in Kubernetes secrets
目前,我使用静态文件部署我的应用程序pods,其中之一是app-secrets.yaml
,其中包含部署应用程序的所有秘密
---
apiVersion: v1
kind: Secret
metadata:
name: app-secrets
type: Opaque
data:
root: xxxxxx
user1: xxxxxx
user2: xxxxxx
但这既不安全也不方便(如果我需要另一个应用程序实例,我必须使用人工生成的密码创建另一个文件)。
我希望在创建应用程序时生成随机密码,但我不知道这是否可行。
我已经查看了 secret 主题,尤其是 secretGenerator
但这并不是我所理解的直接内容,因为它不会创建随机字符串,而是创建一个随机秘密名称,如 secret/app-secrets-ssdsdfmfh4k
但我仍然必须提供密码。
您可能想要使用 kubernetes-secret-generator。我已经测试过了,它正在做你需要的。
要完成它,您必须在集群中安装 helm 并按照以下说明操作:
克隆存储库
$ git clone https://github.com/mittwald/kubernetes-secret-generator
创建 helm 部署
$ helm upgrade --install secret-generator ./deploy/chart
现在你要使用它,你只需要
Add annotation secret-generator.v1.mittwald.de/autogenerate
to any
Kubernetes secret object .The value of the annotation can be a field
name (or comma separated list of field names) within the secret; the
SecretGeneratorController will pick up this annotation and add a field
[or fields] (password
in the example below) to the secret with a
randomly generated string value. From here.
$ kubectl apply -f mysecret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
annotations:
secret-generator.v1.mittwald.de/autogenerate: password
data:
username: UGxlYXNlQWNjZXB0Cg==
应用此秘密后,您可以查看它以检查密码是否按预期生成:
$ kubectl get secrets mysecret -o yaml
apiVersion: v1
data:
password: dnVKTDBJZ0tFS1BacmtTMnBuc3d2YWs2YlZsZ0xPTUFKdStDa3dwUQ==
username: UGxlYXNlQWNjZXB0Cg==
kind: Secret
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","data":{"username":"UGxlYXNlQWNjZXB0Cg=="},"kind":"Secret","metadata":{"annotations":{"secret-generator.v1.mittwald.de/autogenerate":"password"},"name":"mysecret","namespace":"default"}}
secret-generator.v1.mittwald.de/autogenerate: password
secret-generator.v1.mittwald.de/autogenerate-generated-at: 2020-01-09 14:29:44.397648062
+0000 UTC m=+664.011602557
secret-generator.v1.mittwald.de/secure: "yes"
creationTimestamp: "2020-01-09T14:29:44Z"
name: mysecret
namespace: default
resourceVersion: "297425"
selfLink: /api/v1/namespaces/default/secrets/mysecret
uid: 7ae42d71-32ec-11ea-92b3-42010a800009
type: Opaque
如我们所见,密码已生成并根据需要进行了加密。
Kubernetes 本身没有这个功能。
如果您想自己手动执行此操作,请查看此 question
如果您想自动执行此手动任务,则可以使用此自定义 controller 来执行此操作。
将注释 secret-generator.v1.mittwald.de/autogenerate 添加到任何 Kubernetes 秘密对象。注释的值可以是秘密中的字段名称(或以逗号分隔的字段名称列表); SecretGeneratorController 将选取此注释并使用随机生成的字符串值
添加一个字段 [或字段](下例中的密码)到秘密
你也可以这样做:
$ head /dev/urandom | tr -dc A-Za-z0-9 | head -c 8 ; echo '' | base64 | kubectl create secret generic mysecret --from-literal=password=-
不方便的是你每次 运行 命令时都需要更改秘密名称,但看起来你已经有了生成随机秘密名称的机制。
注意:改变head -c 8
中的数字来控制字符串的长度。
为了借鉴@suren 的回答,今天应该这样做
如果要晒运行,
head /dev/urandom | tr -dc A-Za-z0-9 | head -c 8 | kubectl create secret generic xxx --dry-run=client --from-file=password=/dev/stdin -o json
要创建秘密并解码,
head /dev/urandom | tr -dc A-Za-z0-9 | head -c 8 | kubectl create secret generic xxx --from-file=password=/dev/stdin
kubectl get secret xxx -o jsonpath='{.data.password}' | base64 -d
目前,我使用静态文件部署我的应用程序pods,其中之一是app-secrets.yaml
,其中包含部署应用程序的所有秘密
---
apiVersion: v1
kind: Secret
metadata:
name: app-secrets
type: Opaque
data:
root: xxxxxx
user1: xxxxxx
user2: xxxxxx
但这既不安全也不方便(如果我需要另一个应用程序实例,我必须使用人工生成的密码创建另一个文件)。
我希望在创建应用程序时生成随机密码,但我不知道这是否可行。
我已经查看了 secret 主题,尤其是 secretGenerator
但这并不是我所理解的直接内容,因为它不会创建随机字符串,而是创建一个随机秘密名称,如 secret/app-secrets-ssdsdfmfh4k
但我仍然必须提供密码。
您可能想要使用 kubernetes-secret-generator。我已经测试过了,它正在做你需要的。
要完成它,您必须在集群中安装 helm 并按照以下说明操作:
克隆存储库
$ git clone https://github.com/mittwald/kubernetes-secret-generator
创建 helm 部署
$ helm upgrade --install secret-generator ./deploy/chart
现在你要使用它,你只需要
Add annotation
secret-generator.v1.mittwald.de/autogenerate
to any Kubernetes secret object .The value of the annotation can be a field name (or comma separated list of field names) within the secret; the SecretGeneratorController will pick up this annotation and add a field [or fields] (password
in the example below) to the secret with a randomly generated string value. From here.
$ kubectl apply -f mysecret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
annotations:
secret-generator.v1.mittwald.de/autogenerate: password
data:
username: UGxlYXNlQWNjZXB0Cg==
应用此秘密后,您可以查看它以检查密码是否按预期生成:
$ kubectl get secrets mysecret -o yaml
apiVersion: v1
data:
password: dnVKTDBJZ0tFS1BacmtTMnBuc3d2YWs2YlZsZ0xPTUFKdStDa3dwUQ==
username: UGxlYXNlQWNjZXB0Cg==
kind: Secret
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","data":{"username":"UGxlYXNlQWNjZXB0Cg=="},"kind":"Secret","metadata":{"annotations":{"secret-generator.v1.mittwald.de/autogenerate":"password"},"name":"mysecret","namespace":"default"}}
secret-generator.v1.mittwald.de/autogenerate: password
secret-generator.v1.mittwald.de/autogenerate-generated-at: 2020-01-09 14:29:44.397648062
+0000 UTC m=+664.011602557
secret-generator.v1.mittwald.de/secure: "yes"
creationTimestamp: "2020-01-09T14:29:44Z"
name: mysecret
namespace: default
resourceVersion: "297425"
selfLink: /api/v1/namespaces/default/secrets/mysecret
uid: 7ae42d71-32ec-11ea-92b3-42010a800009
type: Opaque
如我们所见,密码已生成并根据需要进行了加密。
Kubernetes 本身没有这个功能。
如果您想自己手动执行此操作,请查看此 question
如果您想自动执行此手动任务,则可以使用此自定义 controller 来执行此操作。
将注释 secret-generator.v1.mittwald.de/autogenerate 添加到任何 Kubernetes 秘密对象。注释的值可以是秘密中的字段名称(或以逗号分隔的字段名称列表); SecretGeneratorController 将选取此注释并使用随机生成的字符串值
添加一个字段 [或字段](下例中的密码)到秘密你也可以这样做:
$ head /dev/urandom | tr -dc A-Za-z0-9 | head -c 8 ; echo '' | base64 | kubectl create secret generic mysecret --from-literal=password=-
不方便的是你每次 运行 命令时都需要更改秘密名称,但看起来你已经有了生成随机秘密名称的机制。
注意:改变head -c 8
中的数字来控制字符串的长度。
为了借鉴@suren 的回答,今天应该这样做
如果要晒运行,
head /dev/urandom | tr -dc A-Za-z0-9 | head -c 8 | kubectl create secret generic xxx --dry-run=client --from-file=password=/dev/stdin -o json
要创建秘密并解码,
head /dev/urandom | tr -dc A-Za-z0-9 | head -c 8 | kubectl create secret generic xxx --from-file=password=/dev/stdin
kubectl get secret xxx -o jsonpath='{.data.password}' | base64 -d