将机密传递给Docker容器


26

我有一个基本的docker映像,用于运行映像分析软件。对于从映像创建的每个容器,都有一组配置设置,其中一些是秘密(加密密钥,客户信息等),软件可以使用这些秘密来分析和分发处理后的映像。我如何安全地将这些机密传递到容器?


Hashicorp保险库
030

Answers:


23

您有3种方法来获取Docker容器内应用程序的机密。前两个涉及docker配置。最后一个是让您的应用程序直接从秘密商店中获取秘密。

1-环境变量

根据“ The 12 Factor App”指南,机密仅是配置,应始终在环境中设置。您可以在docker运行期间将机密设置为环境变量,然后您的应用程序将从那里访问它们。

2-已安装的卷

您可以将所有机密信息保存在特定的配置/秘密文件中,然后将其作为已挂载卷挂载到您的实例。

3-从秘密商店获取

如@ 030所述,您可以使用Hashicorp Vault(或“ Amazon Secrets Manager”或类似的任何服务)。
您的应用程序或Sidecar应用程序可以直接获取其所需的秘密,而无需处理Docker容器上的任何配置。该方法将允许您使用动态创建的机密(此类系统的一个非常吸引人的功能),而不必担心这些机密可以从文件系统查看或检查docker容器的env变量。

个人想法

我相信环境变量是要走的路。它更易于管理,并且如果您具有CI构建系统,则仍可以从Hashicorp Vault之类的秘密商店中提取信息,并在构建过程中提取其秘密并在部署时进行设置。您将两全其美,并获得了开发人员无需编写应用程序代码来获取机密信息的额外好处。开发人员应该专注于其代码功能,而不要处理诸如获取密码之类的管理任务。

应用程序的代码应专注于其自身的应用程序功能本身,而不要处理诸如获取密码之类的后端任务。就像12因子应用程序状态一样。

编辑:更改了最后一句,以消除Developer vs SysAdmin孤岛的含义。从代码的角度来看,任务本身应该是分开的,但是DevOps是关于同一个人的,既要牢记又要不受限制。

个人意见(更新)

根据@Dirk的出色评论(将机密传递到Docker容器中),有一个非常有力的理由是,由于不想泄漏秘密存储,因此优先于ENV vars优先处理秘密存储。


2
这促进了筒仓。DevOps是一起做事,而不是把事情扔在墙上。
030

2
该代码与基础架构组件隔离。实际的人可以对基础结构自动化和应用程序代码库进行编码,但是任务本身应该分开。我看到我最初回答的最后一句话是孤立开发人员,即人民。那一个错误。我将对其进行更清晰的编辑。
BoomShadow

7
将机密信息放入环境变量中可以为泄露它们提供各种可能性。一些示例:每个有权访问运行容器的计算机上的Docker守护程序的人都可以使用inspectexec命令查看它们。stdout在某些调试模式下运行时,环境变量通常会转储到日志文件中或放入日志文件中。所有产生的子进程都可以读取和公开它们,这可能是您无法控制的。更多信息,例如位置: diogomonica.com/2017/03/27/...
德克-

1
我也在解决这个问题。我不明白的是,即使您使用凭证保险库保护您的秘密,您仍然必须进行身份验证才能访问该保险库,并且大概需要一些秘密。同样的问题也适用于使用受密码保护的KeyStore文件。我们是否总是坚持在环境中至少传递“元凭据”?
Wheezil

1
@Wheezil比许多特定的凭证更容易保护元凭证。您可以经常自动旋转元凭证。元凭证可以转到安全主机上的保管库,并且可以具有ip白名单等功能,以便它仅接受来自生产子网的连接。您还可以确保Vault使用静态加密,运行中加密以及相互tsl和证书固定的加密,以及所有其他使事情更加安全的最佳做法。
simbo1905

1

仅使用管道还有另一种选择:

docker run -d -i --name $n alpine sh -c 'read A; echo "[$A]"; exec some-server'
docker exec -i $n sh -c 'cat > /proc/1/fd/0' <<< _a_secret_

首先,使用创建docker守护进程-i,命令read A将挂起,等待;的输入/proc/1/fd/0。然后运行第二个docker命令,从stdin中读取机密并重定向到最后一个挂起的进程。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.