在 Spring Boot 应用程序中使用 Docker 保护密钥的最佳方法是什么

Pan*_*mit 5 java security docker spring-boot microservices

最近,开始为我的应用程序构建 docker 镜像。应用程序使用很少的密钥来连接其他微服务。我读到了关于群体模式的 docker 秘密,它保存了应用程序的秘密,并且我在应用程序中进行了更改以接受 docker 秘密。我使用命令创建了秘密..

    printf "my-secrets12345" | docker secret create adminpassword
Run Code Online (Sandbox Code Playgroud)

然后我使用以下命令和 docker-compose 文件部署服务。

    version: '3.1'
    services:
      testService:
        secrets:
         - adminpassword
        image: "test-docker-secret:latest"
        #container_name: test-docker-secret
        ports:
         - "8080:8080"
        environment:
          SPRING_PROFILES_ACTIVE: dev
          SERVER_SSL_ENABLED: "true"
        volumes:
         - /home/tridev/pathtocerts/:/tmp/certificates/
    secrets:
      adminpassword:
        external: true
Run Code Online (Sandbox Code Playgroud)

以及部署的

    docker stack deploy --compose-file=test-stack-compose.yml testservice
Run Code Online (Sandbox Code Playgroud)

在此之后,我的服务开始并按预期工作,在这里,我认为我的秘密现在对任何人都无法以纯文本形式可见,并且是安全的。但是当我进入容器并浏览目录时/run/secrets/,我可以在这里以纯文本形式看到我的所有秘密。我也可以通过使用从主机查看我的秘密

    docker container exec $(docker ps --filter name=testservice -q) cat /run/secrets/adminpassword
Run Code Online (Sandbox Code Playgroud)

在这里,我看到如果有人可以访问我的容器或服务,他可以看到秘密并访问其他服务的数据。这里感觉docker的秘密是幻术师的,秘密是可见的。

docker 还有其他方法可以安全地存储密钥吗?

小智 0

是的,这总结得很好,我也不满意 Docker 容器中的秘密基本上是纯文本,只读,但仍然是纯文本。

您必须添加另一层加密:

https://medium.com/javarevisited/how-to-encrypt-secrets-in-an-spring-boot-application-57a60c8abaa7

基本上,您需要预先加密秘密,然后让插件在配置文件读取级别处理解密。多久以及是否更改/轮换密钥取决于您(每次密钥更改都需要使用新的/更新的密钥重新触发容器重新启动)

不管怎样,5 分钟之内就可以解决这个问题。