如何pipe理微服务/容器/云环境中的秘密?

微服务和云是一件事情。 每个人都在谈论和写作。 就我个人而言,我正在思考很多关于这个话题:如何从中受益? 什么是可能的挑战? 这怎么能加速日常的发展? 如何pipe理所有的东西? 几天以来困扰我的一个问题是“如何pipe理微服务/云环境中的秘密?”。

设想一家拥有150名软件工程师和各种产品的团队。 每个团队都在创build一个软件,每个服务都需要不同数量的秘密(API密钥,密码,SSH密钥等等)。 “老式”方式是以ini / yaml / txt格式创build一些configuration文件并从中读取。 12因素应用程序说:做每个环境variables。

环境variables可以在每台机器上设置,configuration文件也可以放在那里。 如果你有一堆机器,并且部署由几个系统pipe理员完成,这是有效的。 其中一条规则是:“不要在Git仓库中存储秘密”。

现在,新的世界进来了。永远的团队负责他们自己生产的应用程序。 他们应该由团队部署和运行。 所以我们公司正在转向集装箱和自助服务的方式(如Mesos和Marathon或Kubernetes)。

当然,Dockerfiles也可以设置env vars。 是的,您可以在构build过程中将您的configuration文件添加到Docker容器中。 但是,每个人都可以访问这些秘密(例如来自其他团队)。 没有人知道谁使用这个秘密,做一些危险的事情。

你也想要版本化你的Dockerfiles。 你想在Marathon上运行的应用程序也应该进行版本化(Git或其他)(并由REST API应用)。 那么在哪里存储和pipe理这个容器/应用程序的所有秘密? 因为像Swarm和Machine(Docker)这样的调度器框架,Mesos和Marathon(也可用于Docker)或者Kubernetes你不知道你的应用程序将在哪里运行。 这将安排在几台机器上。 而且大部分工具都没有authentication(默认情况下,这可以通过Nginx代理或其他东西来添加)。

pipe理秘密的一个想法是使用像Vault这样的工具。 但我从来没有在应用程序中看到“原生”的支持。 这同样适用于Blackbox 。 而且我不知道configurationpipe理如何解决这个问题。 我知道厨师支持encryption的数据包,但afaik不可能使用厨师来设置/构buildDocker容器。

你如何在一个多团队的环境中与几个工程师在微服务/容器/云环境中pipe理秘密?

有几个解决scheme。

首先, 不要把你的秘密放入图像。 正如你所意识到的那样,这是一个糟糕的主意。 如果您在构build时不添加秘密,则必须在运行时进行。 这给我们留下了几个select:

  • 使用12因子应用程序build议的环境variables。 然后你需要编写一个脚本,在容器启动时用这些variables的值填充configuration文件。 这是有效的,但我不太喜欢它,因为环境variables很容易泄漏(可以在链接的容器和docker inspect看到,通常包含在bug报告中)。 另请参阅召唤 。

  • 使用卷。 只需在运行时用秘密装入configuration文件即可。 这是有效的,但确实意味着你有一个秘密的东西躺在主机上的文件。 当你不知道你的容器将运行在哪个主机上的时候,这会变得更加复杂,比如使用像Swarm和Mesos这样的框架。

  • 使用安全的K / V商店,如Vault / Keywhiz 。 正如你指出的那样,你将需要做一些脚本来获取值到应用程序中(与env vars一样)。 您还需要以某种方式向k / v存储进行身份validation(您可能需要查看Keywhiz和Vault的卷驱动程序,或使用通过env var传递的一次性令牌)。

Kubernetes 对秘密已经有了相当先进的支持 ,我希望看到其他框架采用他们自己的解决scheme。