如何管理微服务/容器/云环境中的秘密?
微服务和云是一件事情。每个人都在谈论和写作。就我个人而言,我正在考虑很多关于这个主题的内容:如何从中受益?什么是可能的挑战?这如何加速日常发展?以及如何管理所有的东西? 几天以来困扰我的一个问题是“如何管理微服务/云环境中的秘密?”。如何管理微服务/容器/云环境中的秘密?
想象一家拥有150名软件工程师和各种产品的团队的公司。每个团队都在创建一个软件,每个服务都需要不同数量的秘密(API密钥,密码,SSH密钥等等)。 “旧时尚”的方式是以ini/yaml/txt格式创建一些配置文件并从中读取。 12因素应用程序会说:按照环境变量做。
Env vars可以在每台机器上设置,配置文件也可以放在那里。 如果您手中充满了机器并且部署由少数系统管理员完成,则此功能可用。 其中一条通则是:“不要在Git仓库中存储秘密。”
现在新的世界进来了 Ever团队负责他们自己生产的应用程序。 他们应该由团队部署和运行。 因此,我们公司正在采用容器和自助服务的方式(例如Mesos和Marathon或Kubernetes)。
当然,Dockerfiles也可以设置env变量。是的,您可以在构建期间将您的配置文件添加到Docker容器中。 但是,每个人都可以访问这些秘密(例如来自其他团队)。没有人知道谁在使用这些秘密并做一些危险的事情。
您还想要对Dockerfiles进行版本化。你想在Marathon上运行的应用程序也应该进行版本化(Git或其他)(并由REST API应用)。那么在哪里存储和管理这些容器/应用程序的所有秘密? 因为使用像Swarm和Machine(Docker)这样的调度器框架,Mesos和Marathon(也可用于Docker)或者Kubernetes你不知道你的应用程序将在哪里运行。这将安排在几台机器上。 而且大多数这些工具都没有认证(默认情况下,这可以通过Nginx代理或其他方式添加)。
管理机密的一个想法是使用像Vault这样的工具。但我从来没有在应用程序中看到“本地”支持。这同样适用于Blackbox。我不知道配置管理如何解决这个问题。我知道Chef支持加密的数据包,但afaik无法使用Chef来设置/构建Docker容器。
如何在多个团队环境中与几名工程师在微服务/容器/云环境中管理秘密?
有几种解决方案。
首先,不要把你的秘密放入图像。正如你所意识到的那样,这是一个糟糕的主意。如果您不在构建时添加秘密,则必须在运行时进行。这给我们留下了几个选择:
使用12 Factor App建议的环境变量。然后,您需要编写一个脚本,该脚本将在容器启动时用这些变量的值填充配置文件。这是有效的,但我不太喜欢它,因为环境变量很容易泄漏(它们可以在链接容器中看到,并且通常包含在bug报告中)。另见Summon。
使用量。只需在运行时用秘密挂载配置文件即可。这是有效的,但确实意味着你有一个秘密文件在主机上。当你不知道你的容器将在哪个主机上运行时,比如当使用Swarm和Mesos这样的框架时,这会变得更加复杂。
使用安全的k/v存储区,如Vault/Keywhiz。正如你指出的那样,你需要做一些脚本来获取值到应用程序中(就像env vars一样)。您还需要以某种方式向k/v存储进行身份验证(您可能需要查看Keywhiz和Vault的卷驱动程序,或使用通过env var传递的一次性令牌)。
Kubernetes已经fairly advanced support for secrets,我希望看到其他框架采用自己的解决方案。
也许有这样做的一种“社区方式”或行业标准如何做到这一点?对不起,这样一个“开放的问题”。在StackOverflow网络中是否有正确的位置来讨论这样的事情?还是我错了? – Andy
啊,我想我错过了这棵树上的树林。有很多关于你在做什么的声音,而不是这里的实际问题。你打算管理微型集装箱内的秘密;你能清理你的问题,所以它*显式*?最初的脱脂使它看起来像是基于意见的。 – Makoto
我同意Makoto在这里,我敦促@Andy澄清他的问题。就目前来看,这个问题很难遵循,但我怀疑有一个很好的问题藏在里面。 – Chris