Sealed Secrets
是一个由bitnami开发的Kubernetes控制器,使用非对称加密(public/private key)技术对kubernetes的secret进行加密,加密后的文件可以安全的存储在 git 中,而不必担心密码泄露。
介绍
- kubernetes 的 secret 存储数据时进使用 Base64 编码,不能直接提交到 git
- 通过
Sealed Secrets
加密后的文件可以安全的存储在 git 中
架构图
参考
安装
服务端
默认安装在 kube-system
命名空间
curl -o base/controller.yaml https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.19.3/controller.yaml
客户端
- kubeseal 是 SealdSecret 的客户端,用来从服务端获取公钥,并加密数据
wget https://github.com/bitnami-labs/sealed-secrets/releases/download/<release-tag>/kubeseal-<version>-linux-amd64.tar.gz
tar -xvzf kubeseal-<version>-linux-amd64.tar.gz kubeseal
sudo install -m 755 kubeseal /usr/local/bin/kubeseal
kubeseal < secret.yaml > sealed-secret.json
kubeseal --scope cluster-wide < secret.yaml > sealed-secret.json
使用说明:
--merge-into
合并 SealdSecret
使用
- SealdSecret 会自动创建同名的 Secret,SealdSecret 示例
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
name: mysecret
namespace: mynamespace
spec:
encryptedData:
foo: AgBy3i4OJSWK+PiTySYZZA9rO43cGDEq.....
apiVersion: v1
kind: Secret
metadata:
name: mysecret
namespace: mynamespace
data:
foo: YmFy # <- base64 encoded "bar"
SealdSecret
是绑定 namespace 和 name 的,称为 scopes,SealdSecret 支持的 scopes
strict
默认,名字和 namespace 匹配
namespace-wide
相同 namespace 内可修改 name
cluster-wide
可修改 namespace 和 name
annotations:
# 集群内可解密 - 不绑定 namespace
sealedsecrets.bitnami.com/cluster-wide": 'true'
# 不绑定 name
sealedsecrets.bitnami.com/namespace-wide: 'true'
获取公钥
当无法获取集群权限, 如下命令可以直接把公钥下载到本地
# --controller-namespace 仅当非安装在 kube-system 命名空间时才指定
kubeseal --fetch-cert > public-key.cert [--controller-namespace sealed-secrets]
在加密时,使用 --cert
来指定本地的公钥文件:
kubeseal --format=yaml --cert=public-key.cert < secret.yaml > sealed-secret.yaml
运维和原理
迁移 key
# 备份 sealed-secrets-key.key
kubectl get secret -n kube-system -l sealedsecrets.bitnami.com/sealed-secrets-key -o yaml > sealed-secrets-key.key
# 恢复 sealed-secrets-key.key,可以在不同环境使用相同的 sealed-secret 配置
kubectl apply -f sealed-secrets-key.key
# 生效,删除 Pod 重建,重新加载 key
kubectl delete pod -n kube-system -l name=sealed-secrets-controller
获取公私钥
# 获取 tls.crt,可能包含多个
kubectl get secret -n kube-system -l sealedsecrets.bitnami.com/sealed-secrets-key -o=jsonpath='{.items[0].data.tls\.crt}' | base64 -d > tls.crt
# 查看证书
openssl x509 -noout -text -in tls.crt
# 获取 tls.key
kubectl get secret -n kube-system -l sealedsecrets.bitnami.com/sealed-secrets-key -o=jsonpath='{.items[0].data.tls\.key}' | base64 -d > tls.key
# 离线解密
kubeseal --recovery-unseal --recovery-private-key tls.key -o yaml < mysealedsecret.json
# 管理 existing secrets
`annotate` that Secret with the annotation `sealedsecrets.bitnami.com/managed: "true"`