写点什么

TLS 加密远程连接 Docker

作者:程序员欣宸
  • 2022-10-16
    广东
  • 本文字数:2690 字

    阅读完需:约 1 分钟

TLS加密远程连接Docker

欢迎访问我的 GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos

本篇概览

  • 《Docker远程连接设置》一文讲述了开启 Docker 远程连接的方法,但那种方法不安全,因为任何客户端都可以通过 Docker 服务的 IP 地址连接上去,今天我们就来学习 Docker 官方推荐的安全的远程连接方式:TLS 加密连接,通过证书来保证安全性。

官方文档

环境信息

  • 本次实战的环境信息如下:


  1. Docker 服务所在机器(下面以 A 机器表示):CentOS Linux release 7.6.1810

  2. Docker 服务版本:1.13.1

  3. 另一台验证远程连接的机器(下面以 B 机器表示)也是 CentOS 7.6,其上安装了 Docker client 1.13.1

操作步骤

  • 本次实战的操作步骤如下:


  1. 制作证书,包括 CA、服务端、客户端的;

  2. 设置机器 A 上的 Docker 服务的 TLS 连接;

  3. 从机器 B 远程连接机器 A 上的 Docker 服务;

制作证书(A 机器)

  • 在 Linux 服务器上建一个目录,进入此目录,我这里是 /root/work

  • 创建根证书 RSA 私钥:


openssl genrsa -aes256 -out ca-key.pem 4096
复制代码


  • 页面提示 Enter pass phrase for ca-key.pem ,此时输入秘钥的密码,我这里输入了 1234 ,回车后会要求再输入一次,两次密码一致就会在当前目录生成 CA 秘钥文件 ca-key.pem ;

  • 以此秘钥创建 CA 证书,自己给自己签发证书,自己就是 CA 机构,也可以交给第三方机构去签发:


openssl req -new -x509 -days 1000 -key ca-key.pem -sha256 -subj "/CN=*" -out ca.pem
复制代码


此时生成的 ca.pem 文件就是 CA 证书;


  • 创建服务端私钥:


openssl genrsa -out server-key.pem 4096
复制代码


  • 此时生成的 server-key.pem 文件就是服务端私钥;

  • 生成服务端证书签名请求(csr 即 certificate signing request,里面包含公钥与服务端信息)


openssl req -subj "/CN=*" -sha256 -new -key server-key.pem -out server.csr
复制代码


  • 此时生成的 server.csr 文件就是服务端证书;

  • 生成签名过的服务端证书(期间会要求输入密码 1234):


openssl x509 -req -days 1000 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem
复制代码


  • 此时生成的 server-cert.pem 文件就是已盖章生效的服务端证书;

  • 生成客户私钥:


openssl genrsa -out key.pem 4096
复制代码


  • 此时生成的 key.pem 文件就是客户私钥;

  • 生成客户端证书签名请求:


openssl req -subj "/CN=client" -new -key key.pem -out client.csr
复制代码


  • 此时生成的 client.csr 文件就是客户端证书签名请求;

  • 生成名为 extfile.cnf 的配置文件:


echo extendedKeyUsage=clientAuth > extfile.cnf
复制代码


  • 生成签名过的客户端证书(期间会要求输入密码 1234):


openssl x509 -req -days 1000 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
复制代码


  • 将多余的文件删除:


rm -rf ca.srl client.csr extfile.cnf server.csr
复制代码


  • 此时还剩以下文件:


  • 至此,所有证书文件制作完成,接下来对 Docker 做 TLS 安全配置;

Docker 的 TLS 连接设置(A 机器)

  • 打开文件 /lib/systemd/system/docker.service ,找到下图红框中的内容:

  • 将上图红框中的一整行内容替换为以下内容:


ExecStart=/usr/bin/dockerd-current --tlsverify --tlscacert=/root/work/ca.pem --tlscert=/root/work/server-cert.pem --tlskey=/root/work/server-key.pem -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock \
复制代码


  • 加载上述配置,再重启 docker 服务:


