繁体   English   中英

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

[英]How to manage secrets in a Microservice / Container / Cloud environment?

微服务和云是一件事。 每个人都在谈论和写作。 就我个人而言,我正在考虑这个话题:如何利用它来获益? 有哪些可能的挑战? 这怎么能加速日常发展? 以及如何管理所有事情? 几天之后困扰我的一个问题是“如何管理微服务/云环境中的秘密?”。

想象一家拥有150名软件工程师和各种团队的公司。 每个团队都在创建一个软件,每个服务都需要各种秘密(API密钥,密码,SSH密钥等等)。 “旧时尚”方式是以ini / yaml / txt格式创建一些配置文件并从中读取。 12个因子应用程序说:按照env vars进行。

可以为每台机器设置Env变量,也可以将配置文件放在那里。 如果你手持一台机器并且部署由一些系统管理员完成,这就有效。 一般规则说:“不要在Git回购中存储秘密。”

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

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

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

管理机密的一个想法是使用像Vault这样的工具。 但我从来没有在应用程序中看到“原生”支持。 Blackbox也是如此 我不知道配置管理如何解决这个问题。 我知道Chef支持加密的数据库,但是不能使用Chef来设置/构建Docker容器。

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

有几种解决方案。

首先, 不要把你的秘密放入图像中。 你已经意识到,这只是个坏主意。 如果您不在构建时添加秘密,则必须在运行时执行此操作。 这给我们留下了一些选择:

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

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

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

Kubernetes已经拥有相当高级的秘密支持 ,我希望看到其他框架采用自己的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM