如何防止访问已装入的机密文件?

时间:2019-04-30 09:50:37

标签: spring-boot docker kubernetes

我有一个spring boot应用程序,该应用程序在启动时会加载一个yaml文件,其中包含一个加密密钥,该密钥需要解密从spring config接收到的属性。

上述yaml文件作为k8s秘密文件挂载在etc / config / springconfig.yaml

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

5 个答案:

答案 0 :(得分:3)

您需要限制对Docker守护程序的访问。如果您正在运行Kubernetes集群,则应严格限制对可以执行docker exec ...的节点的访问。

答案 1 :(得分:0)

  1. 一旦过程完全开始,您可以删除该文件。鉴于您的应用无需再次读取。

OR

  1. 您可以通过--env-file设置这些属性,然后您的应用应从环境中读取。但是,即使您有可能有人登录到该容器,他也可以读取环境变量。

OR

  1. 使用-D将这些属性设置为JVM而不是系统环境。 Spring也可以从JVM环境读取属性。

答案 2 :(得分:0)

通常,此问题甚至比仅访问Docker守护程序还要严重。即使您禁止对工作节点使用SSH,并且没有人可以直接使用Docker守护程序-仍有读取机密的可能性。

如果命名空间中的任何人都有权创建Pod(这意味着可以创建部署/状态集/守护程序/作业/ cronjobs等)-它可以轻松创建Pod并在其中安装秘密并简单地读取它。即使某人仅具有修补pod /部署等功能的能力,他也可能会读取名称空间中的所有机密信息。您无法逃脱。

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

答案 3 :(得分:0)

您可以尝试将密钥安装为环境变量。一旦您的应用程序在启动时抓住了秘密,应用程序便可以取消设置该变量,从而使其无法访问该秘密。

希望这会有所帮助!

答案 4 :(得分:0)

一种可能是使用sysdig falco(https://sysdig.com/opensource/falco/)。该工具将查看pod事件,并在容器中启动shell时采取措施。典型的动作是立即杀死容器,因此不会发生读取秘密。 kubernetes将重新启动容器以避免服务中断。

请注意,您必须禁止访问节点本身,以避免docker daemon访问。