如何使用Docker Compose从Hashicorp Vault存储和检索机密?

如何使用Docker Compose从Hashicorp Vault存储和检索机密?,docker,encryption,docker-compose,hashicorp-vault,docker-secrets,Docker,Encryption,Docker Compose,Hashicorp Vault,Docker Secrets,我已经设置了Hashicorp Vault的一个实例。我已经成功地撰写和阅读了其中的秘密。让Vault启动并运行,这是最简单的部分。现在,如何使用Vault作为存储来替换docker compose.yml中的.env文件?如何从所有docker compose文件中的Vault读取机密 更困难的是:如何动态生成密钥以访问Vault中的机密,然后在docker-compose.yml文件中使用这些密钥,而无需在每次重新启动堆栈时编辑这些文件?这个过程是如何自动化的?简言之,我到底该如何利用Has

我已经设置了Hashicorp Vault的一个实例。我已经成功地撰写和阅读了其中的秘密。让Vault启动并运行,这是最简单的部分。现在,如何使用Vault作为存储来替换docker compose.yml中的.env文件?如何从所有docker compose文件中的Vault读取机密

更困难的是:如何动态生成密钥以访问Vault中的机密,然后在docker-compose.yml文件中使用这些密钥,而无需在每次重新启动堆栈时编辑这些文件?这个过程是如何自动化的?简言之,我到底该如何利用Hashicorp Vault保护.env文件中公开的机密

我已经阅读了他们所有的文献和博客文章,但没有找到任何能概括这一过程的东西。我被卡住了,任何提示都将不胜感激

注意:这不是关于使用docker compose运行Hashicorp Vault容器的问题,我已经成功地做到了


还要注意:我不能修改容器本身;我只能修改docker-compose.yml文件,您需要查询vault API以填充
.env
文件或容器的入口点。我最喜欢的是容器入口点,最好是直接在应用程序中。原因是vault机密可能是短暂的,任何运行时间超过该期限的容器都需要刷新其机密

如果您在entrypoint中执行此操作的最坏情况,您会想到一些工具。来自凯尔西海塔,还有

confd
可以作为守护进程运行,并在配置更改时在容器内重新启动应用程序。我唯一担心的是,这是一个较旧且维护较少的项目

gomplate
将由您的入口点运行,以使用所需的值展开模板文件。该文件可以是一个
env.sh
,如果需要env变量,可以将其源代码导入到您的环境中。或者可以在命令行中将其作为子shell运行,例如

your-app --arg "$(gomplate ...sometemplate...)"

如果您只使用这些工具设置一次值,然后启动应用程序,请确保配置healthcheck和/或在凭据过期时退出应用程序。然后使用编排(Kubernetes/Swarm模式)运行容器,或设置重新启动策略,以便在任何凭据过期后重新启动容器以获取新凭据。

您需要查询vault API以填充
.env
文件或容器的入口点。我最喜欢的是容器入口点,最好是直接在应用程序中。原因是vault机密可能是短暂的,任何运行时间超过该期限的容器都需要刷新其机密

如果您在entrypoint中执行此操作的最坏情况,您会想到一些工具。来自凯尔西海塔,还有

confd
可以作为守护进程运行,并在配置更改时在容器内重新启动应用程序。我唯一担心的是,这是一个较旧且维护较少的项目

gomplate
将由您的入口点运行,以使用所需的值展开模板文件。该文件可以是一个
env.sh
,如果需要env变量,可以将其源代码导入到您的环境中。或者可以在命令行中将其作为子shell运行,例如

your-app --arg "$(gomplate ...sometemplate...)"

如果您只使用这些工具设置一次值,然后启动应用程序,请确保配置healthcheck和/或在凭据过期时退出应用程序。然后使用orchestration(Kubernetes/Swarm模式)运行容器,或设置重新启动策略,以便在任何凭据过期后重新启动容器以获取新凭据。

感谢您如此快速地回答。我可能应该提到,我正在尝试将此应用于我现有的堆栈。这意味着我不能编辑入口点,或以任何方式修改容器;我只能编辑docker compose文件。我只是想替换.env文件作为机密存储的一种方式。您可以在主机上运行
gomplate
,以构建
.env
,但前提是您的机密在部署期间不会更改。它还假设您不介意您的秘密以明文形式存储在文件系统中,并在容器中可见。与vault的所有价值背道而驰。那么confd和gomplate是110%不可能的:我的意思是,为什么要添加这么多层次的复杂性和抽象来实现完全相同的结果?是否无法为docker-compose.yml环境变量提供加密?我认为这将是Vault中一个简单的功能,这是我当初考虑使用Vault的唯一原因。这就是为什么我建议在最坏的情况下在入口点进行,最好在应用程序本身中进行。感谢您这么快的回答。我可能应该提到,我正在尝试将此应用于我现有的堆栈。这意味着我不能编辑入口点,或以任何方式修改容器;我只能编辑docker compose文件。我只是想替换.env文件作为机密存储的一种方式。您可以在主机上运行
gomplate
,以构建
.env
,但前提是您的机密在部署期间不会更改。它还假设您不介意您的秘密以明文形式存储在文件系统中,并在容器中可见。与vault的所有价值背道而驰。那么confd和gomplate是110%不可能的:我的意思是,为什么要添加这么多层次的复杂性和抽象来实现完全相同的结果?是否无法为docker-compose.yml环境变量提供加密?我认为这将是Vault中一个简单的功能,这也是我当初考虑使用Vault的唯一原因。这就是为什么我建议也这样做