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

And*_*ndy 16 git secret-key docker microservices

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

想象一家拥有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这样的工具.但我从来没有在应用程序中看到"原生"支持.这同样适用于黑盒.我不知道配置管理如何解决这个问题.我知道Chef支持加密的数据库,但是不能使用Chef来设置/构建Docker容器.

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

Adr*_*uat 10

有几种解决方案.

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

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

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

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

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