使用 docker-compose 的本地保管库



我在docker-compose中运行Vault时遇到了很大的麻烦。

我的要求是:

  • 以恶魔身份运行(因此在重新启动Mac时重新启动(
  • 在容器重启之间保留密钥
  • 重启之间无人为干预(解封等(
  • 使用通用令牌

我当前的码头工人组合

version: '2.3'
services:
vault-dev:
image: vault:1.2.1
restart: always
container_name: vault-dev
environment:
VAULT_DEV_ROOT_TOKEN_ID: "myroot"
VAULT_LOCAL_CONFIG: '{"backend": {"file": {"path": "/vault/file"}}, "default_lease_ttl": "168h", "max_lease_ttl": "720h"}'
ports:
- "8200:8200"
volumes:
- ./storagedc/vault/file:/vault/file

但是,当容器重新启动时,我得到日志

==> Vault server configuration:
Api Address: http://0.0.0.0:8200
Cgo: disabled
Cluster Address: https://0.0.0.0:8201
Listener 1: tcp (addr: "0.0.0.0:8200", cluster address: "0.0.0.0:8201", max_request_duration: "1m30s", max_request_size: "33554432", tls: "disabled")
Log Level: info
Mlock: supported: true, enabled: false
Storage: file
Version: Vault v1.2.1
Error initializing Dev mode: Vault is already initialized

对此事有什么建议吗?

我将伪

编码一个答案来解决指定的问题,但请注意,这是一个大规模的黑客攻击,永远不应该部署在生产中,因为硬编码的主密钥和单个解封密钥是非常不安全的。

因此,您需要一个具有持久性的测试保管库服务器。

您可以完成此操作,由于保管库容器的默认行为,它将需要一些工作 - 如果您只是启动它,它将从开发模式容器开始,这将不允许持久性。仅通过环境变量添加持久性并不能完全解决这个问题,因为它将与容器的默认启动模式冲突。

因此,我们需要将此入口点脚本替换为执行我们希望它执行的操作。

首先,我们将脚本从容器中复制出来:

$ docker create --name vault vault:1.2.1
$ docker cp vault:/usr/local/bin/docker-entrypoint.sh .
$ docker rm vault

为简单起见,我们将编辑文件并使用 docker-compose 文件将其挂载到容器中。我不会让它真正发挥作用 - 只是足以让它做想要的事情。这里的重点是示例,而不是在生产中可用的东西。

我的自定义都从大约第 98 行开始 - 首先我们启动一个开发模式服务器以记录解封密钥,然后我们终止开发模式服务器。

# Here's my customization:
if [ ! -f /vault/unseal/sealfile ]; then
# start in dev mode, in the background to record the unseal key
su-exec vault vault server 
-dev -config=/vault/config 
-dev-root-token-id="$VAULT_DEV_ROOT_TOKEN_ID" 
2>&1 | tee /vault/unseal/sealfile &
while ! grep -q 'core: vault is unsealed' /vault/unseal/sealfile; do
sleep 1
done
kill %1
fi

接下来,我们检查补充配置。这是用于禁用 TLS 和绑定相应接口的额外配置的地方。

if [ -n "$VAULT_SUPPLEMENTAL_CONFIG" ]; then
echo "$VAULT_SUPPLEMENTAL_CONFIG" > "$VAULT_CONFIG_DIR/supplemental.json"
fi

然后我们在"发布"模式下启动保管库:

if [ "$(id -u)" = '0' ]; then
set -- su-exec vault "$@"
"$@"&

然后我们从密封文件中获取解封密钥:

unseal=$(sed -n 's/Unseal Key: //p' /vault/unseal/sealfile)
if [ -n "$unseal" ]; then
while ! vault operator unseal "$unseal"; do
sleep 1
done
fi

我们只是等待进程终止:

wait
exit $?
fi

在github上有一个完整的要点。

现在,用于执行此操作的docker-compose.yml与您自己的略有不同:

version: '2.3'
services:
vault-dev:
image: vault:1.2.1
restart: always
container_name: vault-dev
command: [ 'vault', 'server', '-config=/vault/config' ]
environment:
VAULT_DEV_ROOT_TOKEN_ID: "myroot"
VAULT_LOCAL_CONFIG: '{"backend": {"file": {"path": "/vault/file"}}, "default_lease_ttl": "168h", "max_lease_ttl": "720h"}'
VAULT_SUPPLEMENTAL_CONFIG: '{"ui":true, "listener": {"tcp":{"address": "0.0.0.0:8200", "tls_disable": 1}}}'
VAULT_ADDR: "http://127.0.0.1:8200"
ports:
- "8200:8200"
volumes:
- ./vault:/vault/file
- ./unseal:/vault/unseal
- ./docker-entrypoint.sh:/usr/local/bin/docker-entrypoint.sh
cap_add:
- IPC_LOCK

command是要执行的命令。这是脚本更改"$@"&中的内容。

我为非开发运行添加了VAULT_SUPPLEMENTAL_CONFIG。它需要指定接口,它需要打开 tls。我添加了 ui,所以我可以使用http://127.0.0.1:8200/ui访问它。这是我对脚本所做的更改的一部分。

因为这都是本地的,对我来说,测试目的,我挂载./vault作为数据目录,我挂载./unseal作为记录解封代码的地方,挂载./docker-entrypoint.sh作为入口点脚本。

我可以docker-compose up这一点,它会启动一个持久的保管库 - 当我尝试在服务器启动之前解封时,日志上有一些错误,但它可以工作,并在多次docker-compose运行中持续存在。

再次提到,这完全不适合任何形式的长期使用。如果你正在做这样的事情,你最好使用 docker 自己的秘密引擎。

我想为使用 docker-compose 进行本地开发提出更简单的解决方案。

  • 保险库始终处于未密封状态
  • 保管库 UI 已启用,可在开发计算机上http://localhost:8200/ui/vault访问
  • 保管库具有预定义的根令牌,服务可以使用该令牌与其通信

docker-compose.yml

vault:
hostname: vault
container_name: vault
image: vault:1.12.0
environment:
VAULT_ADDR: "http://0.0.0.0:8200"
VAULT_API_ADDR: "http://0.0.0.0:8200"
ports:
- "8200:8200"
volumes:
- ./volumes/vault/file:/vault/file:rw
cap_add:
- IPC_LOCK
entrypoint: vault server -dev -dev-listen-address="0.0.0.0:8200" -dev-root-token-id="root"

我创建了一个适用于文件后端且没有 -dev 标志的设置

https://github.com/with-shrey/VaultDevSetup-Docker

最新更新