【问题标题】:Docker and sensitive information used at run-time运行时使用的 Docker 和敏感信息
【发布时间】:2015-07-17 08:29:21
【问题描述】:

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

一些信息:

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

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

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

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

【问题讨论】:

  • 很难正确解决的问题。我找到的最佳解决方案是 Hashicorp 的保险库,但该项目非常新:vaultproject.io

标签: deployment docker


【解决方案1】:

我过去曾使用过您的选项 3 和 4 来解决此问题。改写/详细说明:

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

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

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

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

是的,使用-e key=value 语法传递一堆环境变量很麻烦,但我更喜欢这样做。请记住,这些变量仍然会暴露给任何有权访问 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

myenv 文件可以使用上面描述的 chef/config 管理来创建。

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

【讨论】:

  • 但在这种情况下,厨师仍然需要解密密钥......对吗? (仍然比解密数据更好,并且更安全地防止意外包含在 GIT 中......)另外,使用 KMS 是个好主意,但即使我们在 AWS 上,我们也在努力尽可能地与提供商保持中立
  • 是的,厨师需要解密密钥。当然,最终会需要它。另外,不是你问的,而是我blogged my thoughts on the cloud lock in issue
  • 您的博文很有道理,但事实是我们实际上会在年底之前将所有内容迁移到 Azure,所以这对我们来说是一个真正的问题 :)
  • 有道理,在这种情况下,使用 KMS 进行优化是不明智的。因此,请注意保护厨师服务器上的解密密钥。
猜你喜欢
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
  • 2011-05-30
  • 2013-02-28
  • 1970-01-01
相关资源
最近更新 更多