解密库伯内特家族的秘密

我继承了一个 Kubernetes/Docker 设置,我不小心改变了一些与数据库密码相关的东西,导致了分离舱的崩溃。

我正在试图解决这个问题。

我没有多少库伯内特或多克的经验,所以我还在学习如何做事情。

该值包含在 db-user-pass 凭据中,我相信这是一个 Opaque 类型的 secret。

我描述的是:

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编码的字符串,但我似乎甚至不能得到这个结果。我如何得到这个值?

172200 次浏览

这就是你要找的 链接

Kubernetes 的秘密需要以 base64编码格式提供,在 Linux 发行版的情况下,可以使用 base64二进制文件创建这种格式。

例如:

echo "hello" | base64
aGVsbG8K

当我们传递密钥时,库伯内特解码 base64编码为环境变量,或者以卷的形式挂载。

您可以使用 kubectl get secrets/db-user-pass -o yaml-o json,其中将看到 base64编码的 usernamepassword。然后您可以复制该值并用类似于 echo <ENCODED_VALUE> | base64 -D(MacOSX)的程序对其进行解码。

一个更简洁的一行程序:

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

用户名也是如此:

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

注意: 在 GNU/Linux 上,base64标志是 -d,而不是 -D

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

kubectl get secret db-user-pass -o yaml

这将以 yaml 格式提供 base64编码的 secret。

一旦你有 yaml 文件解码他们使用

“ Base64——解码”

最终命令如下: 不要忘记 echo 命令中的 -n标志

echo -n "jdddjdkkdkdmdl" | base64 --decode

我建议使用这个方便的命令。它利用了 模板的能量。它迭代所有值,对它们进行解码,并将它们与键一起打印出来。它还处理未设置的值。

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: decoded_username

如果你不喜欢 go-template,你可以使用不同的输出格式,比如 yaml或者 json,但是这会输出 base64编码的秘密。

为了更容易解码,您可以使用像 KSD这样的工具,它将为您执行 base64解码

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

或使用 https://github.com/elsesiy/kubectl-view-secret

kubectl view-secret secrets/db-user-pass

如果你有 jq (json query)这个工具:

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

注意:

  • db-user-pass是 K8s 秘密的名字
  • .data是包含秘密值的变量

在 Ubuntu 18 + 上

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

库伯内特斯1.11 +

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

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

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

扩展@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: ...

使用 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

这一行用于从一个 secret 中获取一个已编码的 kubeconfig 文件,并从中生成一个文件,以便在 ci 作业中动态使用,例如:

kubectl get secret YOUR_SECRET -o json | grep -oP '(?<=\"YOUR_SECRET_KEY\": \")[^\"]*' | base64 --decode > ./YOUR_KUBECONFIG_FILE_NAME

这个 Jsonpath变体为我在 OSX 上工作。

kubectl get secrets/db-user-pass -o jsonpath="{.data.username}" | base64 -d

名字里带点的秘密。

kubectl get secrets/tls -o jsonpath="{.data['tls\.crt']}" | base64 -d

对于 kubectl 1.11 + ,这应该可以在所有平台上工作

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

如果你想得到所有的键,值

kubectl get secrets/db-user-pass --template='\{\{ range $key, $value := .data }}\{\{ printf "%s: %s\n" $key ($value | base64decode) }}\{\{ end }}'

最小节点 CLI 工具(Github)

npm i -g kusd
kubectl get secret your-secret -o yaml | kusd

这将有助于如果你有 yaml 文件的 k8s 秘密。 您可以使用这个 intellij 插件对 yaml 文件中的所有 base64编码值进行解码。 Https://plugins.jetbrains.com/plugin/19099-yaml-base64-decoder