Sealed Secrets 介绍

发布时间: 更新时间: 总字数:652 阅读时间:2m 作者: IP上海 分享 网址

Sealed Secrets是一个由bitnami开发的Kubernetes控制器,使用非对称加密(public/private key)技术对kubernetes的secret进行加密,加密后的文件可以安全的存储在 git 中,而不必担心密码泄露。

介绍

  • kubernetes 的 secret 存储数据时进使用 Base64 编码,不能直接提交到 git
  • 通过 Sealed Secrets 加密后的文件可以安全的存储在 git 中

架构图

life-of-sealed

参考

安装

服务端

默认安装在 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.....
  • 生成的 Secret 示例:
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"`
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数