Docker和运行时使用的敏感信息

时间:2015-05-06 23:58:23

标签: deployment docker

我们将一个应用程序(用Node.js编写)停靠,这个应用程序需要在运行时访问一些敏感数据(不同服务的API令牌),我找不到任何推荐的方法来处理它。

一些信息:

  • 敏感信息不在我们的代码库中,但它以加密格式保存在另一个存储库中。
  • 在我们当前的部署中,没有Docker,我们使用git更新代码库,然后通过SSH手动复制敏感信息。
  • docker镜像将存储在私有的自托管注册表中

我可以想到一些不同的方法,但它们都有一些缺点:

  1. 在构建时将敏感信息包含在Docker镜像中。这当然是最容易的;然而,它使任何有权访问图像的人都可以使用它们(我不知道我们是否应该相信注册表那么多)。
  2. 与1相似,但在仅数据图像中具有凭据。
  3. 在图像中创建一个链接到主机系统中目录的卷,并通过SSH手动复制凭据,就像我们现在正在做的那样。这也很方便,但是我们不能轻易地启动新的服务器(也许我们可以使用 etcd 来同步它们?)
  4. 将信息作为环境变量传递。但是,我们现在有5对不同的API凭证,这使得这有点不方便。但最重要的是,我们需要在配置脚本中保留敏感信息的另一个副本(将执行以运行Docker镜像的命令),这很容易产生问题(例如,git中意外包含的凭据等)。
  5. PS:我做过一些研究,但找不到与我的问题类似的东西。其他问题(如this one)是关于构建时所需的敏感信息;在我们的例子中,我们需要在运行时的信息

1 个答案:

答案 0 :(得分:3)

我过去曾使用你的选项3和4来解决这个问题。重新说明/详细说明:

  

在图像中创建一个链接到主机系统中目录的卷,并通过SSH手动复制凭据,就像我们现在正在做的那样。

我使用配置管理(Chef或Ansible)在主机上设置凭据。如果应用程序采用需要API令牌或数据库凭据的配置文件,我使用配置管理从模板创建该文件。 Chef可以从加密的数据包或属性中读取凭据,在主机上设置文件,然后像您描述的那样使用卷启动容器。

请注意,在容器中,您可能需要一个包装器来运行该应用程序。包装器将配置文件从任何卷安装到应用程序所需的任何位置进行复制,然后启动应用程序。

  

将信息作为环境变量传递。但是,我们现在有5对不同的API凭证,这使得这有点不方便。但最重要的是,我们需要在配置脚本中保留敏感信息的另一个副本(将执行以运行Docker镜像的命令),这很容易产生问题(例如,git中意外包含的凭据等)。

是的,使用-e key=value语法传递一堆env变量很麻烦,但我喜欢这样做。请记住,变量仍然可以访问具有Docker守护程序访问权限的任何人。如果以编程方式编写docker run命令,则更容易。

如果没有,请使用here in the Docker docs所述的--env-file标记。使用key = value对创建文件,然后使用该文件运行容器。

$ cat >> myenv << END
FOO=BAR
BAR=BAZ
END
$ docker run --env-file myenv

如上所述,可以使用chef / config管理创建myenv文件。

如果您在AWS上托管,可以在此处使用KMS。保留通过KMS加密的env文件或配置文件(传递到卷中的容器)。在容器中,使用包装器脚本调用KMS,解密文件,将其移入以放置并启动应用程序。这样,配置数据不会在磁盘上公开。