使用 Docker Compose 和 Azure Key Vault 在容器启动时传递秘密

74次阅读
没有评论

问题描述

在使用 Docker Compose 创建了包含 5 个容器的应用程序,其中两个容器需要从 Azure Key Vault 中获取凭据(用于访问第三方服务的 web.config 密码)。
由于用户将这个配置提交到公共仓库,他不希望在 docker-compose.yaml 文件中以明文存储任何 Azure 凭据,因为这样做是不安全的。
用户考虑使用 FluentDocker 来获取秘密并动态创建每个容器,但他想知道是否有更好的方法。他想知道是否可以在 Docker 中使用 Azure Key Vault,或者是否更容易使用 Docker Secrets,或者是否还有其他方法。

解决方案

以下操作可能受到版本差异影响,请在执行前做好备份,并根据需要进行适当的调整。
在 Docker 中安全地传递和存储秘密有多种方法,包括使用环境变量、Docker Secrets 或者将容器放在虚拟网络中。下面将介绍一些常见的方法:

使用环境变量

在 Docker Compose 中,使用环境变量传递秘密是一种常见的方法,但在公共仓库中明文存储秘密是不安全的做法。这种方法的步骤如下:
1. 在 docker-compose.yml 文件中,为需要传递秘密的容器添加环境变量配置。例如:
yaml
version: '3'
services:
container1:
image: your_image_for_container1:latest
environment:
- SECRET_USERNAME=${SECRET_USERNAME}
- SECRET_PASSWORD=${SECRET_PASSWORD}
# 其他容器配置

2. 使用环境变量在容器内部获取秘密。需要注意的是,在启动容器之前,你需要通过某种方式设置这些环境变量,以避免在明文中存储秘密。
3. 在启动容器之前,运行一个脚本或者命令,从 Azure Key Vault 中获取秘密,然后将它们设置为相应的环境变量。这可以通过调用 Azure Key Vault 的 API 来实现。

使用 Docker Secrets

Docker Secrets 提供了一种更安全的方式来传递和存储敏感数据,如凭据和秘密。以下是使用 Docker Secrets 的步骤:
1. 在 Docker Swarm 模式下,可以使用 docker secret create 命令创建一个秘密对象。例如:
bash
echo "mysecretvalue" | docker secret create mysecret -

2. 在 docker-compose.yml 文件中,将秘密连接到容器。例如:
yaml
version: '3.1'
services:
container1:
image: your_image_for_container1:latest
secrets:
- mysecret
# 其他容器配置
secrets:
mysecret:
external: true

3. 在容器内部,可以通过文件路径来访问 Docker Secret 的值。例如,秘密值将存储在 /run/secrets/mysecret 文件中。

使用虚拟网络和限制访问

另一种方式是将容器放在虚拟网络中,并将 Azure Key Vault 的访问权限限制在这个虚拟网络上。这可以增加安全性,即使有人窃取了 Key Vault 的访问凭据,也需要更多步骤才能获取秘密。以下是步骤:
1. 在 Docker 中创建一个虚拟网络。
2. 将需要访问 Azure Key Vault 的容器添加到这个虚拟网络中。
3. 在 Azure Key Vault 中配置访问策略,仅允许从虚拟网络访问。

这三种方法都可以用来在 Docker 容器中安全地传递和存储秘密。具体选择哪种方法取决于你的需求和安全性要求。

希望这些解决方案能够帮助你在 Docker Compose 和 Azure Key Vault 中安全地传递秘密信息!

正文完