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

时间:2018-11-13 08:34:07

标签: docker authentication encryption tls1.2

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

到目前为止,我发现做这种事情的唯一方法是在带有openssl的Linux机器上创建证书,然后手动将证书复制到客户端/服务器,如本例所示:

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

,然后在两侧将docker配置为使用证书进行加密和身份验证。

我认为这种方法比较笨拙,因为有时将文件复制并放在要使用远程API的每台计算机上都是一个问题。

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

我发现的另一个解决方案是使用代理进行基本的HTTP身份验证,但是用这种方法,流量没有经过加密,因此也不是很安全。

有人建议使用其他解决方案或改进上述方法之一吗?

2 个答案:

答案 0 :(得分:1)

您喜欢的系统自动化工具(ChefSaltStackAnsible)可以直接管理远程主机上正在运行的Docker容器,而无需打开另一个与根等效的网络路径。有一些面向Docker的集群工具(Docker SwarmNomadKubernetesAWS ECS)可以在本地或远程运行容器,但是您对确切位置的控制较少(您通常实际上并不在意),并且它们往往会接管正在运行的计算机。

如果我真的必须以这种方式管理系统,我可能会使用某种集中式存储来保存TLS客户端密钥,最有可能是Vault,它具有加密密钥的属性,需要一定级别进行身份验证以检索它们,并能够对其进行访问控制。您可以编写这样的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访问权限来接管主机是很简单的完全可以访问套接字。

答案 1 :(得分:1)

根据您的评论,如果您不需要群功能并且只需要单个主机支持,我建议您选择Ansible。 Ansible只需要您可能已经可用的SSH访问。

使用Docker Compose中定义的现有服务非常容易,或者您可以仅在Ansible中调用您的shell脚本。无需将Docker守护程序暴露给外部世界。

一个非常简单的示例文件(playbook.yml

- hosts: all
  tasks:
  - name: setup container
    docker_container:
      name: helloworld
      image: hello-world

运行剧本 ansible-playbook -i username@mysshhost.com, playbook.yml

Ansible提供了通过其模块系统与Docker交互所需的几乎所有功能:

docker_service
    Use your existing Docker compose files to orchestrate containers on a single Docker daemon or on Swarm. Supports compose versions 1 and 2.
docker_container
    Manages the container lifecycle by providing the ability to create, update, stop, start and destroy a container.
docker_image
    Provides full control over images, including: build, pull, push, tag and remove.
docker_image_facts
    Inspects one or more images in the Docker host’s image cache, providing the information as facts for making decision or assertions in a playbook.
docker_login
    Authenticates with Docker Hub or any Docker registry and updates the Docker Engine config file, which in turn provides password-free pushing and pulling of images to and from the registry.
docker (dynamic inventory)
    Dynamically builds an inventory of all the available containers from a set of one or more Docker hosts.