最近,开始为我的应用程序构建 docker 镜像。应用程序使用很少的密钥来连接其他微服务。我阅读了有关具有 swarm 模式的 docker 机密的信息,该模式保存应用程序机密,并在应用程序中进行了更改以接受 docker 机密。我使用命令创建了机密。
printf "my-secrets12345" | docker secret create adminpassword
然后我使用以下命令和 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
和部署的
docker stack deploy --compose-file=test-stack-compose.yml testservice
在此之后,我的服务开始并按预期工作,在这里我认为我的秘密现在以纯文本和安全的方式对任何人都不可见。但是当我进入容器并浏览目录/run/secrets/
时,在这里我可以看到我所有的秘密都是纯文本。我也可以使用
docker container exec $(docker ps --filter name=testservice -q) cat /run/secrets/adminpassword
在这里,我看到如果有人可以访问我的容器或服务,他可以看到机密并访问其他服务中的数据。在这里,感觉码头工人的秘密是魔术师,秘密是可见的。
码头工人还有其他方法可以安全地存储密钥吗?
是的,这几乎总结了它,我也不高兴秘密基本上是 docker 容器中的纯文本,只读,但仍然是纯文本。
您必须添加另一层加密:
https://medium.com/javarevisited/how-to-encrypt-secrets-in-an-spring-boot-application-57a60c8abaa7
基本上你需要预先加密密钥,然后让插件在配置文件读取级别处理解密。 更改/轮换密钥的频率和是否由您决定(每次密钥更改都需要使用新的/更新的密钥重新触发容器重启(
无论哪种方式,都没有简单的 5 分钟解决此问题。