systemctl daemon-reload && systemctl restart docker
复制代码


  • 配置完成,接下来验证远程 TLS 连接。

验证远程 TLS 连接(B 机器)

  • 假设前面我们操作的电脑为 A,IP 地址是 192.168.121.138

  • 现在再准备一台电脑 B,IP 地址是 192.168.121.132 ,用来验证 TLS 加密远程连接 A 上的 Docker;

  • 在 A 机器执行以下命令,将 A 上的 ca.pem、cert.pem、key.pem 这三个文件复制到 B 机器的 /root/work 目录(请提前建好此目录):


scp /root/work/ca.pem root@192.168.121.132:/root/work \&& scp /root/work/cert.pem root@192.168.121.132:/root/work \&& scp /root/work/key.pem root@192.168.121.132:/root/work
复制代码


  • 在制作证书时没有允许通过 IP 访问服务端,所以 B 在连接 A 的 Docker 时不能直接用 A 的 IP,所以要用 host 来访问 A,给 B 电脑增加一个 host 配置(如果 B 电脑是 Linux,就在/etc/hosts 文件上配置):


192.168.121.138 docker-daemon
复制代码


  • 在 B 上执行以下命令,即可连接 A 的 Docker 服务:


docker --tlsverify --tlscacert=/root/work/ca.pem --tlscert=/root/work/cert.pem --tlskey=/root/work/key.pem -H tcp://docker-daemon:2376 version
复制代码


  • 控制台显示以下信息,其中 Server 部分就是 A 机器的 Docker 信息:


Client: Version:         1.13.1 API version:     1.26 Package version: docker-1.13.1-102.git7f2769b.el7.centos.x86_64 Go version:      go1.10.3 Git commit:      b2f74b2/1.13.1 Built:           Wed May  1 14:55:20 2019 OS/Arch:         linux/amd64
Server: Version: 1.13.1 API version: 1.26 (minimum version 1.12) Package version: docker-1.13.1-102.git7f2769b.el7.centos.x86_64 Go version: go1.10.3 Git commit: 7f2769b/1.13.1 Built: Mon Aug 5 15:09:42 2019 OS/Arch: linux/amd64 Experimental: false
复制代码


  • 不用证书连接试试,各种尝试都失败了:


[root@centos7 work]# docker -H tcp://192.168.121.138:2375 imagesCannot connect to the Docker daemon at tcp://192.168.121.138:2375. Is the docker daemon running?[root@centos7 work]# docker -H tcp://docker-daemon:2375 imagesCannot connect to the Docker daemon at tcp://docker-daemon:2375. Is the docker daemon running?[root@centos7 work]# docker -H tcp://192.168.121.138:2376 imagesGet http://192.168.121.138:2376/v1.26/images/json: net/http: HTTP/1.x transport connection broken: malformed HTTP response "\x15\x03\x01\x00\x02\x02".* Are you trying to connect to a TLS-enabled daemon without TLS?[root@centos7 work]# docker -H tcp://docker-daemon:2376 imagesGet http://docker-daemon:2376/v1.26/images/json: net/http: HTTP/1.x transport connection broken: malformed HTTP response "\x15\x03\x01\x00\x02\x02".* Are you trying to connect to a TLS-enabled daemon without TLS?
复制代码


  • 至此,TLS 加密远程连接 Docker 的实战就完成了,希望您在设置安全的 Docker 远程连接是,本文能给您提供参考。

欢迎关注 InfoQ:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...


发布于: 2022-10-16阅读数: 2
用户头像

搜索"程序员欣宸",一起畅游Java宇宙 2018-04-19 加入

前腾讯、前阿里员工,从事Java后台工作,对Docker和Kubernetes充满热爱,所有文章均为作者原创,个人Github:https://github.com/zq2599/blog_demos

评论

发布
暂无评论
TLS加密远程连接Docker_Docker_程序员欣宸_InfoQ写作社区