已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
背景: 我做了 5 年安全加固,最近给一个 K8s 1.28(containerd 1.7、内核 5.15)的多租户 SaaS 做凭据管理加固。现在所有服务的密钥(数据库密码、第三方 API key、TLS 私钥)都是这么走的:
envFrom: secretRef 注入成环境变量,要么 volume 挂载成文件os.environ / 读文件取走我的核心担忧是「落盘 + 进进程环境」这两件事:密钥一旦以文件形式躺在容器里,或挂在进程环境里,就有三条泄露通道我没法封死——
/proc/PID/environ 和 /proc/PID/maps(内存映射)在容器内同 UID 用户或具备 SYS_PTRACE 的情况下可读;kubectl exec / 调试镜像里的 env 命令,密钥直接回显。现象:
我们做季度渗透时,安全组用一条 kubectl exec <pod> -- cat /proc/1/environ 就把生产 DB 密码捞出来了——因为那个 Pod 是 root 跑的,exec 进去就是全权限。事后复盘,问题不在「谁 exec」,而在「密钥本来就躺在一个能被 exec 直接读到的地方」。
已尝试的排查与结果:
cat 照样能读,没根治;/vault/secrets/),等于换了个地方落盘,/vault/secrets 一样能被 exec 读到,我卡在这儿了;cat 还是拿得到,tmpfs 只是不落「物理盘」,但「进可读内存/文件」这个本质没变;我现在的判断是:只要密钥以「文件」或「进程环境」的形式存在,且容器允许 exec / 能读 /proc,就一定存在泄露面。我想找的是「密钥只以短期 token 形式存在、真正的主密钥留在 Vault/KMS 侧、进程拿到的是一句可过期的引用而非明文」这类架构,但不知道怎么在 K8s 里具体落地。
期望得到的答案形态(希望具体、可复现):
ulimit -c 0 / noexec 挂载 / seccomp 禁 ptrace 这几招各自能封住哪条通道、哪条封不住,请说清楚;我引用的两条站内内容,和我的问题同属「凭据/密钥在容器里怎么放」这条线,供参考上下文:
.env 密钥泄露链与加固的文章(id=1450)——它解决的是「密钥烘进镜像层」这条通道,和我这里「密钥挂在运行期 Pod 里」是相邻但不同的问题;