【问题标题】: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】:
      1. 您可以在进程完全启动后删除该文件。鉴于您的应用不需要再次读取。

      或,

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

      或,

      1. 使用 -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】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-04-28
              • 2012-05-01
              • 2021-10-02
              • 1970-01-01
              • 2019-04-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多