TLS加密远程连接Docker
程序员文章站
2022-07-20 10:42:18
"《Docker远程连接设置》" 一文讲述了开启Docker远程连接的方法,但那种方法不安全,因为任何客户端都可以通过Docker服务的IP地址连接上去,今天我们就来学习Docker官方推荐的安全的远程连接方式:TLS加密连接,通过证书来保证安全性。 官方文档 这里是官方的权威文档:https:// ......
《docker远程连接设置》一文讲述了开启docker远程连接的方法,但那种方法不安全,因为任何客户端都可以通过docker服务的ip地址连接上去,今天我们就来学习docker官方推荐的安全的远程连接方式:tls加密连接,通过证书来保证安全性。
官方文档
这里是官方的权威文档:https://docs.docker.com/engine/security/https/
环境信息
本次实战的环境信息如下:
- docker服务所在机器(下面以a机器表示):centos linux release 7.6.1810
- docker服务版本:1.13.1
- 另一台验证远程连接的机器(下面以b机器表示)也是centos 7.6,其上安装了docker client 1.13.1
操作步骤
本次实战的操作步骤如下:
- 制作证书,包括ca、服务端、客户端的;
- 设置机器a上的docker服务的tls连接;
-
从机器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
- 此时还剩以下文件:
文件名 | 作用 |
---|---|
ca.pem | ca机构证书 |
ca-key.pem | 根证书rsa私钥 |
cert.pem | 客户端证书 |
key.pem | 客户私钥 |
server-cert.pem | 服务端证书 |
server-key.pem | 服务端私钥 |
至此,所有证书文件制作完成,接下来对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 images cannot 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 images cannot 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 images get 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 images get 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远程连接是,本文能给您提供参考。
推荐阅读
-
Windows10家庭版连接远程桌面出现credssp加密oracle修正问题
-
MsSQL使用加密连接SSL/TLS
-
oracle:docker镜像部署11g 创建用户名,远程连接
-
docker 创建mysql镜像,并成功进行远程连接
-
docker daemon远程连接设置详解
-
windows10远程桌面连接身份验证错误:函数不受支持,这可能是由于 CredSSP 加密 Oracle 修正
-
TLS加密远程连接Docker
-
Windows 10 远程连接出现函数错误 【这可能由于CredSSP加密Oracle修正】
-
docker部署mysql 实现远程连接的示例代码
-
IDEA连接远程服务器Docker部署Spring Boot项目的详细教程