ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

GitOps 实践中的敏感密钥治理:Bitnami Sealed Secrets 实战

GitOps 实践中的敏感密钥治理:Bitnami Sealed Secrets 实战 GitOps 实践中的敏感密钥治理Bitnami Sealed Secrets 实战在云原生与 GitOps如 ArgoCD、Flux的黄金定律中“一切皆代码所有状态必须保存在 Git 仓库中”是持续交付的核心信条。通过 Git 仓库的版本历史我们可以清晰审计每一次集群变更随时实现一键回滚。然而这一信条在遇到**敏感配置与凭证Secrets**时遭遇了巨大的安全挑战Kubernetes 的原生Secret资源其内部的data字段仅仅是简单的Base64 编码例如echo root_pass | base64根本没有任何加密防护如果直接将包含数据库密码、Token 密钥、TLS 私钥的原生 Secret YAML 提交到共有或私有的 Git 仓库中就相当于把机房大门的钥匙公开悬挂在互联网上极易引发严重的数据泄露安全事故如果把 Secret 排除在 Git 之外每次部署又不得不通过手动kubectl apply这又彻底破坏了 GitOps“全声明式、全自动化”的初衷。为了在**“将所有配置保存在 Git”与“绝对保护密钥机密性”**之间达成完美平衡Bitnami 推出的Sealed Secrets架构成为了当前开源云原生生态中最成熟的解决方案。sequenceDiagram autonumber actor Dev as 工程师客户端 (本地开发机) participant Kubeseal as 命令行工具: kubeseal participant Git as GitOps 核心代码仓库 participant Argo as ArgoCD 交付引擎 participant Controller as 集群控制器: sealed-secrets-controller participant RealSecret as K8s 原生 Secret 资源 Dev-Kubeseal: 1. 传入敏感密文明文 (db_password) Note over Kubeseal: 2. 使用集群公钥进行非对称加密 (RSA-4096) Kubeseal--Dev: 3. 输出 SealedSecret 加密资源 YAML Dev-Git: 4. 安全地将密文 YAML push 到 Git 仓库 Git-Argo: 5. 触发 GitOps 同步流程 Argo-Controller: 6. 部署 SealedSecret 到生产集群 Note over Controller: 7. 控制器持有集群私钥解密密文 Controller-RealSecret: 8. 在集群内存中生成原生 Secret 供 Pod 挂载1. Sealed Secrets 的密码学架构非对称加密闭环Sealed Secrets 的设计极其优雅其核心基于非对称公私钥体系Asymmetric Cryptography集群端部署 Controller在 Kubernetes 集群内部署sealed-secrets-controller守护进程。在初始化阶段Controller 会在集群本地自动生成一对 RSA-4096 位的公私钥对。私钥被严格保存在集群内部的 Secret 中绝不离开集群客户端公钥加密kubeseal开发者在本地使用kubesealCLI 工具。该工具可以从集群获取公钥或直接加载离线公钥文件在本地对包含明文密码的 Kubernetes Secret 进行强力加密生成SealedSecret自定义资源CRD安全提交 Git 仓库由于SealedSecret内部的数据经过非对称公钥加密哪怕该 YAML 被公开泄漏给外部黑客没有集群内部的私钥也绝不可能逆向破解。因此它可以完全放心地提交到 Git 仓库并纳入 GitOps 流水线集群内部自愈解密当 ArgoCD 将SealedSecret同步到集群中时Controller 会监听到该事件使用内部持有的私钥将其解密并在同一个命名空间下实时生成标准的原生 KubernetesSecret供 Pod 挂载。2. 生产实战从明文 Secret 到 SealedSecret 的生成与部署步骤一在本地准备明文 Secret 模板不提交 Git# secret-raw.yaml (临时文件严禁提交) apiVersion: v1 kind: Secret metadata: name: llm-db-credentials namespace: ai-serving type: Opaque stringData: DB_USER: ai_admin DB_PASSWORD: SuperSecretPassword2026! OPENAI_API_KEY: sk-internal-enterprise-token-9883步骤二使用kubeseal执行离线/在线非对称加密# 执行加密转换输出安全的 sealed-secret.yaml kubeseal \ --controller-namesealed-secrets-controller \ --controller-namespacekube-system \ --formatyaml secret-raw.yaml sealed-secret.yaml生成的sealed-secret.yaml内容如下可完全安全地提交到 Git 仓库apiVersion: bitnami.com/v1alpha1 kind: SealedSecret metadata: name: llm-db-credentials namespace: ai-serving spec: encryptedData: DB_USER: AgBy...[加密密文串]... DB_PASSWORD: AgCw...[加密密文串]... OPENAI_API_KEY: AgDz...[加密密文串]... template: metadata: name: llm-db-credentials namespace: ai-serving步骤三在业务 Pod 中无感挂载原生 Secret业务应用的代码和 Deployment YAML 完全无需知道 Sealed Secrets 的存在直接挂载最终生成的原生 Secret 即可apiVersion: apps/v1 kind: Deployment metadata: name: llm-backend namespace: ai-serving spec: template: spec: containers: - name: app image: llm-backend:v1.0 envFrom: - secretRef: name: llm-db-credentials # 挂载 Controller 解密生成的原生 Secret3. 生产安全范围Scopes与避坑指南Sealed Secrets 在加密时提供了三种作用域Scopes在生产中必须严格按需选择strict默认且最安全密文与特定的 Secret 名称和命名空间强绑定。如果有人试图把ai-serving命名空间下的密文 Copy 到default命名空间解密Controller 会直接拒绝解密。namespace-wide密文可以在同一个命名空间下的任意 Secret 名称间复用。cluster-wide密文可在全集群任意命名空间使用安全性较低生产环境严禁滥用。灾备铁律集群私钥备份Sealed Secrets Controller 的私钥是全集群解密的唯一凭证。在集群初始化完毕后必须第一时间将 Controller 的私钥 Secret 导出并离线归档至企业硬件密码机HSM或加密保险箱。一旦集群发生灾难性重建且私钥丢失Git 仓库中所有的 SealedSecret 将永久无法解密
返回列表