如何规避 Secret 泄露风险

在 k8s 的管理过程中,像 secret 这种资源并不好维护,kubeseal 提供了一种相对简单的方式来对原始 secret 资源进行加密,并通过控制器进行解密,以此来规避 secret 泄露风险。
安装
安装 kubeseal
$ wget https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.18.0/kubeseal-0.18.0-linux-amd64.tar.gz$ tar -xvf kubeseal-0.18.0-linux-amd64.tar.gz$ cp kubeseal /usr/local/bin/$ kubeseal --version  
安装controller
$ kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.18.0/controller.yaml  
执行上述命令之后会在 kube-system 命名空间下启动一个控制器 pod:
$ k get pod -n kube-system |grep sealsealed-secrets-controller-b9fb75d85-k4csm    1/1     running   0          7h28m  
pod 启动之后,使用端口转发映射到本地:
$ kubectl -n kube-system port-forward svc/sealed-secrets-controller 8080:8080  
使用方式
生成加密文件
首先在本地创建一个名为 secret-example.yaml 的文件,编码前的 secret 字段为:mysupersecret
apiversion: v1kind: secretmetadata:  name: secret-exampledata:  secret: bxlzdxblcnnly3jldao=  
使用如下命令将 secret-example.yaml,转换为加密后的文件 sealed-secret-example.yaml
$ kubeseal --secret-file secret-example.yaml --sealed-secret-file sealed-secret-example.yaml  
sealed-secret-example.yaml 的内容如下,spec.encrypteddata.secret 就是加密后的内容:
apiversion: bitnami.com/v1alpha1kind: sealedsecretmetadata:  creationtimestamp: null  name: secret-example  namespace: kube-systemspec:  encrypteddata:    secret: agb1zzg8+j+0hlymoqzdtfwvqzinkhm5x6wuljubaaeaqqnhm8i2tv2i1sgkt4suocrv90xa1oefld3xogpjvye3leod1cvk1ddvqno6mnlrziokisk/9fb3cve2gvgycud//m53xnpvemdufgsjs2q/kgioeneijk9zm2fakoldwtpavnl0nfmc2xne2xtwjp+/emorehbubqhnj5m/se75axazviudnf6ss9faur38msd5dxnkbtyrckehsa8tdn8erssoh0ogx14e0/thn3ewjecsbtx7xfd0m90+vjmvwevmag442349aqur/qlo0mg40mhccqsbw/mjaigz2f5xrufg1wep43oglmtixn2llsu3eytrv5t075tai9wjgool0dd8ua74empx7rmktixd6c0xngkmmkg5fuk7jnlffwhmrpi4zntwja9vidyd0iajrggbmmso/nhetwotrle5rrf0klq5n6lj57gobdqu903/vdm4jm695gvewl2ar3shoxashcuzexj8q5+kywef9sysijh8bwetaw6x7j9axbowjxwyd0jvj9khtlqba4oksdc3bcgrkghssxqx6joumi5rj+v542hkb6z8jotj17vmzr6xdqdmqsl1fqqwkd5n5yuy5kf6pjybnsgkn3tzesq6jfqbyrlth1pn3odoycnp+ixbd0tgn0n5m0ko3rx0hiwgoe0hobizcsf36g==  template:    data: null    metadata:      creationtimestamp: null      name: secret-example      namespace: kube-system  
可以将加密后的文件保存到 gitlab。
创建加密文件:
$ k create -f sealed-secret-example.yamlsealedsecret.bitnami.com/secret-example created$ k get sealedsecrets.bitnami.comname             agesecret-example   6s  
在创建完加密文件之后,controller 会解密并生成对应的 secret:
$ k get secrets |grep secret-examplesecret-example                                   opaque                                1      2m15s  
查看由 controller 生成的 secret 资源内容,可以看到 data.secret 与上面创建的 secret-example.yaml 文件内容一致:
$ k get secret secret-example -oyamlapiversion: v1data:  secret: bxlzdxblcnnly3jldao=kind: secretmetadata:  creationtimestamp: 2022-06-10t0040z  name: secret-example  namespace: kube-system  ownerreferences:  - apiversion: bitnami.com/v1alpha1    controller: true    kind: sealedsecret    name: secret-example    uid: 57a5b691-9bb5-4dac-800a-1a1baa878299  resourceversion: 675560  uid: e0db31ad-082b-4596-9fd0-28cc810d86f4type: opaque  
注:sealedsecret 和对应的 secret 资源必须位于相同的命名空间
tips
kubeseal 支持如下api:
route description
/healthz health check route useful for the readiness and liveness probes and for creating an external probe; for example with blackbox exporter.
/metrics endpoint for the prometheus to retrieve the controller’s metrics.
/v1/verify validates a secret.
/v1/rotate rotates the secret.
/v1/cert.pem retrieves the public certificate.
上例中 controller 用的证书是自己生成的,还可以指定自己的证书,更方便迁移和管理
使用 kubeseal 可能会有一种困惑,如果用户直接挂载其他命名空间的 secret,那么这样可能会导致 secret 泄露。官方对此有作解释,如可以通过 rbac 限制用户可以访问的命名空间以及资源类型。


回顾MATLAB为教育行业提供无限扩展和合作机会分析和介绍
物联网将在医疗领域大有作为!这些就是依据
中国为何突然禁售苹果
SAP适合医疗器械行业的公司、工厂吗?
智己汽车将携手CATL推出1000km电池
如何规避 Secret 泄露风险
面向5G时代 中国移动蓄力缔造“内容帝国”
2023是否会成为Multi-Die的腾飞之年?
物联网卡如何应用在定位跟踪器上
23个LM358典型应用电路图分享
基于指示剂置换法的比色和荧光双模式传感器
在智能安防时代,人脸识别有什么用途?
食品冷库温湿度监测系统的应用优势是什么
iPhone 12系列的连接性如何?
关于嵌入式系统开发必备的基础知识
奔驰或将采用新型的电池,5分钟充电可达80%
High-Performance Level-Shifter
5G NR广播不只是看电视直播?
IC卡无线远传智能防盗燃气表的原理及设计
中国信息通信科技集团揭牌 加速推进5G发展