当前位置: 首页 > news >正文

K8S Secret管理之SealedSecrets

1 关于K8S Secret

我们通常将应用程序使用的密码、API密钥保存在K8S Secret中,然后应用去引用。对于这些敏感信息,安全性是至关重要的,而传统的存储方式可能会导致密钥在存储、传输或使用过程中受到威胁,例如在git中明文存储密码或在配置文件中以明文形式存放密码。

2 SealedSecrets

为了解决Secret的安全问题,SealedSecrets通过使用公钥加密技术来提高密钥的安全性。它使用了非对称加密算法,将明文的secret加密为SealedSecrets,只有具有相应私钥的受信任的控制器才能解密和使用密钥。在这种情况下,即使是创建密钥的人也无法从加密的secret中恢复原始secret。

3 部署SealedSecrets

直接通过helm安装,

helm repo add sealed-secrets https://bitnami-labs.github.io/sealed-secrets
helm search repo sealed-secrets/sealed-secrets
NAME                         	CHART VERSION	APP VERSION	DESCRIPTION
sealed-secrets/sealed-secrets	2.15.3       	0.26.2     	Helm chart for the sealed-secrets controller.

这里有个坑,需要注意下,因为默认helm安装的controller名字是sealed-secrets,但是客户端工具kubeseal默认是用的服务名称是sealed-secrets-controller,因此安装时要通过–set-string设置下名字,否则使用kubeseal时会有下列报错,

error: cannot get sealed secret service: services "sealed-secrets-controller" not found.
Please, use the flag --controller-name and --controller-namespace to set up the name and namespace of the sealed secrets controller	

安装当前最新版本2.15.3

helm install sealed-secrets --set-string fullnameOverride=sealed-secrets-controller sealed-secrets/sealed-secrets --version 2.15.3
NAME: sealed-secrets
LAST DEPLOYED: ...
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:...

sealed-secrets默认会安装到kube-system namespace,

kubectl get po -n kube-system | grep sealed-secrets
sealed-secrets-6bdbdfcf6-kgt7x         1/1     Running   0            2m22s

部署后,控制器会在当前namespace中搜索带有 sealedsecrets.bitnami.com/sealed-secrets-key标签的secret。如果找不到,控制器会在其namespace中创建新的secret,并将密钥对的公钥部分打印到输出日志中,

kubectl logs -f sealed-secrets-controller-f994b58c6-f46pt -n kube-system
level=INFO msg="Starting sealed-secrets controller" version=v0.26.2
level=INFO msg="Searching for existing private keys"
level=INFO msg="New key written" namespace=kube-system name=sealed-secrets-keyml59m
level=INFO msg="Certificate generated" certificate=....

控制器使用的密钥对就被保存在sealed-secrets-keyml59m,这个secret需要严格安全保存,它是这个集群加密的原始密钥,所有secret都依赖这个来加密。

4 加密secret

SealedSecrets提供了一个客户端工具kubeseal来加密secret,所以首先要先安装这个工具,

KUBESEAL_VERSION='' # Set this to, for example, KUBESEAL_VERSION='0.23.0'
wget "https://github.com/bitnami-labs/sealed-secrets/releases/download/v${KUBESEAL_VERSION:?}/kubeseal-${KUBESEAL_VERSION:?}-linux-amd64.tar.gz"
tar -xvzf kubeseal-${KUBESEAL_VERSION:?}-linux-amd64.tar.gz kubeseal
sudo install -m 755 kubeseal /usr/local/bin/kubeseal

然后就可以开始加密我们的secret了,

假设我们有以下secret,

$ cat mysecret.yaml
apiVersion: v1
kind: Secret
metadata:name: mysecretnamespace: kube-system
data:foo: YmFy  # <- base64 encoded "bar"

我们直接使用kubeseal对其加密,并输出到mysecret_sealed.yaml

$ kubeseal < mysecret.yaml > mysecret_sealed.yaml
$ cat mysecret_sealed.yaml
{"kind": "SealedSecret",..."spec": {..."encryptedData": {"foo": "AgCKwrBaLJxNPLfClItshQrWEoD0ntykNbOGKcA/F/a8Cj3lZ7aFLiNJ+pqp8AZcHpsBeUpSZwQv4OtHaXnSgJO+L4q4yLFYVKL9oDBHKvZyWjZfEeDPASUn1dSz6FBs88S/HhvfPxJY98MBNPAQwVAnnfIrscZ/vhYm7qYaj55mwJNWd0X9JjJ6EcLpKpib/qa6jFhBivmwbZ275ykU60v4nAvN8I3pEAZxD4TYk+Fni4wBj6y9EZyG6rkO9jNG+Ff0Xs3RVyEoCf9kt+t2ylusPJ+tHJNrGZ2qxXL3UCQEGwKPMV4ZNHvVRgiJT2C/l5x1L6BHWHIV/oio0BNNBT7CrvlG2EDEBbQz6J12ZjPquWHLUbLIXx4kKBbTxhYVRs4YS9F2RHwWu6ItU/M19iRLHqpJe5jXWzme4Oo2GCYqyQc4BB/Z9w2TxJKqLr7CidT+nfeKMLWMng8Qf+Curtnz4CPwp75Xj4Kj6obgICkNJn6PKL7F6JSszHVfAWVhjHsODUEdWG3cV9Mne/7BdoOfHoNvHIY3Bjbms0Fzl9VndAeFwpymJRaEHHkZALk0uWBfTcaw7HyL4EDMEapJ8Rd4v++gMuOaMSEjN1vQwygMxmLqsrx55Rm2vXcsd0flj239TQ2BC3GYvzKpJBqV7sf65Zuzmpd9iVYeLO7soCnRImwJ6KQOh4fG6K3KGPf6uNmvwW4="}}
}

