如何优雅保护 Kubernetes 中的 Secrets

ac0f5f99ff9294543db23655ed220c16.gif

来源 | 进击云原生

现如今开发的大多数应用程序,或多或少都会用到一些敏感信息,用于执行某些业务逻辑。比如使用用户名密码去连接数据库,或者使用秘钥连接第三方服务。在代码中直接使用这些密码或者秘钥是最直接的方式,但同时也带来了很大的安全问题,如何保证密码、秘钥不被泄露。

如果你的应用程序已经被容器化,且使用Kubernetes(k8s),那情况会好很多。Kubernetes提供了一个原生资源,称为“Secret”,可用于管理和存储敏感信息。敏感信息被编码为未加密的Base64格式,并被存储在Secret对象中。Secret可以作为环境变量被注入到Pod内部的容器中,也可以作为数据卷挂载到容器内部。

为了保证敏感信息的安全性,Secret对象应该被加密,并且应该使用Kubernetes RBAC机制对访问进行控制。如果你正在使用AWS公有云来托管Kubernetes集群,则可以利用AWS密钥管理服务(KMS)对静态数据进行加密。

Kubernetes的清单文件通常被提交到代码仓库中以进行版本控制。但是你可能不希望将敏感信息以纯文本或Base64编码字符串的形式提交到Git代码仓库中。我们都应该知道为什么,这不安全!但是,你在Kubernetes集群之外将敏感数据保存在何处,以确保它们是安全的?

有很多方法可以解决这个问题。下面列出了其中几个:

选项1:加密纯文本敏感数据,然后再提交到Git代码仓库中

e83d2b9254d9d486afdd267c8335aa6a.png

  1. 使用对称或非对称算法加密纯文本敏感数据。

  2. 使用Kubernetes Custom Resource Definition(CRD)创建自定义的Secret对象,以使用加密的文本数据。

  3. 创建一个自定义Kubernetes控制器,该控制器读取自定义Secret对象中的加密信息,并在运行时解密,并创建一个原生的Secret对象。

使用这种方法,你可以将加密的数据提交到Git代码仓库中。而且它没有风险,因为数据是加密的,只能用你的私钥解密。但是你把私钥放在哪里?

如何存储加密密钥和管理整个加解密过程,可以使用Bitnami的Sealed Secrets[1]。

选择2:使用第三方服务来存储敏感数据

6410293a8c99c49d9b513650e92b8cf7.png

  1. 你可以将敏感数据存储到第三方服务中,如AWS Secrets Manager或HashiCorp Vault。

  2. 创建自定义Kubernetes控制器,基于配置从这些服务中获取机密信息,并在运行时创建Kubernetes Secret对象。

External Secrets[2]项目可以帮助你实现选项2。

你还可以增强应用程序逻辑,以便在应用程序启动时从第三方服务读取机密信息,但这里的整体思想是将机密信息管理与应用程序业务逻辑分离开来,并利用Kubernetes的功能来进行相同的管理。

快速概览Sealed Secrets

41c240262231273a07c203e5d01bc5cd.png

在Sealed Secret开源项目中,你可以将你的Secret加密为一个SealedSecret,这样就可以安全地存储,甚至可以存储到公共存储库中。SealedSecret只能由运行在目标集群中的控制器解密,其他人,甚至包括原始作者,都无法从SealedSecret获得原始的Secret。

Sealed Secrets由两部分组成:

  • 服务器端的控制器

  • 客户端工具:kubeseal

kubeseal使用非对称加密来加密数据,然后只有服务端的控制器才能解密数据。

这些加密数据被编码在SealedSecret资源中,你可以将其视为创建Secret的配方。

下面是如何使用Sealed Secrets来管理Secret的具体步骤。

1、安装kubeseal,这是一个客户端工具,可以帮助你创建SealedSecret

> wget https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.15.0/kubeseal-linux-amd64 -O kubeseal> sudo install -m 755 kubeseal /usr/local/bin/kubeseal

2、安装服务器端控制器,为SealedSecret创建Custom Resource Definition(CRD)

> kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.15.0/controller.yamlrolebinding.rbac.authorization.k8s.io/sealed-secrets-service-proxier created
role.rbac.authorization.k8s.io/sealed-secrets-key-admin created
clusterrole.rbac.authorization.k8s.io/secrets-unsealer created
deployment.apps/sealed-secrets-controller created
customresourcedefinition.apiextensions.k8s.io/sealedsecrets.bitnami.com created
service/sealed-secrets-controller created
clusterrolebinding.rbac.authorization.k8s.io/sealed-secrets-controller created
serviceaccount/sealed-secrets-controller created
role.rbac.authorization.k8s.io/sealed-secrets-service-proxier created
rolebinding.rbac.authorization.k8s.io/sealed-secrets-controller created

3、验证sealed-secret controller Pod是否运行

> kubectl get pods -n kube-system -l name=sealed-secrets-controllerNAME                                         READY   STATUS RESTARTS   AGE
sealed-secrets-controller-7c766b885b-d5r2r   1/1     Running   0          7m39s

如果你查看Pod的日志,你将看到控制器为自己创建的一对秘钥,这对秘钥将被用于加解密过程。

> kubectl logs sealed-secrets-controller-7c766b885b-d5r2r -n kube-systemcontroller version: v0.15.0
2021/05/01 20:13:34 Starting sealed-secrets controller version: v0.15.0
2021/05/01 20:13:34 Searching for existing private keys
2021/05/01 20:13:35 New key written to kube-system/sealed-secrets-keymt6dg
2021/05/01 20:13:35 Certificate is 
-----BEGIN CERTIFICATE-----
MIIErjCCApagAwIBAgIRAJqYfaZsali26I8pvBXoFGYwDQYJKoZIhvcNAQELBQAw
ADAeFw0yMTA1MDEyMDEzMzVaFw0zMTA0MjkyMDEzMzVaMAAwggIiMA0GCSqGSIb3
DQEBAQUAA4ICDwAwggIKAoICAQDp/yO5PY8ACHBDuguhtfpOwlbScK9hZorJloyx
ixVCc57j1zMSX0pSVcrk1Yuyf6sYvBQtDi16kM70z6y/ODiz+9g87K/jY7B0UAoi
mpzM/T0tWJiG9ixyNMZhHoNREauokSlbERq3Jl8ZNTfmxHWhLH7DhkJ7MdpQfMpK
a3XHcSZyz1mXFqv+OSCCwllWCRHmHgp/vqudAv8+NYm0gnAxKt2fjlv/ObX8J1RI
CtLnlsCpp/9SyVcSTeYYaqjUsI7fTUZ7tkTE/bdQHwf3xe4DhUty7xLqMF1OPSPw
EetL8fGO0VqoSQFKQ0Bf78+8vhAA2cwkuqB6vQQm9pT3yC5niSCUo+jwFcfyknjr
yx8DINbq6K9B40EXh8X7w4I6zwYpyT0GoNU54wW0ki8pHRm7EnFeBOkUvNspzmKn
t/EZEDVq74Kkl/BRNRvKHYlwudSoJuvvX6JM8DVvRp0lMPnXnG3RLSmCP3gEFQBZ
DhbnkwO+6ADX9Q4vyqelWoHWdVGVULDlMDhSzvEhFFgPcZXzWTShH81vfl8M6lpT
U0ysZkA6i3A29XEJpPj35yWPBDWmKF5fLM3ChMt/NSJEeoJN1RboPDAgVUTxEW59
q+Tq09/zlYD7Ch8PNc3IWNXjFNXmCAAOw9Z1VBbD8p6LrC5JvBtPoWYqufWVXQD9
KDe+6wIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAAEwDwYDVR0TAQH/BAUwAwEB/zAN
BgkqhkiG9w0BAQsFAAOCAgEAvu//VzDREYZPPIW1maTxo9C/nHEEuOP0rQU3zVQr
bBYf8N0b5wpCllESCgi0JDJJXrE8KrjfdtawjoBrBlHOdWHF+fIot2KbrC/i37em
/ulMAgiiJzrKM/ExJuCuH60fsSIx4wrg46tQpU8jHFWq7nGnsaE+UN3QPjuvQ+qo
KKDSBLDxLx+q9vBfaXElblh4okUI8Pr4UEEJrYiPzPM6nA9EPpy53N3si4jyDJJb
2IsCUa2bW6iBhpyZOQQUPn22ziWRQ/sYYNmtP/gX0rwtk+Rr8TTdzPYGZcYfMQ6O
TFq4Zo2/TnpCL/CUr2DiSuF2qdWGGvbQOENYq2FNuDI4zeljElcZHXA8nhpbNSJs
7VNqqz5ZTFCKyL0Gn6SawGT7EdwBT2AD3F33Qd/7bXG/On7KdVw6FKHbZOR2RcoS
YFQv7Xr8g/4atQjxDa7R5+zkxd5unsvpFhYM1UfNJc4cjJ7SmfCCHoPGiwZ0OgqB
6SvUVU64QmMMJ/jYAJkYMOakSHaRITHAvvBjpAMKxSjjb7qZD5FnpXLhRY9lNiY6
MnnQRxJskCw+R6geIAHTMzAofMfc1haIEr+3oMFZfyh1LFFsz3B4hMxXYKrWYDje
+96bhAY9X7L0UfREjmw8HCeZneEuBJjX9z/PyIeMdhViLh9uO/MAL1MBxdBVA55+
LW8=
-----END CERTIFICATE-----2021/05/01 20:13:35 HTTP server serving on :8080

