Docker开启远程连接并实现安全通信详解
作者:龚国玮 发布时间:2023-02-04 09:45:09
Docker 使用了客户端 -- 服务端模型。服务端对外提供 REST API。
默认安装方式,客户端和服务端在同一台主机上,通过本地安全 PIC Socket 进行通信,例如 Linux 中 /var/run/docker.sock。我们还可以配置它们通过网络进行通信。它们默认网络配置使用不安全的 HTTP Socket,端口为 2375。
在生产环境这是不能接受的。通过 TLS 的方式连接解决这个问题。生产环境中推荐这种配置,即使在可信内网中,也建议使用该方式!
Docker 为 TLS 提供两种模式
daemon 模式:Docker daemon 只接收认证客户端的请求。
客户端模式:Docker 客户端只接收认证的 daemon 发起的请求。
同时使用它们,能提供最高的安全等级。
下面开始介绍如何完成 TLS 的配置,总体步骤如下。
创建 CA 。
为 daemon 创建密钥对。
为客户端创建密钥对。
分发密钥
Docker 配置 TLS 模式
创建 CA
在 node2 运行下面的命令。
为 CA 创建私钥(过程中需要设置密码)
$ openssl genrsa -aes256 -out ca-key.pem 4096
当前目录新增一个 ca-key.pem 文件,这是 CA 私钥。
用 CA 私钥生成公钥(过程需要输入之前的密码)
$ openssl req -new -x509 -days 730 -key ca-key.pem -sha256 -out ca.pem
当前目录新增一个 ca.pem 文件,这是 CA 公钥,也叫”证书“。
为 daemon 创建密钥对
在 node3 运行下面的命令。
为 daemon 创建私钥。
$ openssl genrsa -out daemon-key.pem 4096
当前目录新增一个 daemon-key.pem 文件,这是 daemon 节点的私钥。
创建证书签名请求并发送到 CA。
$ openssl req -subj "/CN=daemon" \ -sha256 -new -key daemon-key.pem -out daemon.csr
当前目录新增一个 daemon.csr 文件,这是 CSR。
为证书添加属性。 创建文件,名为 extfile.cnf。示例中使用了 daemon 节点的 DNS 名称和 IP。每个人的环境中可能值不同。
$ subjectAltName = DNS:daemon,IP:192.168.57.3
extendedKeyUsage = serverAuth
生成证书 使用 CSR 文件、CA 密钥、extfile.cnf 文件完成签名和 daemon 证书配置。
$ openssl x509 -req -days 730 -sha256 \ -in daemon.csr -CA ca.pem -CAkey ca-key.pem \ -CAcreateserial -out daemon-cert.pem -extfile extfile.cnf
此时,已经拥有一个可用 CA ,同时 daemon 的 Node3 节点也有了自己的密钥。
继续下面内容前,删除 CSR 和 extfile.cnf。
$ rm daemon.csr extfile.cnf
为客户端创建密钥对
在 node3 运行下面的命令。
为客户端创建密钥
$ openssl genrsa -out client-key.pem 4096
当前目录新增一个 client-key.pem 文件。
创建 CSR。
$ openssl req -subj '/CN=client' -new -key client-key.pem -out client.csr
当前目录新增一个 client.csr 文件。
创建 extfile.cnf 文件 将证书设置为客户端认证可用。文件内容如下。
extendedKeyUsage = clientAuth
生成证书 使用 CSR 文件、CA 密钥、extfile.cnf 文件完成签名和客户端证书配置。
$ openssl x509 -req -days 730 -sha256 \ -in client.csr -CA ca.pem -CAkey ca-key.pem \ -CAcreateserial -out client-cert.pem -extfile extfile.cnf
删除 CSR 和 extfile.cnf ,因为不会用到它们了。 $ rm client.csr extfile.cnf
此时,在工作目录下应该有如下 7 个文件。
ca-key.pem
ca.pem
ca.srl
client-cert.pem
client-key.pem
daemon-cert.pem
daemon-key.pem
分发密钥
从 CA (刚才证书生成的 node) 复制 ca.pem、daemon-cert.pem、daemon-key.pem 到 node3(daemon 节点)。
从 CA (刚才证书生成的 node) 复制 ca.pem、client-cert.pem、client-key.pem 到 node1(客户端节点)。
这里用 scp 完成复制操作。在 scp 的过程中对部分文件进行了重命名。重命名非常重要,因为 Docker 对文件命名有规范。
// Daemon files
$ scp ./ca.pem ubuntu@daemon:/home/ubuntu/.docker/ca.pem
$ scp ./daemon-cert.pem ubuntu@daemon:/home/ubuntu/.docker/cert.pem
$ scp ./daemon-key.pem ubuntu@daemon:/home/ubuntu/.docker/key.pem
// Client files
$ scp ./ca.pem ubuntu@client:/home/ubuntu/.docker/ca.pem
$ scp ./client-cert.pem ubuntu@client:/home/ubuntu/.docker/cert.pem
$ scp ./client-key.pem ubuntu@client:/home/ubuntu/.docker/key.pem
Docker 配置 TLS 模式
进入 Node3(daemon 节点)完成下面的配置。
找到 daemon.json 配置文件。在 Linux 上位于 /etc/docker,编辑 daemon.json 文件,添加如下行。
"tls": true,
"tlsverify": true,
"tlscacert": "/home/ubuntu/.docker/ca.pem",
"tlscert": "/home/ubuntu/.docker/cert.pem",
"tlskey": "/home/ubuntu/.docker/key.pem",
"hosts": ["tcp://你的 daemon 的IP:2376"]
这些 daemon.json 中的参数意义如下。
tlsverify :开启 TLS 认证。
tlscacert :指定daemon可信任的 CA。
tlscert :向 Docker 指定 daemon 证书的位置。
tlskey :向 Docker 指定daemon私钥的位置。
hosts :向 Docker 指定需要绑定 daemon 的具体 Socket。
警告:部分版本的 Linux 系统运行 systemd 的,不允许在 daemon.json 中使用“hosts”选项。替换方案是在 systemd 配置文件中进行重写。创建名为 /etc/systemd/system/docker.service.d/override.conf 的新文件。在其中加入下列 3 行内容,然后保存。
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://你的 daemon 的IP:2376”
重启 daemon 。
$ systemctl daemon-reload
$ systemctl restart docker.service
如果重启失败且错误为
docker.service: Main process exited, code=exited, status=1/FAILURE
为了让它工作,编辑 /lib/systemd/system/docker.service
,修改如下内容之后再次尝试重启。
# 修改前:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
# 修改后:
ExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock
理论上,/etc/systemd/system/docker.service.d/override.conf
与 /etc/docker/daemon.json
可以同时修改,但是并不建议这么做,如果仅修改 /etc/docker/daemon.json
没有出现任何问题,那就太棒了。
进入 Docker 客户端节点,配置临时环境变量。
$ export DOCKER_HOST=tcp://你的 daemon IP 地址:2376
尝试运行 $ docker version
,会出现错误,类似无法连接 daemon。接着设置另一个环境变量。
$ export DOCKER_TLS_VERIFY=1
它是告知 Docker 客户端使用证书对全部命令进行签名,此时再试试 $ docker version
!
?? 恭喜。你成功完成了客户端与 daemon 完成安全的通信。
来源:https://juejin.cn/post/7120568388216160270
猜你喜欢
- 首先下载JDK.这里使用的是jdk-8u181-linux-x64.tar.gz下载Tomcat.这里使用的是apache-tomcat-8
- 我们建立博客的初衷是记录、分享工作、生活、技术等方面知识,也有人写博客是为了装逼。但最终能够坚持下来的却少之又少。主要原因是从起初的单相思到
- 现在所谓的做网站已经不是像以前那种用网页制作软件制作几个html文件,然后互相串联一下就可以了。随着互联网技术的发展和推动,cms的时代的来
- 北京时间10月16日消息,据国外媒体报道,甲骨文高管周四表示,将发布43种Web软件模块,帮助企业管理财务、人力资源、销售和采购等任务。这将
- 在谷歌于5月份推出的“搜索选项”中,有一个根据时间来限制搜索结果的功能,用户可以根据默认的“任何时间”、“去年”、“上周”、“最近”或者“过
- 决定一个网站成败命运的,不是视觉设计,而是设计的可用性和有效性。访问网页的用户们握着鼠标,决定一切,“以用户为中心&am
- 做博客和个人网站的朋友们注意了,辛辛苦苦做网站和编辑博客,好不容易来几个流量,本来以为可以赚点广告费来支撑站点的正常运营,可是每次点击只有几
- 提高IIS网站服务器执行效率的第八种方法:静态网页采用HTTP 压缩静态网页采用HTTP 压缩,大约可以减少20%的传输量。HTTP压缩功能
- 学习linux FTP服务器搭建时,你可能会遇到各种问题,这里将介绍linux FTP服务器访问权限问题的解决方法,在这里拿出来和大家分享一
- 本人做网赚也有一段日子了,其中酸甜苦辣应有尽有,目前网赚行业中国内发展规模落后于国外,所以现在做网赚主要还是做国外的项目,既然是国外项目那自
- 北京时间11月21日消息,据国外媒体报道,Twitter首席运营官Dick Costolo今日表示,这一广受欢迎的微博服务将很快推出广告业务
- 9岁上中学,14岁以650分的高分考入电子科大,大学期间参加国际科学计算机组织程序设计大赛获银奖,17岁被百度以10万元起步年薪相中……电子
- 因为上一篇讲得比较简单,很多安装细节我没有写,同时自己在安装过程中也许是比较顺利,很多遇到的问题也许就没有考虑到,未能给一些不明白或者没有接
- 人们或许都有这样一个困惑:计算机在网络上通讯时本来只能识别如“123.123.123.123”之类的数字地址,那么为什么当我们打开浏览器,在
- apache|服务器|高级作为系统管理员,若你只有一个IP地址,却有好几个域名,又要求访问每个域名都要看到不同的内容,那怎么办?总不至于为每
- 10月15日消息,阿里学院今日宣布,为帮助中小企业解决人才缺口问题,近期将在全国范围内打造电子商务人才产业链,完成人才培养到人才输送。据阿里
- 网络中纷乱复杂的信息良莠不齐,而少年儿童又有强烈的好奇心,往往在不经意间就点入一些不健康的网站。对此,不少家长都在寻求一些行之有效,又能健康
- 随着互联网行业的发展,越来越多的企业认识到网站的重要性,同时网站作为一个企业对外展示的窗口也开始受到用户的注意,想找什么东西上网一搜索,几秒
- 这段时间发现学生做网站的越来越多,但大多数都没有做成。这里给出几点建议,期望对你有所帮助。学生建站,我觉得应该注意以下四点:一、找到自己的方
- 北京时间7月2日消息,据国外媒体报道,博客服务提供商Wordpress(Wordpress.com)日前推出了拨打电话发布语音博客的新功能“