如何在微服务/容器/云环境中管理机密?

微服务和云是一回事。每个人都在谈论和写作。就我个人而言,我对这个话题思考了很多:如何利用它从中受益?可能的挑战是什么?如何加快日常发展?如何管理一切?
几天来困扰我的一个问题是“如何在微服务/云环境中管理机密?”

想象一下,一家拥有150名软件工程师和各种产品团队的公司。每个团队都在创建一个软件,每个服务都需要不同数量的机密(API密钥、密码、SSH密钥等等)。
“旧的方式”是以ini/yaml/txt格式创建一些配置文件并从中读取。12Factor应用程序说:按环境变量执行

可以为每台机器设置环境变量,配置文件也可以放在那里。
如果你手头有一大堆机器,并且部署是由几个系统管理员完成的,那么这种方法是可行的。
其中一条一般规则是:“不要在Git回购中存储秘密。”

现在新世界来了。
任何一个团队都要对自己生成的应用程序负责。
它们应该由团队部署和运行。
因此,我们公司正在转向集装箱和自助服务方式(如Mesos和Marathon或Kubernetes)

当然,DockerFile也可以设置环境变量。是的,您可以在构建期间将配置文件添加到Docker容器中。
但有了这个,每个人都可以获得秘密(例如,从其他团队)。没有人知道是谁利用这些秘密做了危险的事

您还希望对DockerFile进行版本化。您希望在Marathon上运行的应用程序也应该进行版本化(Git或其他版本)(并由RESTAPI应用)。那么,在哪里存储和管理此容器/应用程序的所有机密呢?
因为有了Swarm和Machine(适用于Docker)、Mesos和Marathon(也适用于Docker)或Kubernetes等调度器框架,你不知道你的应用程序将在哪里运行。这将在多台机器上安排。
大多数工具都没有身份验证(默认情况下,当然可以通过Nginx代理或其他方式添加身份验证)

管理机密的一个方法是使用Vault之类的工具。但我从未在应用程序中看到“本地”支持。黑匣子也是如此。我不知道配置管理如何解决这个问题。我知道Chef支持加密数据包,但恐怕无法使用Chef设置/构建Docker容器

在微服务/容器/云环境中,如何与多名工程师一起管理多团队环境中的机密

有几种解决方案

首先,不要将你的秘密放入图像中。正如你所意识到的,那只是个坏主意。如果不在构建时添加秘密,则必须在运行时添加。这给我们留下了几个选择:

  • 使用12因素应用程序建议的环境变量。然后,您需要编写一个脚本,在容器启动时用这些变量的值填充配置文件。这是可行的,但我并不喜欢,因为环境变量很容易泄漏(它们可以在链接容器和docker-inspect中看到,并且经常包含在bug报告中)。另见传唤

  • 使用卷。只需在运行时装载包含秘密的配置文件。这是可行的,但确实意味着你在主机上有一个隐藏着秘密的文件。当您不知道容器将在哪台主机上运行时,例如使用Swarm和Mesos等框架时,这会变得更加复杂

  • 使用安全的k/v存储,如Vault/Keywhiz。正如您所指出的,您将需要执行一些脚本来将值输入到应用程序中(与env vars一样)。您还需要以某种方式对k/v存储进行身份验证(您可能希望查看Keywhiz和Vault的卷驱动程序,或者使用通过env var传递的一次性令牌)

Kubernetes已经对secrets提供了相当高级的支持,我希望看到其他框架采用他们自己的解决方案

发表评论