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

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

一些信息:

  • 敏感信息不在我们的代码库中,但它以encryption格式保存在另一个存储库中。
  • 在我们当前的部署中,如果没有Docker,我们用git更新代码库,然后通过SSH手动复制敏感信息。
  • docker图像将被存储在一个私人的,自托pipe的registry中

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

  1. 在构build时将敏感信息包含在Docker镜像中。 这当然是最简单的一个; 然而,它使他们可以访问图像的任何人(我不知道我们是否应该信任registry了很多)。
  2. 像1一样,但在纯数据映像中拥有凭证。
  3. 在链接到主机系统中的目录的映像中创build一个卷,然后手动将凭据通过SSH复制,就像我们现在正在做的那样。 这也非常方便,但是我们不能轻松地启动新的服务器(也许我们可以使用类似etcd的东西来同步它们?)
  4. 将信息作为环境variables传递。 但是,我们现在有5对不同的API凭证,这使得这有点不方便。 但是,最重要的是,我们需要在configuration脚本中保留另外一个敏感信息(这些命令将被运行来运行Docker镜像),这很容易造成问题(例如偶然包含在git中的凭证等)。

PS:我已经做了一些研究,但是找不到类似于我的问题的东西。 其他问题(如这个 )是关于构build时需要的敏感信息; 在我们的例子中,我们需要运行时的信息

我已经使用了你的选项3和4来解决这个问题。 改写/详细说明:

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

我使用configurationpipe理(Chef或Ansible)在主机上设置凭据。 如果应用程序需要configuration文件需要API令牌或数据库凭据,我使用configurationpipe理从模板创build该文件。 厨师可以从encryption的数据包或属性中读取证书,在主机上设置文件,然后像描述的那样用容量启动容器。

请注意,在容器中,你可能需要一个包装来运行应用程序。 包装器将configuration文件从卷所挂载的任何地方复制到应用程序所期望的位置,然后启动应用程序。

将信息作为环境variables传递。 但是,我们现在有5对不同的API凭证,这使得这有点不方便。 但是,最重要的是,我们需要在configuration脚本中保留另外一个敏感信息(这些命令将被运行来运行Docker镜像),这很容易造成问题(例如偶然包含在git中的凭证等)。

是的,使用-e key=value语法传递一堆envvariables是很麻烦的,但是我更喜欢这样做。 请记住,variables仍然暴露给有权访问Docker守护进程的任何人。 如果你的docker run命令是以编程的方式组成的,那就更容易了。

如果没有,请使用Docker文档中讨论的--env-file标志。 您使用key = value对创build文件,然后使用该文件运行容器。

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

myenv文件可以使用chef / configpipe理创build,如上所述。

如果您在AWS上托pipe,则可以在此处使用KMS。 保留通过KMSencryption的env文件或configuration文件(传递给容器中的容器)。 在容器中,使用包装脚本来呼叫KMS,解密文件,将其移动到位并启动应用程序。 这样configuration数据不会暴露在磁盘上。