Spring boot 如何防止访问装载的机密文件?

Spring boot 如何防止访问装载的机密文件?,spring-boot,docker,kubernetes,Spring Boot,Docker,Kubernetes,我有一个SpringBoot应用程序,它在启动时加载一个yaml文件,其中包含一个加密密钥,它需要解密从SpringConfig接收到的属性 所述yaml文件作为k8s机密文件装载在etc/config/springconfig.yaml 如果我的springboot正在运行,我仍然可以使用“docker exec-it 123456 sh”查看yaml文件。如何防止任何人查看加密密钥?您需要限制对docker守护程序的访问。如果您正在运行Kubernetes群集,那么对可以执行docker e

我有一个SpringBoot应用程序,它在启动时加载一个yaml文件,其中包含一个加密密钥,它需要解密从SpringConfig接收到的属性

所述yaml文件作为k8s机密文件装载在etc/config/springconfig.yaml


如果我的springboot正在运行,我仍然可以使用“docker exec-it 123456 sh”查看yaml文件。如何防止任何人查看加密密钥?

您需要限制对docker守护程序的访问。如果您正在运行Kubernetes群集,那么对可以执行
docker exec…
的节点的访问应该受到严格限制

  • 一旦流程完全启动,您可以删除该文件。鉴于你的应用程序不需要再次阅读
  • 或者

  • 您可以通过--env文件设置这些属性,然后您的应用程序应该从环境中读取。但是,如果您有可能有人登录到该容器,他也可以读取环境变量
  • 或者

  • 通过使用-D将这些属性设置到JVM而不是系统环境中。Spring也可以从JVM环境中读取属性

  • 一般来说,这个问题甚至比简单地访问Docker守护进程更糟糕。即使您禁止SSH到工作节点,并且没有人可以直接使用Docker守护进程,仍然有可能读取机密

    如果名称空间中的任何人都有权创建pod(这意味着能够创建部署/statefulset/daemonsets/jobs/cronjobs等等),那么它可以轻松地创建pod并在其中装载secret,只需读取即可。即使某人只有修补吊舱/部署等的能力,他也有可能读取名称空间中的所有机密。你没办法逃避


    对我来说,这是Kubernetes最大的安全漏洞。这就是为什么您必须非常小心地授予创建和修补吊舱/部署等的权限。始终限制对命名空间的访问,始终从RBAC规则中排除机密,并且始终尝试避免提供pod创建功能

    您可以尝试将机密装载为环境变量。一旦应用程序在启动时获取了该秘密,应用程序就可以取消设置该变量,从而使该秘密无法访问


    希望这有帮助

    一种可能性是使用sysdig falco()。此工具将查看pod事件,并可在容器中启动外壳时采取操作。典型的操作是立即杀死容器,因此无法读取机密。kubernetes将重新启动容器以避免服务中断

    请注意,必须禁止访问节点本身,以避免docker守护进程的访问