我有一个Spring启动应用程序,它在启动时加载一个yaml文件,其中包含一个加密密钥,它需要解密从spring配置接收的属性。
所述yaml文件作为k8s秘密文件安装在etc / config / springconfig.yaml中
如果我的springboot正在运行,我仍然可以使用“docker exec -it 123456 sh”来查看yaml文件。如何防止任何人查看加密密钥?
您需要限制对Docker守护程序的访问。如果您正在运行Kubernetes集群,则应严格限制对可以执行docker exec ...
的节点的访问。
要么,
要么,
通常,问题甚至比仅仅访问Docker守护程序更糟糕。即使你禁止SSH到工作节点,没有人可以直接使用Docker守护进程 - 仍然有可能读取秘密。
如果命名空间中的任何人都有权创建pod(这意味着能够创建部署/ statefulsets / daemonsets / jobs / cronjobs等) - 它可以轻松地在其中创建pod和mount秘密并简单地读取它。即使有人只能修补pod /部署等等 - 他可能会读取命名空间中的所有秘密。没有办法逃脱这种情况。
对我来说,这是Kubernetes最大的安全漏洞。这就是为什么你必须非常谨慎地提供创建和修补pod /部署等的访问权限。始终限制对命名空间的访问,始终从RBAC规则中排除秘密,并始终尽量避免提供pod创建功能。
您可以尝试将密钥作为环境变量加载。一旦您的应用程序在启动时获取秘密,应用程序就可以取消设置该变量,使其上的秘密无法访问。
希望这可以帮助!
一种可能性是使用sysdig falco(https://sysdig.com/opensource/falco/)。此工具将查看pod事件,并且可以在容器中启动shell时执行操作。典型的操作是立即杀死容器,因此不会发生读取秘密。并且kubernetes将重新启动容器以避免服务中断。
请注意,您必须禁止访问节点本身以避免停靠守护程序访问。