微服务和云是一回事。每个人都在谈论和写作。就我个人而言,我对这个主题思考了很多:如何利用它从中受益?可能面临哪些挑战?这如何加速日常开发?以及如何管理一切?
几天来困扰我的一个问题是“如何在微服务/云环境中管理机密?”。
想象一下一家拥有 150 名软件工程师和拥有各种产品的不同团队的公司。每个团队都在创建一个软件,每个服务都需要不同数量的秘密(API 密钥、密码、SSH 密钥等)。
“老式”方法是创建一些 ini / yaml / txt 格式的配置文件并从中读取。 12Factor 应用程序说:根据环境变量执行此操作。
可以为每台机器设置环境变量,并且配置文件也可以放置在那里。
如果您有很多机器并且部署是由几个系统管理员完成的,那么这很有效。
一般规则之一是:“不要将机密存储在 Git 存储库中。”。
现在新世界进来了。
每个团队都对他们自己开发的应用程序负责。
它们应该由团队部署和运行。
因此,我们公司正在转向容器和自助服务方式(例如 Mesos 和 Marathon 或 Kubernetes)。
当然,Dockerfiles 也可以设置环境变量。是的,您可以在构建期间将配置文件添加到 Docker 容器中。
但这样每个人都可以访问秘密(例如来自其他团队的秘密)。没有人知道谁利用了这个秘密并做了一些危险的事情。
您还想对 Dockerfile 进行版本化。您想要在 Marathon 上运行的应用程序也应该进行版本化(Git 或其他)(并通过 REST API 应用)。那么在哪里存储和管理这个容器/应用程序的所有秘密呢?
因为使用 Swarm 和 Machine(适用于 Docker)、Mesos 和 Marathon(也适用于 Docker)或 Kubernetes 等调度程序框架,您不知道您的应用程序将在哪里运行。这将在多台机器上安排。
而且大多数此类工具都没有身份验证(默认情况下,当然这可以通过 Nginx 代理或其他东西添加)。
管理秘密的一个想法是使用类似的工具Vault https://vaultproject.io/。但我从未在应用程序中看到过“原生”支持。这同样适用于Blackbox https://github.com/StackExchange/blackbox。我不知道配置管理如何解决这个问题。我知道 Chef 支持加密数据包,但据我所知,不可能使用 Chef 来设置/构建 Docker 容器。
如何在微服务/容器/云环境中与多个工程师一起管理多团队环境中的机密?
有几种解决方案。
First, DO NOT将你的秘密放入图像中。正如您已经意识到的那样,这只是一个坏主意。如果您不在构建时添加机密,则必须在运行时添加。这给我们留下了几个选择:
按照建议使用环境变量12 因素应用程序 http://12factor.net/。然后,您需要编写一个脚本,在容器启动时使用这些变量的值填充配置文件。这可行,但我不太喜欢它,因为环境变量很容易泄漏(它们可以在链接的容器中看到,docker inspect
并且经常包含在错误报告中)。另请参阅Summon https://github.com/conjurinc/summon.
使用卷。只需在运行时挂载包含机密的配置文件即可。这可行,但确实意味着您有一个包含主机上秘密的文件。当您不知道容器将在哪个主机上运行时(例如使用 Swarm 和 Mesos 等框架时),这会变得更加复杂。
使用安全的 k/v 存储,例如Vault https://hashicorp.com/blog/vault.html/Keywhiz https://github.com/square/keywhiz。正如您所指出的,您将需要执行一些脚本来将值获取到应用程序中(与环境变量一样)。您还需要以某种方式对 k/v 存储进行身份验证(您可能需要查看卷驱动程序Keywhiz https://github.com/calavera/docker-volume-keywhiz and Vault https://github.com/calavera/docker-volume-vault,或使用通过环境变量传递的一次性令牌)。
Kubernetes 已经有了对秘密的相当先进的支持 http://kubernetes.io/v1.0/docs/user-guide/secrets.html,我希望看到其他框架采用自己的解决方案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)