我阅读了docker swarm secrets并进行了一些测试。 据我所知,秘密可以替换docker-compose.yml文件中提供的敏感环境变量(例如数据库密码)。因此,当我检查docker-compose文件或正在运行的容器时,我将看不到密码。那没关系 - 但它真正有用吗?
如果攻击者在我的泊坞主机上,他可以轻松查看/ run / secrets
docker exec -it df2345a57cea ls -la /run/secrets/
并且还可以查看里面的数据:
docker exec -it df27res57cea cat /run/secrets/MY_PASSWORD
同样的攻击者大多可以在正在运行的容器上打开一个bash,看看它是如何工作的......
此外,如果攻击者在容器本身上,他可以环顾四周。
所以我不明白为什么docker的秘密更安全,好像我把它们直接写入docker-compose.yml文件一样?
答案 0 :(得分:11)
存储在docker-compose.yml
中的秘密在该文件中可见,也应检入版本控制,其他人可以看到该文件中的值,并且它将在{{1}等命令中可见你的容器上。从那里,它也可以在容器内看到。
一个docker secret反过来会加密管理器上磁盘上的秘密,只将它存储在需要秘密的工作者的内存中(容器中可见的文件是存储在ram中的tmpfs),并且不可见在docker inspect
输出中。
这里的关键部分是你在版本控制系统之外保守秘密。使用像Docker EE的RBAC这样的工具,你也可以通过删除docker inspect
进入生产容器或使用docker机密的能力来保护那些不需要访问权限的人的秘密。生产环境。这可以在让开发人员能够查看日志和检查生产支持所必需的容器的同时完成。
另请注意,您可以在docker容器内配置一个秘密,只有特定用户才能读取,例如根。然后,您可以删除以非特权用户身份运行应用程序的权限(docker exec
等工具对此非常有用)。因此,防止攻击者在容器内部破坏应用程序来读取秘密是可行的,这对环境变量来说就不那么重要了。
答案 1 :(得分:0)
Docker Secrets 是用于 Swarm 的,而不是用于具有一些容器的节点或用于一台机器的 Docker-Compose(虽然它可以使用,但不是主要用于此目的)。如果您有多个节点,那么 Docker Secrets 比将您的秘密部署在多台工作机器上更安全,仅根据将在那里运行的容器部署到需要秘密的机器上。