我正在尝试找到一种有效的方法来安全地使用 docker 远程 API。 我有一个在远程主机上运行的 docker 守护进程,以及在另一台机器上运行的 docker 客户端。我需要我的解决方案不依赖于客户端/服务器操作系统,以便它与任何具有 docker 客户端/守护进程等的机器相关。
到目前为止,我发现执行此类操作的唯一方法是使用 openssl 在 Linux 计算机上创建证书,然后手动将证书复制到客户端/服务器,如下例所示:
https://docs.docker.com/engine/security/https/
然后配置两端的docker使用证书进行加密和认证。
在我看来,这种方法相当笨重,因为有时复制文件并将它们放在我想要使用远程 API 的每台计算机上是一个问题。
我正在寻找更优雅的东西。
我发现的另一个解决方案是使用代理进行基本 HTTP 身份验证,但在这种方法中,流量未加密,而且这种方式并不真正安全。
有人对不同的解决方案或改进上述方案之一有建议吗?
最佳答案
您最喜欢的系统自动化工具( Chef 、 SaltStack 、 Ansible )可能可以直接管理远程主机上正在运行的 Docker 容器,而无需打开另一个相当于 root 的网络路径。有一些面向 Docker 的集群工具( Docker Swarm 、 Nomad 、 Kubernetes 、 AWS ECS )可以在本地或远程运行容器,但您对具体运行位置的控制较少(您通常并不关心)他们倾向于接管正在运行的机器。
如果我真的必须以这种方式管理系统,我可能会使用某种集中存储来保存 TLS 客户端 key ,最有可能的是 Vault ,它具有加密存储 key 的属性,需要某种级别的身份验证才能检索它们,并能够对它们进行访问控制。您可以编写这样的 shell 函数(未经测试):
dockerHost() {
mkdir -p "$HOME/.docker/$1"
JSON=$(vault kv get -format=json "secret/docker/$1")
for f in ca.pem cert.pem key.pem; do
echo "$JSON" | jq ".data.data.[\"$f\"]" > "$HOME/.docker/$1/$f"
done
export DOCKER_HOST="https://$1:2376"
export DOCKER_CERT_PATH="$HOME/.docker/$1"
}
虽然你的问题清楚地表明你理解这一点,但还是需要重复一下:不要启用对 Docker 守护进程的未经身份验证的远程访问,因为如果可以的话,接管具有不受限制的 root 访问权限的主机是微不足道的完全访问套接字。
关于docker - 以安全的方式使用docker的远程API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53276839/