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

Ita*_*Ale 5 deployment docker

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

一些信息:

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

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

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

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

Ben*_*ley 3

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

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

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

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

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

是的,使用语法传递一堆环境变量很麻烦-e key=value,但这是我更喜欢的方式。请记住,这些变量仍然会向任何有权访问 Docker 守护进程的人公开。如果您的docker run命令是以编程方式编写的,那就更容易了。

如果没有,请使用Docker 文档中--env-file讨论的标志。您创建一个包含键=值对的文件,然后使用该文件运行一个容器。

$ cat >> myenv << END
FOO=BAR
BAR=BAZ
END
$ docker run --env-file myenv
Run Code Online (Sandbox Code Playgroud)

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

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