K8S 里的密码去哪了?凭据管理系统在容器环境的四种集成实践

发布时间:2026/7/23 14:04:37
K8S 里的密码去哪了?凭据管理系统在容器环境的四种集成实践 摘要很多人以为把数据库密码塞进 Kubernetes Secret 就安全了其实 Secret 默认只是 base64 编码在 etcd 里近乎明文躺着。本文从 K8S 原生凭据方案的真实痛点出发拆解如何用外部凭据管理系统SMS实现密码不进 YAML、不落 etcd、动态注入、自动轮转并给出 Init Container、Sidecar、CSI Driver、SDK 直连四种集成方式的完整落地示例。一、先泼一盆冷水K8S Secret 并不安全几乎每个上云团队都踩过这个坑——把密码写进 Deployment 的环境变量太丑于是改用 Secret然后就心安理得了。但 Secret 有三个致命误区1.1 Secret 不是加密是 base64 编码# 你以为的加密$echo-nAdmin123|base64 QWRtaW5AMTIz# 任何人拿到就能还原$echoQWRtaW5AMTIz|base64-dAdmin123base64 是编码不是加密任何拿到 Secret YAML 或 etcd 快照的人都能一秒还原。1.2 etcd 默认不加密存储Secret 最终存在 etcd 里。如果没有开启EncryptionConfigurationetcd 备份文件、快照、甚至误配置的备份 OSS 桶都等于把生产库密码明文送人。1.3 GitOps 让 Secret 进了 Git 仓库ArgoCD / Flux 流行后大家习惯把 K8S 清单全放进 Git。Secret 也跟着进了仓库——哪怕用了 SealedSecrets密钥管理和轮转依然是老大难。一句话总结痛点K8S 原生方案解决的是密码怎么传给 Pod没解决密码本身怎么被安全地存储、轮转、审计。二、容器环境凭据治理的六个真实痛点结合大量落地案例K8S 场景下凭据管理的痛点可以归纳为下面这张表#痛点后果等保/合规影响1Secret base64 明文可还原拿到 YAML/etcd 即泄露高危项2密码硬编码进镜像/ConfigMap镜像分发即泄露一票否决3密码无法自动轮转改密码要重启全部 Pod长期不轮转高危4多集群多命名空间凭据分散无统一管理入口审计困难5谁读了 Secret 无记录无法追溯泄露源审计缺失6离职/外包人员仍能读 Secret权限回收滞后访问控制不达标这些痛点的共性是凭据的生命周期存储、分发、轮转、销毁、审计散落在 K8S 之外没有统一治理面。三、思路把凭据管理下沉到专用系统解法不是给 K8S Secret 打补丁而是引入一个独立的凭据管理系统Secret Management System下文简称 SMS让 K8S 只负责调度凭据的存储与治理全部交给 SMS┌─────────────────────────────────────────────┐ │ Kubernetes 集群 │ │ ┌────────────┐ ┌────────────┐ │ │ │ 业务 Pod │ │ 业务 Pod │ │ │ │ (无密码) │ │ (无密码) │ │ │ └─────┬──────┘ └─────┬──────┘ │ │ │ 动态获取临时凭据 │ │ │ └────────┬────────┘ │ └─────────────────┼─────────────────────────────┘ │ ① ServiceAccount 身份鉴权 ▼ ┌───────────────────────┐ │ SMS 凭据管理系统 │ │ • 统一加密存储 │ │ • 动态临时凭据 (TTL) │ │ • 自动轮转 │ │ • 全程访问审计 │ └──────────┬────────────┘ │ ② 返回带 TTL 的临时凭据 ▼ ┌───────────────────────┐ │ 数据库 / 中间件 / API │ └───────────────────────┘这里用到两个关键能力动态临时凭据Pod 每次拿到的都是带有效期TTL如 1 小时的临时密码用完即毁密码不进 YAML、不落 etcd。自动轮转数据库真实密码由 SMS 按周期如 ≤90 天自动轮转业务 Pod 无感知不用重启。四、四种集成方法含完整示例在 K8S 里接入 SMS主流有四条路径按侵入性从低到高排列。4.1 方法一Init Container 预拉取启动前用 Init Container 向 SMS 申请凭据写入共享的emptyDir内存卷业务容器直接读文件。业务代码零改造。apiVersion:apps/v1kind:Deploymentmetadata:name:order-servicespec:template:spec:serviceAccountName:order-sa# 用 SA 向 SMS 鉴权volumes:-name:credsemptyDir:medium:Memory# 内存卷不落磁盘initContainers:-name:fetch-credsimage:registry/sms-agent:latestargs:[fetch,--idorder-db,--out/creds/db.json]volumeMounts:-{name:creds,mountPath:/creds}containers:-name:appimage:registry/order-service:1.0volumeMounts:-{name:creds,mountPath:/creds,readOnly:true}适用凭据在 Pod 生命周期内基本不变的场景。缺点是长时间运行的 Pod 拿不到轮转后的新凭据需配合 Sidecar。4.2 方法二Sidecar 常驻刷新注入一个 sidecar 容器常驻 Pod定时向 SMS 续期/刷新凭据写入共享内存卷。轮转后 sidecar 自动拉新业务无感知。containers:-name:appimage:registry/order-service:1.0volumeMounts:-{name:creds,mountPath:/creds,readOnly:true}-name:sms-sidecarimage:registry/sms-agent:latestargs:[watch,--idorder-db,--out/creds/db.json,--interval300]volumeMounts:-{name:creds,mountPath:/creds}适用长时间运行、需要感知凭据轮转的服务。这是与自动轮转配合最好的模式。4.3 方法三Secrets Store CSI Driver通过标准的 CSI Driver 把 SMS 里的凭据以卷的形式挂载进 Pod云原生程度最高运维统一。volumes:-name:credscsi:driver:secrets-store.csi.k8s.ioreadOnly:truevolumeAttributes:secretProviderClass:sms-order-db配套的SecretProviderClass声明去哪个 SMS 实例、取哪些凭据权限与集群解耦。适用已有平台化运维、希望用统一 CSI 规范管理所有外部密钥的团队。4.4 方法四SDK 直连业务代码里直接调 SMS SDK 动态获取凭据控制力最强改动一行配置读取逻辑即可。# ❌ 改造前密码硬编码 / 从 Secret 环境变量读明文可见# password os.environ[DB_PASSWORD]# ✅ 改造后运行时动态获取临时凭据不落盘fromsms_sdkimportCredentialManager cmCredentialManager(authk8s-sa)# 用 Pod 的 SA Token 鉴权credcm.get_credential(order-db)# 返回带 TTL 的临时凭据connmysql.connect(hostcred[host],usercred[user],passwordcred[password],# 1 小时后自动失效)适用新项目或愿意做少量改造、追求最小密码暴露窗口的场景。四种方法对比方法业务改造支持轮转刷新云原生度推荐场景Init Container零否中凭据基本不变Sidecar零是中长运行需轮转CSI Driver零是高平台化统一运维SDK 直连少量是中新项目/最小暴露五、身份鉴权Pod 凭什么能取凭据关键在于用 K8S ServiceAccount 做 Pod 到 SMS 的身份鉴权而不是再发一个静态 token否则又回到了密码换密码的死循环。流程如下Pod 挂载自己的 SA TokenK8S 自动注入/var/run/secrets/...。sms-agent / SDK 拿 SA Token 向 SMS 换取短时会话。SMS 校验 SA 身份命名空间 SA 名 集群命中授权策略才签发临时凭据。每次签发写入审计日志哪个 Pod、哪个 SA、取了哪个库、什么时间。这样即使 Pod 被攻破攻击者拿到的也只是带 TTL 的临时凭据且行为全程留痕可快速定位与止血。六、落地 checklist梳理集群内全量凭据清单数据库、中间件、API、云账号。部署 SMS把凭据迁入加密存储删除 YAML/ConfigMap 里的明文。按服务特征选集成方式短命 Job 用 Init Container常驻服务用 Sidecar/CSI。配置 SA 授权策略做到一个命名空间只能取自己的凭据。开启自动轮转≤90 天 新旧双写过渡验证 Pod 无感知刷新。打开全程审计日志归档留存接入 SIEM 告警。七、写在最后K8S 把应用调度做到了极致但凭据治理从来不是它的强项。与其在 Secret 上层层打补丁不如把凭据的存储、轮转、审计交给专门的凭据管理系统让 Pod 只在运行时拿到用完即毁的临时凭据。密码不进 YAML、不落 etcd、可轮转、可审计——这才是容器环境凭据治理应有的样子。作者注本文所述动态临时凭据、自动轮转能力可结合国密算法与硬件密钥模块落地具体部署方案建议结合集群规模与合规要求评估。免责声明本文仅供技术交流具体合规要求以官方标准文件为准。