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最基础…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
ui框架-文件列表展示
ui框架-文件列表展示 介绍 UI框架的文件列表展示组件,可以展示文件夹,支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项,适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...
