【问题标题】:How do I prevent access to a mounted secret file?如何防止访问已挂载的机密文件?
【发布时间】:2019-04-30 09:50:36
【问题描述】:
我有一个 spring boot 应用程序,它在启动时加载一个 yaml 文件,其中包含一个加密密钥,它需要解密从 spring config 接收到的属性。
上述yaml文件作为k8s秘密文件挂载在etc/config/springconfig.yaml
如果我的 springboot 正在运行,我仍然可以使用“docker exec -it 123456 sh”sh 并查看 yaml 文件如何防止任何人查看加密密钥?
【问题讨论】:
标签:
spring-boot
docker
kubernetes
【解决方案1】:
您需要限制对 Docker 守护程序的访问。如果您正在运行 Kubernetes 集群,那么对可以执行 docker exec ... 的节点的访问应该受到严格限制。
【解决方案2】:
- 您可以在进程完全启动后删除该文件。鉴于您的应用不需要再次读取。
或,
- 您可以通过 --env-file 设置这些属性,然后您的应用程序应该从环境中读取。但是,如果您有可能有人登录到该容器,他也可以读取环境变量。
或,
- 使用 -D 将这些属性设置到 JVM 而不是系统环境中。 Spring 也可以从 JVM 环境中读取属性。
【解决方案3】:
一般来说,这个问题比简单地访问 Docker 守护进程还要糟糕。即使您禁止 SSH 到工作节点并且没有人可以直接使用 Docker 守护程序 - 仍然有可能读取机密。
如果命名空间中的任何人都有权创建 pod(这意味着能够创建部署/statefulsets/daemonsets/jobs/cronjobs 等) - 它可以轻松地创建 pod 并在其中挂载机密并简单地读取它。即使某人只能修补 pod/部署等 - 他可能可以读取命名空间中的所有秘密。你没有办法逃脱它。
对我来说,这是 Kubernetes 中最大的安全漏洞。这就是为什么您必须非常小心地授予创建和修补 pod/部署等的访问权限。始终限制对命名空间的访问,始终从 RBAC 规则中排除机密,并始终尽量避免提供 pod 创建功能。
【解决方案4】:
一种可能是使用 sysdig falco (https://sysdig.com/opensource/falco/)。此工具将查看 pod 事件,并可以在您的容器中启动 shell 时采取行动。典型的动作是立即杀死容器,因此不会发生读取机密。并且kubernetes会重启容器,避免服务中断。
请注意,您必须禁止访问节点本身以避免 docker daemon 访问。
【解决方案5】:
您可以尝试将密钥挂载为环境变量。一旦您的应用程序在启动时获取了密码,应用程序就可以取消设置该变量,从而使密码无法访问。