这种方式要求你当前已经连接到k8s apiserver,如果要使用离线方式加密,需要提前先把公钥下载到本地,

kubeseal --fetch-cert > public-key-cert.pem

然后加密时指定密钥文件即可,

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

5 部署加密后的secret

我们可以直接apply加密后的mysecret_sealed.yaml

$ k apply -f mysecret_sealed.yaml
sealedsecret.bitnami.com/mysecret created

在controller日志里就能看到secret被成功解密,

level=INFO msg=Updating key=kube-system/mysecret
level=INFO msg="Event(v1.ObjectReference{Kind:\"SealedSecret\", Namespace:\"kube-system\", Name:\"mysecret\", UID:\"c77070a1-167b-4897-bed5-336c857a6f1e\", APIVersion:\"bitnami.com/v1alpha1\", ResourceVersion:\"1326784263\", FieldPath:\"\"}): type: 'Normal' reason: 'Unsealed' SealedSecret unsealed successfully"

6 解密secret

如果实在需要解密加密过的secret,可以使用kubeseal --recovery-unseal来操作,但是前提是你本地保存了控制器使用的公私钥密钥对。

如果你有权限,可以通过以下命令下载密钥对,

kubectl get secret -n kube-system -l sealedsecrets.bitnami.com/sealed-secrets-key -o yaml > sealed-secrets-key.yaml

然后再解密

kubeseal --recovery-unseal --recovery-private-key sealed-secrets-key.yaml < mysealedsecret.yaml > mysecret.yaml

7 其他

  1. 加密secret时需要先对数据进行base64加密,这里有个隐藏的坑,我习惯直接是用命令行加密,比如加密123456
    $ echo "123456" | base64 MTIzNDU2Cg==
    但是这里会有个问题,加密后的密码其实是包含了一个换行符,因此再经过sealedsecret加密的话,如果应用程序直接使用这个值去校验就会报错,你就会很郁闷,明明密码正确为啥加密后就不行。
    对此,echo时需要加个-n参数即可,
    $ echo -n "123456" | base64 MTIzNDU2

  2. 部署加密后的secret前,可以用kubeseal校验下,
    cat mysecret_sealed.yaml | kubeseal --validate
    如果出错会有以下报错,
    error: unable to decrypt sealed secret

  3. SealedSecrets控制器使用的密钥对默认每30天renew一次,旧的密钥无法解密新的加密secret,所以不要随便删除旧的secret


参考文档:
4. https://github.com/bitnami-labs/sealed-secrets

http://www.lryc.cn/news/350917.html

相关文章:

  • Gone框架介绍25 - Redis模块参考文档
  • SpringBoot前置知识02-spring注解发展史
  • C++ TCP发送Socket数据
  • 鸿蒙HarmonyOS开发中的易混点归纳-持续补充中
  • ue引擎游戏开发笔记(45)——添加游戏音效
  • 202472读书笔记|《首先你要快乐,其次都是其次》——快乐至上,允许一切发生
  • 8.STL中Vector容器的常见操作(附习题)
  • 5.23小结
  • 文心一言 VS 讯飞星火 VS chatgpt (265)-- 算法导论20.1 4题
  • Flutter 中的 EditableText 小部件:全面指南
  • H800基础能力测试
  • 2024/5/24 Day38 greedy 435. 无重叠区间 763.划分字母区间 56. 合并区间
  • 【python】使用函数名而不加括号是什么情况?
  • 全文检索ElasticSearch简介
  • Github上传时报错The file path is empty的解决办法
  • Adobe Bridge BR v14.0.3 安装教程 (多媒体文件组织管理工具)
  • 嵌入式学习——3——TCP-UDP 数据交互,握手,挥手
  • 【LeetCode】【3】无重复字符的最长子串(1113字)
  • 溪谷联运SDK功能全面解析
  • Vitis HLS 学习笔记--控制驱动TLP - Dataflow视图
  • 蓝桥杯物联网竞赛_STM32L071KBU6_关于sizo of函数产生的BUG
  • Wpf 使用 Prism 实战开发Day22
  • 遍历列表
  • 创建vue工程、Vue项目的目录结构、Vue项目-启动、API风格
  • 为了更全面地分析开发人员容易被骗的原因和提供更加深入的防范措施
  • 虹科Pico汽车示波器 | 免拆诊断案例 | 2020款奔驰G350车行驶中急加速时发动机抖动
  • 大模型落地竞逐,云计算大厂“百舸争流”
  • 物体检测算法-R-CNN,SSD,YOLO
  • 区块链开发:区块链软件开发包装相关解析
  • 一个月速刷leetcodeHOT100 day07 轮转数组 除自身以外的乘积 找到字符串中所有字母异位词