docker - 以安全的方式使用docker的远程API

标签 docker authentication encryption tls1.2

我正在尝试找到一种有效的方法来安全地使用 docker 远程 API。 我有一个在远程主机上运行的 docker 守护进程,以及在另一台机器上运行的 docker 客户端。我需要我的解决方案不依赖于客户端/服务器操作系统,以便它与任何具有 docker 客户端/守护进程等的机器相关。

到目前为止,我发现执行此类操作的唯一方法是使用 openssl 在 Linux 计算机上创建证书,然后手动将证书复制到客户端/服务器,如下例所示:

https://docs.docker.com/engine/security/https/

然后配置两端的docker使用证书进行加密和认证。

在我看来,这种方法相当笨重,因为有时复制文件并将它们放在我想要使用远程 API 的每台计算机上是一个问题。

我正在寻找更优雅的东西。

我发现的另一个解决方案是使用代理进行基本 HTTP 身份验证,但在这种方法中,流量未加密,而且这种方式并不真正安全。

有人对不同的解决方案或改进上述方案之一有建议吗?

最佳答案

您最喜欢的系统自动化工具( ChefSaltStackAnsible )可能可以直接管理远程主机上正在运行的 Docker 容器,而无需打开另一个相当于 root 的网络路径。有一些面向 Docker 的集群工具( Docker SwarmNomadKubernetesAWS 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/

相关文章:

php - 用户登录被重定向到 index.php

javascript - PHP重定向头不是重定向吗?

java - 解密时出现 IllegalBLockSizeException

docker - 无法在docker-compose中使用变量替换

python - 如何在链接的 docker 容器上运行命令?

node.js - Docker 不会构建 Node 容器

docker - Docker将日志保存在哪里?

laravel - 在 Laravel 中登录多个角色后重定向

javascript - 我的 CryptoJS 加密/解密不工作

PHP mcrypt_module_open 导致 500 错误