TLS加密远程连接Docker

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=http://www.likecs.com/usr/bin/dockerd-current --tlsverify --tlscacert=http://www.likecs.com/root/work/ca.pem --tlscert=http://www.likecs.com/root/work/server-cert.pem --tlskey=http://www.likecs.com/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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsszjz.html