公众号关注 「奇妙的 Linux 世界」

设为「星标」,每天带你玩转 Linux !

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3快速概览Sealed Secrets

在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的机密信息。

相关链接:

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

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

原文链接:https://waswani.medium.com/securing-secrets-in-kubernetes-c78c7bcd433

本文转载自:「分布式实验室」,原文:https://tinyurl.com/dzbn6dnz,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。

你可能还喜欢

点击下方图片即可阅读

Kubernetes Deployment 故障排查可视化指南 2021 中文版 (内附高清下载)


点击上方图片,『美团|饿了么』外卖红包天天免费领

更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!

如何优雅的保护 Kubernetes 中的 Secrets相关推荐

  1. 日志的log中如何输出变量_如何在kubernetes中优雅的输出日志

    背景 我们经常需要在kubernetes中运行一些任务性质的Job或者Pod.在调试过程中,我们对日志有如下两个需求 需求一:日志输出到stdout.因为stdout的输出,可以非常方便的通过kube ...

  2. 基于CNI保护Kubernetes集群中的主机

    原文发表于kubernetes中文社区,为作者原创翻译 ,原文地址 更多kubernetes文章,请多关注kubernetes中文社区 目录 DaemonSet解决方案概述 创建应用程序 创建一个Do ...

  3. 如何优雅的修改 Kubernetes Master 节点 IP?可没你想象中那么简单!

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 昨天网络环境出了点问题,本地的虚拟机搭建的 Kubernetes 环境没有固定 IP,结果节点 IP 变了,当然最 ...

  4. 艰难的选择_如何艰难地保护Kubernetes

    艰难的选择 Kubernetes is open-source, robust, and one of the most popular container orchestration platfor ...

  5. e.V4p.C0/index.php,php-fpm进程在Kubernetes中接收SIGKILL信号

    我已经在其中配置了Nginx,PHP和php-fpm创建了ubuntu docker镜像 . 当我在Docker实例上运行它时工作正常 . 但是当我在kubernetes中运行相同的图像时,php-f ...

  6. Kubernetes 中创建 Pod 时集群中到底发生了些什么?

    想象一下,如果我想将 nginx 部署到 Kubernetes 集群,我可能会在终端中输入类似这样的命令: $ kubectl run --image=nginx --replicas=3 然后回车. ...

  7. kubernetes 中 label的作用_Kubernetes生产环境的16条建议

    Kubernetes是用于构建高度可扩展系统的强大工具.结果,许多公司已经开始或正在计划使用它来协调生产服务.不幸的是,像大多数强大的技术一样,Kubernetes也很复杂.我们整理了以下清单,以帮助 ...

  8. 在每个运行中运行多个查询_在Kubernetes中运行OpenEBS

    什么是OpenEBS? 现在,OpenEBS是kubernetes下与容器原生和容器附加存储类型相关通用的领先开源项目之一. 通过为每个工作负载指定专用的存储控制器,OpenEBS遵循容器附加存储或C ...

  9. Kubernetes中Pod生命周期

    在 Kubernetes中Pod是容器管理的最小单位, 有着各种各样的Pod管理器. 那么一个Pod从启动到释放, 在这期间经历了哪些过程呢? Pod自开始创建, 到正常运行, 再到释放, 其时间跨度 ...

最新文章

  1. 面向对象--内部属性类型
  2. VTK:网格之MatrixMathFilter
  3. 简易计算器 java_终于写出一个简单的计算器了
  4. 携程Docker实践
  5. 【服务端渲染】NuxtJS基础
  6. Disable IE7 address bar:不显示IE地址栏
  7. 用友CDM系统“货位间商品移库单(一步)”表体增加“货位可用数量”字段,根据表头的选择的货位自动带出数值...
  8. Java项目——Everything 开发思路
  9. 英语常用九种时态记忆要点
  10. iOS商户进件之【营业执照编号校验】18位社会信用代码验证 unified social credit identifier
  11. 【高并发】秒杀系统设计思路
  12. 微信支付-----扫码支付,统一下单
  13. FYI | 谷歌的summer project围观一下
  14. 提高排名的 15 个基本 SEO 技巧
  15. Mac提高办公/开发效率的几个软件推荐
  16. Mac上使用LaTeX(小白入门配置Latex)
  17. [Nodejs入门]第四篇,用nodejs实现一个爬虫的功能
  18. 基于PyQt的分组工具
  19. 新闻推荐系统-项目介绍(PRD)
  20. python使用cer证书进行https访问接口

热门文章

  1. SQL命令之万象会员删除与修改类型,批量修改会员过期时间
  2. 2023还有人不知道kubernetes?| 初步理解kubernetes
  3. 苹果榜单优化的主要方式?
  4. NLP入门:word2vec self-attention transformer diffusion的技术演变
  5. 关于uart串口接收端乱码问题
  6. javascript三目运算符的嵌套
  7. 两万字吐血总结,代理模式及手写实现动态代理(aop原理,基于jdk动态代理)
  8. LoRa设备如何连接到腾讯云?
  9. 鸿蒙内核源码分析表,鸿蒙内核源码分析(双向链表篇) | 谁是内核最重要结构体 ? | 开篇致敬鸿蒙内核开发者 | v1.10...
  10. 使用H5的Canvas,实现证件照的识别