Docker-TLS加密通讯
为什么使用TLS加密
为了防止链路劫持、会话劫持等问题导致 Docker 通信时被中 间人攻击,c/s 两端应该通过加密方式通讯。
Docker-TLS配置
实验环境
设备名称 | 主机名 | IP地址 | 需要安装环境 |
---|---|---|---|
TLS服务器 | tls | 20.0.0.10 | 安装docker环境 |
客户机 | client | 20.0.0.20 | 安装docker环境 |
TLS服务器配置
1、创建目录用于放在证书文件
[root@tls ~]# mkdir tls
[root@tls ~]# cd tls/
[root@tls tls]#
2、创建ca密钥
[root@tls tls]# openssl genrsa -aes256 -out ca-key.pem 4096
Generating RSA private key, 4096 bit long modulus
.............................++
.............................++
e is 65537 (0x10001)
Enter pass phrase for ca-key.pem: #设置证书密码(123456)
Verifying - Enter pass phrase for ca-key-pem: #再次却认证书密码(123456)
[root@tls tls]# ls -lh
总用量 4.0K
-rw-r--r-- 1 root root 3.3K 12月 3 14:26 ca-key.pem
-aes256:对称加密并设置为256位(必须是2的倍数)
-out ca-key-pem 4096:输出一个文件的名字为ca-key-pem,大小为4096
3、创建ca证书
[root@tls tls]# openssl req -new -x509 -days 1000 -key ca-key.pem -sha256 -subj "/CN=*" -out ca.pem
Enter pass phrase for ca-key.pem: #输入ca密钥密码
[root@tls tls]# ls -lh
总用量 8.0K
-rw-r--r-- 1 root root 3.3K 12月 3 14:26 ca-key.pem
-rw-r--r-- 1 root root 1.8K 12月 3 14:26 ca.pem
-new:创建一个新的ca证书
-x509:ca证书格式
-days:天数
-key:选择ca密钥所在的位置
-sha256:哈希验证
subj "/CN=*" :国家域
-out:输出文件
4、创建服务器私钥
[root@tls tls]# openssl genrsa -out server-key.pem 4096
Generating RSA private key, 4096 bit long modulus
........................................++
........................................++
e is 65537 (0x10001)
[root@tls tls]# ls -lh
总用量 12K
-rw-r--r-- 1 root root 3.3K 12月 3 14:26 ca-key.pem
-rw-r--r-- 1 root root 1.8K 12月 3 14:26 ca.pem
-rw-r--r-- 1 root root 3.2K 12月 3 14:28 server-key.pem
5、签名私钥
[root@tls tls]# openssl req -subj "/CN=*" -sha256 -new -key server-key.pem -out server.csr
[root@tls tls]# ls -lh
总用量 16K
-rw-r--r-- 1 root root 3.3K 12月 3 14:26 ca-key.pem
-rw-r--r-- 1 root root 1.8K 12月 3 14:26 ca.pem
-rw-r--r-- 1 root root 1.6K 12月 3 14:28 server.csr
-rw-r--r-- 1 root root 3.2K 12月 3 14:28 server-key.pem
6、使用ca证书与私钥证书签名
[root@tls tls]# openssl x509 -req -days 1000 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem
Signature ok
subject=/CN=*
Getting CA Private Key
Enter pass phrase for ca-key.pem: #输入ca密钥密码
[root@tls tls]# ls -lh
总用量 24K
-rw-r--r-- 1 root root 3.3K 12月 3 14:26 ca-key.pem
-rw-r--r-- 1 root root 1.8K 12月 3 14:26 ca.pem
-rw-r--r-- 1 root root 17 12月 3 14:30 ca.srl
-rw-r--r-- 1 root root 1.7K 12月 3 14:30 server-cert.pem
-rw-r--r-- 1 root root 1.6K 12月 3 14:28 server.csr
-rw-r--r-- 1 root root 3.2K 12月 3 14:28 server-key.pem
[root@tls tls]#
-in:指定签名私钥文件所在位置
-CA:ca证书所在位置
-CAkey:ca密钥所在位置
7、生成客户端密钥
[root@tls tls]# openssl genrsa -out key.pem 4096
Generating RSA private key, 4096 bit long modulus
.................++
.................++
e is 65537 (0x10001)
[root@tls tls]# ls -lh
总用量 28K
-rw-r--r-- 1 root root 3.3K 12月 3 14:26 ca-key.pem
-rw-r--r-- 1 root root 1.8K 12月 3 14:26 ca.pem
-rw-r--r-- 1 root root 17 12月 3 14:30 ca.srl
-rw-r--r-- 1 root root 3.2K 12月 3 14:39 key.pem
-rw-r--r-- 1 root root 1.7K 12月 3 14:30 server-cert.pem
-rw-r--r-- 1 root root 1.6K 12月 3 14:28 server.csr
-rw-r--r-- 1 root root 3.2K 12月 3 14:28 server-key.pem
[root@tls tls]#
8、签名客户端
[root@tls tls]# openssl req -subj "/CN=client*" -new -key key.pem -out client.csr
[root@tls tls]# ls -lh
总用量 32K
-rw-r--r-- 1 root root 3.3K 12月 3 14:26 ca-key.pem
-rw-r--r-- 1 root root 1.8K 12月 3 14:26 ca.pem
-rw-r--r-- 1 root root 17 12月 3 14:30 ca.srl
-rw-r--r-- 1 root root 1.6K 12月 3 14:43 client.csr
-rw-r--r-- 1 root root 3.2K 12月 3 14:39 key.pem
-rw-r--r-- 1 root root 1.7K 12月 3 14:30 server-cert.pem
-rw-r--r-- 1 root root 1.6K 12月 3 14:28 server.csr
-rw-r--r-- 1 root root 3.2K 12月 3 14:28 server-key.pem
[root@tls tls]#
9、创建配置文件
[root@tls tls]# echo extendedKeyUsage=clientAuth > extfile.cnf
10、签名证书
[root@tls tls]# openssl x509 -req -days 1000 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
Signature ok
subject=/CN=client*
Getting CA Private Key
Enter pass phrase for ca-key.pem: #输入证书密码
[root@tls tls]# ls -lh
总用量 40K
-rw-r--r-- 1 root root 3.3K 12月 3 14:26 ca-key.pem
-rw-r--r-- 1 root root 1.8K 12月 3 14:26 ca.pem
-rw-r--r-- 1 root root 17 12月 3 14:47 ca.srl
-rw-r--r-- 1 root root 1.7K 12月 3 14:47 cert.pem
-rw-r--r-- 1 root root 1.6K 12月 3 14:43 client.csr
-rw-r--r-- 1 root root 28 12月 3 14:44 extfile.cnf
-rw-r--r-- 1 root root 3.2K 12月 3 14:39 key.pem
-rw-r--r-- 1 root root 1.7K 12月 3 14:30 server-cert.pem
-rw-r--r-- 1 root root 1.6K 12月 3 14:28 server.csr
-rw-r--r-- 1 root root 3.2K 12月 3 14:28 server-key.pem
[root@tls tls]#
11、删除多余的文件
[root@tls tls]# rm -fr ca.srl client.csr extfile.cnf server.csr
12、修改docker.service文件
[root@tls tls]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock #注释掉这一行,并在下面新增的一行如下内容
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/root/tls/ca.pem --tlscert=/root/tls/server-cert.pem --tlskey=/root/tls/server-key.pem -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock
13、重启docker
[root@tls ~]# systemctl daemon-reload
[root@tls ~]# systemctl restart docker.service
14、将 /tls/ca.pem /tls/cert.pem /tls/key.pem 三个文件复制到客户机里主机
[root@tls tls]# scp ca.pem 20.0.0.20:/etc/docker/
The authenticity of host '20.0.0.20 (20.0.0.20)' can't be established.
ECDSA key fingerprint is SHA256:yELtpt+yAiWNtPQb5bPu3PyWman5X5xL5zwU607sqHE.
ECDSA key fingerprint is MD5:b1:3f:1c:fa:eb:42:fc:bf:02:40:80:ea:8e:01:0a:7a.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '20.0.0.20' (ECDSA) to the list of known hosts.
root@20.0.0.20's password: #输入客户机密码
ca.pem 100% 1765 1.2MB/s 00:00
[root@tls tls]# scp cert.pem 20.0.0.20:/etc/docker/
root@20.0.0.20's password: #输入客户机密码
cert.pem 100% 1696 1.6MB/s 00:00
[root@tls tls]# scp key.pem 20.0.0.20:/etc/docker/
root@20.0.0.20's password: #输入客户机密码
key.pem 100% 3243 508.7KB/s 00:00
[root@tls tls]#
15、本机验证
[root@tls tls]# docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://20.0.0.10:2376 version
Client: Docker Engine - Community
Version: 19.03.13
API version: 1.40
Go version: go1.13.15
Git commit: 4484c46d9d
Built: Wed Sep 16 17:03:45 2020
OS/Arch: linux/amd64
Experimental: false
error during connect: Get https://20.0.0.10:2376/v1.40/version: x509: cannot validate certificate for 20.0.0.10 because it doesn't contain any IP SANs
[root@tls tls]#
客户机测试
1、设置映射
[root@clien docker]# echo "20.0.0.10 tls" >>/etc/hosts
2、查看TLS服务器的docker版本
[root@clien ~]# cd /etc/docker/
[root@clien docker]# docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://tls:2376 version
3、下载一个nginx镜像
[root@clien docker]# docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://tls:2376 pull nginx
4、查看镜像是否下载
[root@clien docker]# docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://tls:2376 images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest bc9a0695f571 8 days ago 133MB
5、创建一个容器
[root@clien docker]# docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://tls:2376 run -itd nginx:latest bash
70ddb56b1d0652a1bf50424c4d786b53ebc6285bbf00381db12e6153b9028182
[root@clien docker]#
6、查看容器是否创建
[root@clien docker]# docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://tls:2376 ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
70ddb56b1d06 nginx:latest "/docker-entrypoint.…" About a minute ago Up About a minute 80/tcp heuristic_mendel
[root@clien docker]#
Docker-TLS服务器验证
1、查看nginx镜像是否下载成功
[root@tls tls]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest bc9a0695f571 8 days ago 133MB
2、查看镜像是否创建成功
[root@tls tls]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
70ddb56b1d06 nginx:latest "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 80/tcp heuristic_mendel
[root@tls tls]#