为什么 Docker Secrets 被认为是安全的?



我读了关于docker swarm秘密的信息,也做了一些测试。 据我了解,这些秘密可以替换 docker-compose.yml 文件中提供的敏感环境变量(例如数据库密码)。因此,当我检查 docker-compose 文件或正在运行的容器时,我不会看到密码。这很好 - 但它真正有帮助什么?

如果攻击者在我的 docker 主机上,他可以轻松查看/run/secrets

docker exec -it df2345a57cea ls -la /run/secrets/

还可以查看里面的数据:

docker exec -it df27res57cea cat /run/secrets/MY_PASSWORD

同一个攻击者大多可以在正在运行的容器上打开一个 bash 并查看它是如何工作的......

此外,如果攻击者在容器本身上,他可以环顾四周。

所以我不明白为什么 docker 机密更安全,就像我将它们直接写入 docker-compose.yml 文件一样?

存储在docker-compose.yml中的机密在该文件中可见,该文件也应签入到版本控制中,其他人可以看到该文件中的值,并且它将在命令中可见,例如容器上的docker inspect。从那里,它也在您的容器内可见。

相反,docker 密钥将加密管理器磁盘上的密钥,仅将其存储在需要密钥的 worker 的内存中(容器中可见的文件是存储在 ram 中的 tmpfs),并且在docker inspect输出中不可见。

这里的关键部分是你在版本控制系统之外保守秘密。使用 Docker EE 的 RBAC 等工具,您还可以通过删除他们docker exec生产容器的能力或将 docker 机密用于生产环境,使不需要访问的任何人看不到机密。这可以在使开发人员能够查看日志和检查生产支持可能需要的容器的同时完成。

另请注意,您可以将 docker 容器中的密钥配置为仅由特定用户读取,例如 root。然后,您可以删除以非特权用户身份运行应用程序的权限(gosu等工具对此很有用)。因此,可以防止攻击者读取机密,从而破坏容器内的应用程序,这对于环境变量来说就不那么简单了。

Docker Secrets 适用于 Swarm,而不是针对具有某些容器的节点或一台机器的 Docker-Compose (虽然可以使用,但主要不是用于此目的)。如果您有多个节点,则 Docker 机密比在多个工作计算机上部署机密更安全,仅部署到需要密钥的计算机(基于将在那里运行的容器)。

请参阅此博客:Docker 机密管理简介