运行以下命令查看公钥/私钥信息。

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

4、创建一个名为secrets.yaml的Secret清单文件

apiVersion: v1
data:DB_PWD: cGFzc3dvcmQ= //base64 encodedDB_USER: cm9vdA==    //base64 encoded
kind: Secret
metadata:name: db-secrets

现在让我们使用kubeseal命令,将secrets.yaml转变为SealedSecret资源清单文件。

> kubeseal --format=yaml < secret.yaml > sealed-secret.yaml> cat sealed-secret.yaml apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:creationTimestamp: nullname: db-secretsnamespace: default
spec:encryptedData:DB_PWD: AgDaCRi27RV4/sVI2ok7JlqBSKT5+c7gGJog+...DB_USER: AgAZG67CrrOBnyKIKha7xhJulr+CQGPaE/PpsjvY8jJR0IDO2...template:metadata:creationTimestamp: nullname: db-secretsnamespace: default

在上面的步骤中,kubeseal从Kubernetes集群获取公钥并使用该公钥加密数据。

5、让我们使用SealedSecret资源清单文件,在Kubernetes中创建资源。

> kubectl apply -f sealed-secret.yaml

如果你再次检查控制器的日志,你将看到控制器拦截了请求,并解密来自SealedSecret的加密数据,数据被解密后,将创建Kubernetes的Secret对象。

> kubectl logs sealed-secrets-controller-7c766b885b-d5r2r -n kube-system2021/05/01 20:38:06 Updating default/db-secrets
2021/05/01 20:38:06 Event(v1.ObjectReference{Kind:"SealedSecret", Namespace:"default", Name:"db-secrets", UID:"fd89a7e7-c81a-4110-9de6-6b65195169d3", APIVersion:"bitnami.com/v1alpha1", ResourceVersion:"19365", FieldPath:""}): type: 'Normal' reason: 'Unsealed' SealedSecret unsealed successfully

一旦创建了Kubernetes Secret对象,就可以将它作为环境变量注入到容器中,或者作为数据卷挂载。

上面步骤4中创建的SealedSecret资源清单文件可以被提交到Git代码仓库中。secrets.yaml文件可以丢弃,因为它不再需要了。被存储在sealed-secret.yaml文件中的数据是安全的,它是被加密的,且只能由运行在Kubernetes集群中的Controller解密。

希望这篇文章能让你知道如何保护Kubernetes的机密信息。

相关链接:

https://github.com/bitnami-labs/sealed-secrets

https://github.com/external-secrets/kubernetes-external-secrets

ab6222d0e6e88ce37fc18355d9356c79.gif

53ff3f53d78c6822fbcaa805e7ce2c71.png

往期推荐

只用两个自定义 Hooks 就能替代 React-Redux ?

掘地三尺搞定 Redis 与 MySQL 数据一致性问题

Redis 内存满了怎么办?这样置才正确!

云原生的本手、妙手和俗手

bfa294edb52d84c33204b69bf4ae1f54.gif

点分享

c452be4ba6ee956c11191e61d36e50b1.gif

点收藏

9d78b46b3b1d678b1edc0292dd61c41c.gif

点点赞

