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 其他
-
加密secret时需要先对数据进行base64加密,这里有个隐藏的坑,我习惯直接是用命令行加密,比如加密123456
$ echo "123456" | base64 MTIzNDU2Cg==
但是这里会有个问题,加密后的密码其实是包含了一个换行符,因此再经过sealedsecret加密的话,如果应用程序直接使用这个值去校验就会报错,你就会很郁闷,明明密码正确为啥加密后就不行。
对此,echo时需要加个-n参数即可,
$ echo -n "123456" | base64 MTIzNDU2 -
部署加密后的secret前,可以用kubeseal校验下,
cat mysecret_sealed.yaml | kubeseal --validate
如果出错会有以下报错,
error: unable to decrypt sealed secret -
SealedSecrets控制器使用的密钥对默认每30天renew一次,旧的密钥无法解密新的加密secret,所以不要随便删除旧的secret
参考文档:
4. https://github.com/bitnami-labs/sealed-secrets
相关文章:
K8S Secret管理之SealedSecrets
1 关于K8S Secret 我们通常将应用程序使用的密码、API密钥保存在K8S Secret中,然后应用去引用。对于这些敏感信息,安全性是至关重要的,而传统的存储方式可能会导致密钥在存储、传输或使用过程中受到威胁,例如在git中明文存储密码…...
Gone框架介绍25 - Redis模块参考文档
文章目录 Redis 参考文档配置项import 和 bury使用分布是缓存 redis.Cache接口定义使用示例 使用分布式锁 redis.Locker接口定义使用示例 操作Key,使用 redis.Key接口定义 使用 Provider 注入 redis 接口使用示例 直接使用redis连接池接口定义使用示例 Redis 参考文…...
SpringBoot前置知识02-spring注解发展史
springboot前置知识01-spring注解发展史 spring1.x spring配置只能通过xml配置文件的方式注入bean,需要根据业务分配配置文件,通过import标签关联。 spring1.2版本出现Transactional注解 <?xml version"1.0" encoding"UTF-8"?> <be…...
C++ TCP发送Socket数据
DEVC需要加入ws2_32库 #include <iostream> #include <winsock2.h>#pragma comment(lib, "ws2_32.lib")void sendData(const char* ip, int port, const char* data) {WSADATA wsaData;SOCKET sockfd;struct sockaddr_in server_addr;// 初始化Winsock…...
鸿蒙HarmonyOS开发中的易混点归纳-持续补充中
相关文章目录 鸿蒙HarmonyOS开发术语全解:小白也能看懂! 文章目录 相关文章目录前言一、build()函数和Builder装饰器?二、自定义组件和系统组件(内置组件)三、组件和页面四、自定义弹窗和其他弹窗总结 前言 一、build…...
ue引擎游戏开发笔记(45)——添加游戏音效
1.需求分析: 截至目前,我们仍然在一个无声的世界游玩游戏,所以有必要为游戏增添一些声音,例如开火声,子弹撞击声等等。 2.操作实现: 1.这是一个较为简单的功能,类似特效的实现方法,…...
202472读书笔记|《首先你要快乐,其次都是其次》——快乐至上,允许一切发生
202472读书笔记|《首先你要快乐,其次都是其次》——快乐至上,允许一切发生 《首先你要快乐,其次都是其次》作者林小仙,挺轻松的小漫画,清新的文字。 生而为人,我很抱歉,大可不必。 生活已经很难…...
8.STL中Vector容器的常见操作(附习题)
目录 1.vector的介绍 2 vector的使用 2.1 vector的定义 2.2 vector iterator 的使用 2.3 vector 空间增长问题 2.3 vector 增删查改 2.4 vector 迭代器失效问题 2.5 vector 在OJ中的使用 1.vector的介绍 vector是表示可变大小数组的序列容器。 就像数组一样࿰…...
5.23小结
1.java项目创新 目前想添加一个自动回复的功能和设置验证方式有(允许任何人添加,禁止添加,设置回答问题添加,普通验证添加) 目前只完成画好前端界面,前端发送请求,还有表的修改 因为涉及表字…...
文心一言 VS 讯飞星火 VS chatgpt (265)-- 算法导论20.1 4题
四、假设不使用一棵叠加的度为 u \sqrt{u} u 的树,而是使用一棵叠加的度为 u 1 k u^{\frac{1}{k}} uk1的树,这里 k 是大于 1 的常数,则这样的一棵树的高度是多少?又每个操作将需要多长时间?如果要写代码…...
Flutter 中的 EditableText 小部件:全面指南
Flutter 中的 EditableText 小部件:全面指南 在Flutter中,EditableText是一个低级别的文本编辑组件,它提供了构建自定义文本编辑界面的能力。与TextField和TextFormField不同,EditableText提供了更多的灵活性,允许开发…...
H800基础能力测试
H800基础能力测试 参考链接A100、A800、H100、H800差异H100详细规格H100 TensorCore FP16 理论算力计算公式锁频安装依赖pytorch FP16算力测试cublas FP16算力测试运行cuda-samples 本文记录了H800基础测试步骤及测试结果 参考链接 NVIDIA H100 Tensor Core GPU Architecture…...
2024/5/24 Day38 greedy 435. 无重叠区间 763.划分字母区间 56. 合并区间
2024/5/24 Day38 greedy 435. 无重叠区间 763.划分字母区间 56. 合并区间 遇到两个维度权衡的时候,一定要先确定一个维度,再确定另一个维度。如果两个维度一起考虑一定会顾此失彼。 重叠区间问题 435. 无重叠区间 题目链接 435 给定一个区间的集合 i…...
【python】使用函数名而不加括号是什么情况?
使用函数名而不加括号通常是为了表示对函数本身的引用,而不是调用函数。这种用法通常出现在下面这几种情况: 作为回调函数传递:将函数名作为参数传递给其他函数,以便在需要时调用该函数。例如,在事件处理程序或高阶函数…...
全文检索ElasticSearch简介
1 全文检索 1.1 什么是全文检索 全文检索是一种通过对文本内容进行全面索引和搜索的技术。它可以快速地在大量文本数据中查找包含特定关键词或短语的文档,并返回相关的搜索结果。全文检索广泛应用于各种信息管理系统和应用中,如搜索引擎、文档管理系统、电子邮件客户端、新闻…...
Github上传时报错The file path is empty的解决办法
问题截图 文件夹明明不是空的,却怎么都上传不上去。 解决方案: 打开隐藏文件的开关,删除原作者的.git文件 如图所示: 上传成功!...
Adobe Bridge BR v14.0.3 安装教程 (多媒体文件组织管理工具)
Adobe系列软件安装目录 一、Adobe Photoshop PS 25.6.0 安装教程 (最流行的图像设计软件) 二、Adobe Media Encoder ME v24.3.0 安装教程 (视频和音频编码渲染工具) 三、Adobe Premiere Pro v24.3.0 安装教程 (领先的视频编辑软件) 四、Adobe After Effects AE v24.3.0 安装…...
嵌入式学习——3——TCP-UDP 数据交互,握手,挥手
1、更新源 cd /etc/apt/ sudo cp sources.list sources.list.save 将原镜像备份 sudo vim sources.list 将原镜像修改成阿里源/清华源,如所述 阿里源 deb http://mirrors.aliyun.com/ubuntu/ bionic main …...
【LeetCode】【3】无重复字符的最长子串(1113字)
文章目录 [toc]题目描述样例输入输出与解释样例1样例2样例3 提示Python实现滑动窗口 个人主页:丷从心 系列专栏:LeetCode 刷题指南:LeetCode刷题指南 题目描述 给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度 样…...
溪谷联运SDK功能全面解析
近期,备受用户关注的手游联运10.0.0版本上线了,不少用户也选择了版本更新,其中也再次迎来了SDK的更新。溪谷软件和大家一起盘点一下溪谷SDK的功能都有哪些吧。 一、溪谷SDK具有完整的运营功能和高度扩展性 1.登录:登录是SDK最基础…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
