Akemi

将镜像仓库信息保存到Secret与反向解密

2025/04/22

在k8s集群中,往往需要方便的拉取服务所需镜像,但镜像仓库账密铁铁是机密,肯定不能明文存储

那么如何将镜像仓库账号密码,以dockerconfigjson形式存储在Secret中,使服务可以使用imagePullSecrets的形式方便的进行引用呢?

创建Secret

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
kubectl create secret docker-registry <secret-name> \
--docker-server=<registry-url> \
--docker-username=<username> \
--docker-password=<password> \

# 这是我内网的一个harbor仓库
kubectl create secret docker-registry harbor \
--docker-server="192.168.10.130" \
--docker-username="admin" \
--docker-password="Harbor12345"
# secret/harbor created

kubectl get secrets
NAME TYPE DATA AGE
default-token-xmc6r kubernetes.io/service-account-token 3 75d
harbor kubernetes.io/dockerconfigjson 1 22s

kubectl describe secrets harbor
Name: harbor
Namespace: default
Labels: <none>
Annotations: <none>

Type: kubernetes.io/dockerconfigjson

Data
====
.dockerconfigjson: 108 bytes

解密dockerconfigjson

那么现在我们看到了集群中有这么一个Secret,类型是dockerconfigjson

从其中应该如何反推出其仓库地址,账号和密码呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
kubectl get secrets
NAME TYPE DATA AGE
default-token-xmc6r kubernetes.io/service-account-token 3 75d
harbor kubernetes.io/dockerconfigjson 1 113s

# 取出.dockerconfigjson的data
kubectl get secrets harbor -o yaml
apiVersion: v1
data:
.dockerconfigjson: eyJhdXRocyI6eyIxOTIuMTY4LjEwLjEzMCI6eyJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiJIYXJib3IxMjM0NSIsImF1dGgiOiJZV1J0YVc0NlNHRnlZbTl5TVRJek5EVT0ifX19
kind: Secret
metadata:
creationTimestamp: "2025-04-22T13:52:48Z"
name: harbor
namespace: default
resourceVersion: "8027982"
uid: 1591f404-af7d-4169-b70b-c3a1be3935b9
type: kubernetes.io/dockerconfigjson

json也行,随你喜欢

# 将其复制出来进行base64解密
echo -n "eyJhdXRocyI6eyIxOTIuMTY4LjEwLjEzMCI6eyJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiJIYXJib3IxMjM0NSIsImF1dGgiOiJZV1J0YVc0NlNHRnlZbTl5TVRJek5EVT0ifX19" \
| base64 -d

{"auths":{"192.168.10.130":{"username":"admin","password":"Harbor12345","auth":"YWRtaW46SGFyYm9yMTIzNDU="}}}
此时已经可以看出来endpoint和username和password的

有时候只有一个auth字段
可以将auth字段再次进行解密
echo -n "YWRtaW46SGFyYm9yMTIzNDU=" | base64 -d
admin:Harbor12345

得到用户名和密码,中间使用冒号隔开
CATALOG