7bbc070cdd6ea2b2ddd3ea8d705e61ea.gif

点在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/511598.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能巡检告警配置实践

简介&#xff1a;智能异常分析的检测结果通过 SLS 告警功能输出到用户配置的通知渠道。在智能巡检场景中&#xff0c;单个任务往往会巡检大量的实体对象&#xff0c;涉及到的对象规则很多&#xff0c;我们通过SLS新版告警可以实现较好的对于巡检事件的管理。 智能异常分析的检…

基于链路思想的SpringBoot单元测试快速写法

简介&#xff1a;本文更偏向实践而非方法论&#xff0c;所提及的SpringBoot单元测试写法亦并非官方解&#xff0c;仅仅是笔者自身觉得比较方便、效率较高的一种写法。每个团队甚至团队内的每位开发可能都有自己的写法习惯和风格&#xff0c;只要能实现单元测试的效果&#xff0…

access数据库文件导入mysql数据库文件怎么打开,Access数据库从外部数据导入文本文件和VF数据库-dbf文件怎么打开...

亲爱的小伙伴们&#xff0c;我们又见面了&#xff01;上一期我们学习了Access数据库从外部数据导入Excel文件&#xff0c;下图学生成绩表2就是我们新导入的数据&#xff1a;导入Excel文件今天我们来学习如何从外部数据导入文本文件和VF数据库。导入文本文件&#xff1a;我们点击…

数据在网络中是如何传输的

作者 | 杰哥来源 | 杰哥的IT之旅你有想过吗&#xff0c;在计算机网络当中&#xff0c;数据是怎么样保证准确的从客户端发送到服务器端的&#xff1f;中间涉及到了哪些理论&#xff1f;01 客户端各层对数据的封装 java实现客户端的代码如下&#xff1a;应用层会指定发送的服务器…

龙蜥利器:系统运维工具 SysAK的云上应用性能诊断 | 龙蜥技术

简介&#xff1a;本文从大量的性能诊断实践出发&#xff0c;来介绍 SysAK 在性能诊断上的方法论及相关工具。 文/张毅&#xff1a;系统运维SIG核心成员、SysAK 项目负责人&#xff1b;毛文安&#xff1a;系统运维 SIG 负责人。 系统运维既要业务稳定的运行&#xff0c;又要最大…

php设置url,php 设置 url

这个大家可能很少见&#xff0c;自己写着玩儿的。if ($page_num > 1) {echo 下一页;}和if ($page_num > 1) {$page_num;echo 直接用php和mysql做翻页&#xff0c;为什么第一个有用&#xff0c;而第二个向下翻页到第二页之后就没用呢&#xff1f;即使在第二个里面使用$pag…

以智能工具辅助报考决策,夸克发布2022年高考志愿趋势报告

1、夸克App推出高考信息服务产品&#xff0c;发布“暖芒计划”助学活动&#xff0c;为乡村考生免费提供“专家志愿辅导”和“志愿助力包” 2、报告数据显示&#xff1a;80后加入高考家长大军、海南大学最受欢迎、计算机类专业热度最高。 2022年高考落下帷幕&#xff0c;志愿填报…

Apache RocketMQ + Hudi 快速构建 Lakehouse

简介&#xff1a;基于RocketMQ和Hudi零代码构建Lakehouse架构&#xff0c;以及RocketMQ Connector & RocketMQ Stream助力ETL数据分析&#xff0c;为大家提供快速构建Lakehouse的技术方案和低运维成本实现实时计算的解决方案。 本文目录 背景知识大数据时代的构架演进Rock…

php适配模式实例,php适配器模式简单应用示例

本文实例讲述了php适配器模式简单应用。分享给大家供大家参考&#xff0c;具体如下&#xff1a;适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式&#xff0c;它结合了两个独立接口的功能。这种模式涉及到一个单一的类&#xf…

柔性产线的数字孪生加速器:Unity发布UMT工具包

数字化浪潮不仅深度改变了日常生活的样貌&#xff0c;也在不断改造工厂的运行机制&#xff0c;生产线的日趋智能化&#xff0c;几乎重构了我们对生产效率的想象。工业4.0带来的变革&#xff0c;既在真实世界与虚拟世界之间建立了高效链接&#xff0c;也改写了人与机器的关系&am…

混合云应用双活容灾实践

