Argo CD系列视频图文版之数据加密

2022-12-01 09:58:38 浏览数 (1)

配套视频

往期回顾

  • 1.Argo CD系列之初识Argo CD
  • 2.Argo CD系列之Argo CD环境搭建
  • 3.Argo CD系列之安装Argo CD
  • 4.Argo CD系列之自建应用模拟开发场景
  • 5.Argo CD系列之Github实现全自动化 CICD

开篇

上节课,我们发现配置清单仓库中secret默认采用base64加密,非常容易逆向解密。本期视频,我们来解决部署清单仓库中secret数据加密的问题。

ArgoCD官方推荐了差不多十种解决方案,同时也提醒说,没有一种是可以解决所有问题的。既然都不完美,那咱们就瘸子里挑将军,找个相对好的研究研究。

sealed secrets 介绍

sealed secretsbitnami 实验室推出的Secrets单向加密工具。它被设计为两部分,一部分作为kubernetes资源控制器,运行在kubernetes集群中,该控制器始终监控 SealedSecret这个资源类型,并将它解密为Kubernetes可以识别的Secret;另外一部分被设计为客户端工具,由用户操作将Secret类型加密为SealedSecret类型。

  • 部署 sealed secret controller, 默认部署在 kube-system namespace 下;
  • 部署时会检查 kube-system namespace 下有没有相应的用于加解密的秘钥对。如果没有,会自动创建。
  • 用户可以通过 kubeseal 命令,把普通的 secret.yaml 配置清单,加密为 SealSecret 类型的资源清单。
  • 部署 SealedSecret 类型的资源清单到集群中
  • 当 sealed secret container 发现 SealedSecret CRD 时,会自动将其解密为 k8s 集群可识别的 Secret

安装 sealed secrets

1. 安装控制器端

代码语言:javascript复制
$ kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.16.0/controller.yaml

默认会在 kube-system 命名空间下创建 sealed-secrets-controller 控制器,当控制器启动时,会自动检查当前命名空间下是否有存在解密 SealedSecrets 的私钥对;如果没有则自动创建,同时把公钥打印在控制器的日志中。

2. 安装客户端工具

代码语言:javascript复制
# Mac OSX
brew install kubeseal

# Linux
wget https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.10.0/kubeseal-linux-amd64 -O kubeseal

3. 加密 secret

虽然我们可以从 sealed-secrets-controller 的日志中获取自动生成的公钥信息,但复制时经常会出现格式错误。可以通过如下命令,在服务器端获取公钥信息,再通过 lrzsz 等工具拷贝到本地;

代码语言:javascript复制
# kubeseal 自动连接 k8s 集群获取公钥
kubeseal --fetch-cert > public-cert.pem

通过如下命令讲Secret类型加密为 SealedSecret 类型。

代码语言:javascript复制
# 可以写到 Makefile 中供快捷使用

kubeseal --format=yaml --cert .public-cert.pem < secret.yaml > secret-sealed.yaml

此时,Secret类型的配置清单就不需要啦,直接把SealedSecret类型的配置清单提交到仓库中,ArgoCD将其应用到kubernates中,最终由 sealed-secrets-controller 控制器把配置解密为 Secret类型的资源。

Secret类型的配置清单已经不需要啦,但不建议删除。因为 sealed secrets想要解密SealedSerects类型的文件,所需的私钥还在kubernates集群中,保密程度更高,不方便共享给开发团队。建议使用如下方式解决:

  1. 添加secret文件到 .gitignore中,防止误提交;
  2. public-cert.pem公钥非常重要,务必谨慎保存。

私钥公钥存储

代码语言:javascript复制
# 导出私钥并保存到安全位置
kubectl get secret -n kube-system -l sealedsecrets.bitnami.com/sealed-secrets-key -o yaml >master.key

# 保存公钥并保存到安全位置
kubeseal --fetch-cert > public-cert.pem

当集群从灾难中恢复时,可以导入私钥,并重新创建 sealed-secrets-controller控制器。

代码语言:javascript复制
kubectl apply -f master.key
kubectl delete pod -n kube-system -l name=sealed-secrets-controller

结束语

到这里,我们总算对Secret有个相对不错的处理方案,不过如各位所见,仍然有其瑕疵。官方还推荐了其他方案,感兴趣的同学可以自行研究研究,欢迎大家把研究结果共享,让更多的人少走弯路。

下期视频,咱们来聊聊多集群管理的问题。

参考文档

sealed secrets[1]

参考资料

[1]

sealed secrets: https://aws.amazon.com/cn/blogs/china/managing-secrets-deployment-in-kubernetes-using-sealed-secrets/?nc1=b_nrp

0 人点赞