我试图找到一种有效的方式以安全的方式使用docker远程API。 我有一个在远程主机上运行的docker守护进程,以及在另一台计算机上的docker客户端。我需要我的解决方案不依赖于客户端/服务器操作系统,以便与具有Docker客户端/守护程序等的任何计算机相关。
到目前为止,我发现做这种事情的唯一方法是在带有openssl的Linux机器上创建证书,然后手动将证书复制到客户端/服务器,如本例所示:
https://docs.docker.com/engine/security/https/
,然后在两侧将docker配置为使用证书进行加密和身份验证。
我认为这种方法比较笨拙,因为有时将文件复制并放在要使用远程API的每台计算机上都是一个问题。
我正在寻找更优雅的东西。
我发现的另一个解决方案是使用代理进行基本的HTTP身份验证,但是用这种方法,流量没有经过加密,因此也不是很安全。
有人建议使用其他解决方案或改进上述方法之一吗?
答案 0 :(得分:1)
您喜欢的系统自动化工具(Chef,SaltStack,Ansible)可以直接管理远程主机上正在运行的Docker容器,而无需打开另一个与根等效的网络路径。有一些面向Docker的集群工具(Docker Swarm,Nomad,Kubernetes,AWS 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.