简介&#xff1a;本文会通过一个业务 Demo 案例&#xff0c;介绍混合云容灾建设的难点&#xff0c;以及如何基于 MSHA 来快速搭建应用双活架构并具备分钟级业务恢复能力。 作者&#xff1a;远跖 前言 越来越多的企业在数字化转型和上云进程中选择混合云的形态&#xff08;云…

mvn install java版本,maven的打包命令--assemblyinstall和maven update之后jdk版本变回1.5的问题...

maven的打包命令–assembly&install和maven update之后jdk版本变回1.5的问题在进行maven项目打包时&#xff0c;可以有另个命令assembly和install一、install命令格式&#xff1a;mvn installpom.xml中的写法org.apache.maven.pluginsmaven-jar-plugincom.hcx.transferdata…

操作系统是如何保护自己的? CPU与保护模式

作者 | 陆小凤 在回答这个问题之前&#xff0c;你可能会首先想&#xff1a;为什么操作系统需要保护自己呢&#xff1f; 操作系统其实就是一个大管家&#xff0c;负责给应用程序搭建舞台&#xff0c;好让程序们过好自己的一生&#xff0c;但偏偏有不听话的程序可能想抢操作系统的…

如何快速调度 PTS 的百万并发能力

简介&#xff1a;压测是通过模拟用户行为对业务系统发起请求&#xff0c;测算出系统的承载能力&#xff0c;并对系统做一次全面的体检&#xff0c;压测后可根据压测表现优化系统瓶颈&#xff0c;防止出现线上故障。 作者&#xff1a;灵苒 在实际的业务场景中&#xff0c;压测…

matlab字符串数组里里固定格式的内容,字符串数组和字符数组中的文本

用字符串数组表示文本您可以使用 string 数据类型将任何 1n 字符序列存储为字符串。从 R2017a 开始&#xff0c;您可以用双引号将文本括起来以创建字符串。str "Hello, world"str "Hello, world"虽然文本 "Hello, world" 的长度为 12 个字符&am…

架构师说低代码:走出半生,归来仍是“毒瘤”!

当今世界正在经历数字化与智能化的发展蜕变&#xff0c;其中软件开发技术作为推动数字化转型的必要支撑&#xff0c;成为企业变革的重要推手。云原生作为产业数字化的关键技术之一&#xff0c;催生出低代码等软件开发模式&#xff0c;让开发逐渐走向低门槛、迭代快、可扩展。今…

网关流控利器:结合 AHAS 实现 Ingress/Nginx 流量控制

简介&#xff1a;微服务的稳定性一直是开发者非常关注的话题。随着业务从单体架构向分布式架构演进以及部署方式的变化&#xff0c;服务之间的依赖关系变得越来越复杂&#xff0c;业务系统也面临着巨大的高可用挑战。 作者&#xff1a;涂鸦 微服务的稳定性一直是开发者非常关…

matlab vs2010编译器xml,如何在MATLAB R2010a 中使用Visual C++ 2010编译器

1、安装补丁VS2010MEXSupport.zip参考http://www.mathworks.cn/support/solutions/en/data/1-D5W493/index.html?solution1-D5W493由于MATLAB R2010a 发布的时间要比VS2010早&#xff0c;所以在该版本识别不了VC2010编译器。不过R2010a之后的版本应该不会有这种问题了。解压补…

云钉一体加速,阿里云计算巢与钉钉深度融合、共建应用新生态

简介&#xff1a;云合计划再升级&#xff0c;“云钉一体”战略按下加速键。 1月13日&#xff0c;阿里云宣布云合计划再升级&#xff0c;计算巢与钉钉深度融合互通&#xff0c;实现一键上云、一键上钉钉&#xff0c;助力软件厂商更快地完成技术升级&#xff0c;更好地专注于自身…

DevStream 进入 CNCF 沙箱,探索云原生时代的高效 DevOps 实践

2022 年 6 月 15 日&#xff0c;云原生计算基金会 (CNCF) 宣布 DevStream 正式成为 CNCF 沙箱&#xff08;Sandbox&#xff09;项目。 DevStream 是一个开源的 DevOps 工具链管理器&#xff0c;可以通过一个简单的配置文件&#xff0c;将软件研发生命周期中各环节的 DevOps 工…