微服务和云是一件事。每个人都在谈论和写作。就我个人而言,我正在考虑这个话题:如何利用它来获益?有哪些可能的挑战?这怎么能加速日常发展?以及如何管理所有事情? 几天之后困扰我的一个问题是“如何管理微服务/云环境中的秘密?”。
想象一家拥有150名软件工程师和各种团队的公司。每个团队都在创建一个软件,每个服务都需要各种秘密(API密钥,密码,SSH密钥等等)。 “旧时尚”方式是以ini / yaml / txt格式创建一些配置文件并从中读取。 12个因子应用程序说:按照env vars进行。
可以为每台机器设置Env变量,也可以将配置文件放在那里。 如果你手持一台机器并且部署由一些系统管理员完成,这就有效。 一般规则说:“不要在Git仓库中存储秘密。”
现在新世界进来了。 曾经的团队负责他们自己生产的应用程序。 它们应该由团队部署和运行。 所以我们公司正在转向集装箱和自助服务方式(例如Mesos和Marathon或Kubernetes)。
当然,Dockerfiles也可以设置env vars。是的,您可以在构建期间将配置文件添加到Docker容器中。 但有了这个,每个人都可以访问秘密(例如来自其他团队)。没有人知道谁使用这个秘密并做了一些危险的事情。
您也希望对Dockerfiles进行版本化。您希望在Marathon上运行的应用程序也应该进行版本化(Git或其他)(并由REST API应用)。那么在哪里存储和管理这个容器/应用程序的所有秘密? 因为使用Swarm和Machine(对于Docker),Mesos和Marathon(也可用于Docker)或Kubernetes等调度程序框架,您不知道应用程序将在何处运行。这将安排在几台机器上。 大多数这些工具都没有验证(默认情况下,这当然可以通过Nginx代理或其他东西添加)。
管理机密的一个想法是使用像Vault这样的工具。但我从来没有在应用程序中看到“原生”支持。这同样适用于Blackbox。我不知道配置管理如何解决这个问题。我知道Chef支持加密的数据库,但是不能使用Chef来设置/构建Docker容器。
如何在微服务/容器/云环境中与多名工程师一起管理多个团队环境中的秘密?
答案 0 :(得分:10)
有几种解决方案。
首先,不要将您的秘密放入图像中。你已经意识到,这只是个坏主意。如果您不在构建时添加秘密,则必须在运行时执行此操作。这给我们留下了一些选择:
使用12 Factor App建议的环境变量。然后,您需要编写一个脚本,在容器启动时使用这些变量的值填充配置文件。这可行,但我不是很喜欢它,因为环境变量很容易泄露(它们可以在链接容器和docker inspect
中看到,并且通常包含在错误报告中)。另请参阅Summon。
使用卷。只需在运行时安装配置文件和秘密。这有效,但确实意味着你有一个文件,其中包含主机上的秘密。如果您不知道容器将在哪个主机上运行,例如使用Swarm和Mesos等框架时,这会变得更加复杂。
使用安全的k / v商店,例如Vault / Keywhiz。正如您所指出的,您需要执行一些脚本来将值传入应用程序(与env变量一样)。您还需要以某种方式对k / v存储进行身份验证(您可能需要查看Keywhiz和Vault的卷驱动程序,或使用通过env var传递的一次性令牌。 / p>
Kubernetes已经有fairly advanced support for secrets,我希望看到其他框架采用自己的解决方案。