如何优雅保护 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;又要最大…

以智能工具辅助报考决策,夸克发布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…

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

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

混合云应用双活容灾实践

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

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

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

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

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

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

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

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

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

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

简介&#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 工…

阿里云何万青:南坡VS北坡,阿里云高性能计算行业实践

简介&#xff1a;北坡模式&#xff1a;借助于云上大计算性能突破来提供HPC服务&#xff0c;切入的重点更加聚焦于云服务。 随着数字化转型的深入&#xff0c;行业应用对算力提出更高要求。为满足不同行业灵活的业务形态与计算需求&#xff0c;以云计算技术为服务模式创新的技术…

双引擎驱动Quick BI十亿数据0.3秒分析,首屏展示时间缩短30%

简介&#xff1a;在规划中&#xff0c;Quick BI制定了产品竞争力建设的三大方向&#xff0c;包括Quick&#xff08;快&#xff09;能力、移动端能力和集成能力。针对其中的产品“报表查看打开慢”“报表开发数据同步慢”等性问题开展专项战役——Quick战役&#xff0c;以实现展…

Quick BI产品核心功能大图(六)开放集成

简介&#xff1a;企业想要拥有领先的数据分析能力&#xff0c;自研往往需要投入巨大的人力和财力。 Quick BI作为唯一一个连续两年入选Gartner魔力象限的中国BI产品&#xff0c;具备强大的全链路开放集成能力&#xff0c;可以轻松的与企业原有系统匹配融合&#xff0c;帮助企业…

低复杂度 - 服务网格的下一站

作者 | Addo Zhang来源 | 云原生指北译者&#xff1a;作为一个曾经在新造车公司的基础架构团队任职&#xff0c;为支持公司的“互联网基因”和“数字化转型”落地了云原生基础设施平台&#xff0c;并在尝试采用服务网格未成的我来说&#xff0c;看到这篇文章深有感触。尤其是文…

ADBPGGreenplum成本优化之磁盘水位管理

简介&#xff1a;本文我们将通过一个实际的磁盘空间优化案例来说明&#xff0c;如何帮助客户做成本优化。 作者 | 玉翮 来源 | 阿里技术公众号 一 背景描述 目前&#xff0c;企业的核心数据一般都以二维表的方式存储在数据库中。在核心技术自主可控的大环境下&#xff0c;政企…