解码Kubernetes秘密

时间:2019-07-05 20:59:46

标签: docker kubernetes

我继承了Kubernetes / Docker的设置,并且由于更改与数据库密码有关的内容而无意中弄坏了pod。

我正在尝试解决此问题。

我没有太多的Kubernetes或Docker经验,所以我仍在学习如何做事。

该值包含在我认为的db-user-pass凭据中,这是一个不透明的类型机密。

我正在描述它:

kubectl describe secrets/db-user-pass
Name:         db-user-pass
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password:  16 bytes
username:  13 bytes

但是我不知道如何从这个秘密中获取任何数据。 Kubernetes网站上的示例似乎假设我将使用base64编码的字符串,但我什至无法理解。我该如何获得价值?

12 个答案:

答案 0 :(得分:4)

如果您有jq(json查询),则可以使用:

kubectl get secret db-user-pass -o json | jq '.data | map_values(@base64d)'

答案 1 :(得分:2)

这是您可能正在寻找的link

Kubernetes机密需要以base64编码格式给出机密,如果使用Linux发行版,则可以使用base64二进制文件创建。

示例:

echo "hello" | base64
aGVsbG8K

当我们将密钥作为环境变量或作为卷装入时,Kubernetes会解码base64编码。

答案 2 :(得分:2)

在ubuntu 18+上

kubectl get secrets/db-user-pass --template={{.data.password}} | base64 -d

答案 3 :(得分:2)

如果您的密钥包含破折号(-)或点(.):

kubectl get secret db-user-pass -o=go-template='{{index .data "password"}}' | base64 -d

答案 4 :(得分:1)

您可以使用kubectl get secrets/db-user-pass -oyaml-ojson,在其中您会看到以base64编码的usernamepassword。然后,您可以复制值并使用echo <ENCODED_VALUE> | base64 -D之类的值对其进行解码。

为此,一种更紧凑的单缸纸:

$ kubectl get secrets/db-user-pass --template={{.data.password}} | base64 -D

,同样输入用户名:

$ kubectl get secrets/db-user-pass --template={{.data.username}} | base64 -D

答案 5 :(得分:0)

首先,通过使用kubectl查询api服务器,从etcd中获取秘密。

kubectl get secret db-user-pass -o yaml 

这将为您提供yaml格式的base64编码的机密。

一旦您拥有yaml文件,便使用

对其进行解码
  

“ base64 --decode”

最终命令将如下所示:

echo "jdddjdkkdkdmdl" | base64 --decode

答案 6 :(得分:0)

我建议使用此方便的命令。它利用go-templates的幂。它遍历所有值,对其进行解码,然后将其与键一起打印。它还处理未设置的值。

kubectl get secret name-of-secret -o go-template='
{{range $k,$v := .data}}{{printf "%s: " $k}}{{if not $v}}{{$v}}{{else}}{{$v | base64decode}}{{end}}{{"\n"}}{{end}}'

## In your case it would output
# password: decoded_password
# username: doceded_username

如果您不喜欢go-templates,则可以使用其他输出格式,例如yamljson,但这将输出由base64编码的机密。

答案 7 :(得分:0)

为便于解码,您可以使用ksd之类的工具来为您执行base64解码

kubectl get secrets/db-user-pass -o yaml | ksd

答案 8 :(得分:0)

Kubernetes 1.11 +

kubectl get secrets/db-user-pass --template='{{.data.password | base64decode }}'

答案 9 :(得分:0)

扩展@Břetislav Hájek 解决方案(非常感谢您)。 如果您需要通过标签获取它,那么您需要添加一个额外的 range 命令来迭代返回的项目。

$ LABEL_FILTER="app.kubernetes.io/name=mysql-chart"

$ kubectl get secret  -l "$LABEL_FILTER"  -o go-template='
{{range $i := .items}}{{range $k,$v := $i.data}}{{printf "%s: " $k}}{{if not $v}}{{$v}}{{else}}{{$v | base64decode}}{{end}}{{"\n"}}{{end}}{{end}}'

mysql_password: ...
mysql_root_password: ...
mysql_user: ...

答案 10 :(得分:0)

用 bash。这是运行 ubuntu 18.04 和 Kubernetes 1.18.5

kubectl -n metallb-system get secrets memberlist -o json | grep secretkey | grep -v f:s | awk -F '"' '{print$4}' |base64 --decode; echo

答案 11 :(得分:0)

这一行用于从秘密中获取编码的 kubeconfig 文件,并从中生成一个文件,以便在我们的 ci 作业中动态使用 $() 是您需要填充的变量,因为它是从 makefile 中按原样复制的:

kubectl get secret $(SECRET) -o json | jq -r '.data | map_values(@base64)' | grep -oP '(?<=\"$(SECRET_KEY)\": \")[^\"]*' | base64 --decode | base64 --decode > ./$(KUBECONFIG_FILE_NAME)