如何保护Kubernetes的机密信息

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

[[416050]]

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

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

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

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

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

  • 使用对称或非对称算法加密纯文本敏感数据。
  • 使用Kubernetes Custom Resource Definition(CRD)创建自定义的Secret对象,以使用加密的文本数据。
  • 创建一个自定义Kubernetes控制器,该控制器读取自定义Secret对象中的加密信息,并在运行时解密,并创建一个原生的Secret对象。

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

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

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

  • 你可以将敏感数据存储到第三方服务中,如AWS Secrets Manager或HashiCorp Vault。
  • 创建自定义Kubernetes控制器,基于配置从这些服务中获取机密信息,并在运行时创建Kubernetes Secret对象。

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

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

快速概览Sealed Secrets

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

Sealed Secrets由两部分组成:

  • 服务器端的控制器
  • 客户端工具:kubeseal

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

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

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

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

 

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

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

 

  1. > kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.15.0/controller.yaml 
  2.  
  3. rolebinding.rbac.authorization.k8s.io/sealed-secrets-service-proxier created 
  4. role.rbac.authorization.k8s.io/sealed-secrets-key-admin created 
  5. clusterrole.rbac.authorization.k8s.io/secrets-unsealer created 
  6. deployment.apps/sealed-secrets-controller created 
  7. customresourcedefinition.apiextensions.k8s.io/sealedsecrets.bitnami.com created 
  8. service/sealed-secrets-controller created 
  9. clusterrolebinding.rbac.authorization.k8s.io/sealed-secrets-controller created 
  10. serviceaccount/sealed-secrets-controller created 
  11. role.rbac.authorization.k8s.io/sealed-secrets-service-proxier created 
  12. rolebinding.rbac.authorization.k8s.io/sealed-secrets-controller created 

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

 

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

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

 

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

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

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

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

 

  1. apiVersion: v1 
  2. data: 
  3. DB_PWD: cGFzc3dvcmQ= //base64 encoded 
  4. DB_USER: cm9vdA==    //base64 encoded 
  5. kind: Secret 
  6. metadata: 
  7. name: db-secrets 

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

 

  1. > kubeseal --format=yaml < secret.yaml > sealed-secret.yaml 
  2.  
  3. > cat sealed-secret.yaml  
  4.  
  5. apiVersion: bitnami.com/v1alpha1 
  6. kind: SealedSecret 
  7. metadata: 
  8. creationTimestamp: null 
  9. name: db-secrets 
  10. namespace: default 
  11. spec: 
  12. encryptedData: 
  13. DB_PWD: AgDaCRi27RV4/sVI2ok7JlqBSKT5+c7gGJog+... 
  14. DB_USER: AgAZG67CrrOBnyKIKha7xhJulr+CQGPaE/PpsjvY8jJR0IDO2... 
  15. template: 
  16. metadata: 
  17.   creationTimestamp: null 
  18.   name: db-secrets 
  19.   namespace: default 

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

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

  1. > kubectl apply -f sealed-secret.yaml 

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

 

  1. > kubectl logs sealed-secrets-controller-7c766b885b-d5r2r -n kube-system  
  2. 2021/05/01 20:38:06 Updating default/db-secrets  
  3. 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文件中的数据是安全的,它是被加密的,且只能由运行在k8s集群中的Controller解密。

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

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/139901.html<

(0)
运维的头像运维
上一篇2025-03-03 16:52
下一篇 2025-03-03 16:54

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注