如何在微服务/容器/云环境中管理机密?
Posted
技术标签:
【中文标题】如何在微服务/容器/云环境中管理机密?【英文标题】:How to manage secrets in a Microservice / Container / Cloud environment? 【发布时间】:2016-02-01 15:00:51 【问题描述】:微服务和云是一回事。每个人都在谈论和写作。就我个人而言,我对这个话题思考了很多:如何从中受益?可能的挑战是什么?这如何加速日常开发?以及如何管理所有事情? 几天以来一直困扰我的一个问题是“如何在微服务/云环境中管理机密?”。
想象一家拥有 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 之类的工具。但我从未在应用程序中看到“本机”支持。这同样适用于Blackbox。而且我不知道配置管理如何解决这个问题。我知道 Chef 支持加密数据包,但是无法使用 Chef 来设置/构建 Docker 容器。
您如何在微服务/容器/云环境中与多个工程师一起管理多团队环境中的机密?
【问题讨论】:
也许有一种“社区方式”可以做到这一点或行业标准如何做到这一点?对不起,这样的“开放式问题”。 *** 网络中是否有正确的位置来讨论这样的事情?还是我错了? 啊,我想我是为了这棵树而错过了森林。与这里的实际问题相反,您正在做的事情有很多噪音。您打算在微容器中管理机密;你能把你的问题清理干净,让它明确吗?最初的略读使它看起来像是基于意见的。 我同意 Makoto 的观点,我确实敦促 @Andy 澄清他的问题。就目前而言,这个问题很难理解,但我怀疑其中隐藏着一个很好的问题。 "API-Keys, Passwords, SSH-Keys, 不管什么" - 我会避免将它们混合到一个单一的“秘密”类别中。您能否也请扩展“随便”部分?我有一个答案的想法,但需要再考虑一下。 【参考方案1】:有几种解决方案。
首先,请勿将您的秘密放入图片中。正如您已经意识到的那样,这只是一个坏主意。如果您不在构建时添加您的秘密,您必须在运行时添加。这给我们留下了几个选择:
按照12 Factor App 的建议使用环境变量。然后,您需要编写一个脚本,在容器启动时使用这些变量的值填充配置文件。这可行,但我不太喜欢它,因为环境变量很容易泄露(它们可以在链接容器和docker inspect
中看到,并且通常包含在错误报告中)。另见Summon。
使用卷。只需在运行时安装带有秘密的配置文件。这可行,但确实意味着您有一个文件,其中包含在主机上的秘密。如果您不知道容器将在哪个主机上运行,例如使用 Swarm 和 Mesos 等框架时,这会变得更加复杂。
使用安全的 k/v 存储,例如 Vault/Keywhiz。正如您所指出的,您需要编写一些脚本才能将值输入应用程序(与 env vars 一样)。您还需要以某种方式对 k/v 存储进行身份验证(您可能需要查看 Keywhiz 和 Vault 的卷驱动程序,或者使用通过 env var 传递的一次性令牌)。
Kubernetes 已经有了fairly advanced support for secrets,我希望看到其他框架采用自己的解决方案。
【讨论】:
非常好的总结——而且仍然是最新的。需要考虑的一件事:当使用 Vault 或类似的东西时,您仍然必须“解封”这个再次需要证书或秘密令牌的存储。这意味着,每当您的 Vault 崩溃或停止时,您都需要再次手动解封它。如果您想自动执行此操作,您又会遇到密码存储位置的问题...以上是关于如何在微服务/容器/云环境中管理机密?的主要内容,如果未能解决你的问题,请参考以下文章