为了防止链路劫持、会话劫持等问题导致 Docker 通信时被中 间人攻击,client/server 两端应该通过加密方式通讯。
什么是TLS
传输层安全性协议(英语:Transport Layer Security,缩写作TLS),及其前身安全套接层(Secure Sockets Layer,缩写作SSL)是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。
SSL包含记录层(Record Layer)和传输层,记录层协议确定传输层数据的封装格式。传输层安全协议使用X.509认证,之后利用非对称加密演算来对通信方做身份认证,之后交换对称密钥作为会谈密钥(Session key)。这个会谈密钥是用来将通信两方交换的数据做加密,保证两个应用间通信的保密性和可靠性,使客户与服务器应用之间的通信不被攻击者窃听。
配置docker容器TLS加密通讯的方法
1.创建一个ca密钥 ca-key.pem
openssl genrsa -aes256 -out ca-key.pem 4096 #自己输入一个密码
2.由ca密钥生成一个ca证书 ca.pem
openssl req -new -x509 -days 1000 -key ca-key.pem -sha256 -subj "/CN=*" -out ca.pem #需要输入密码
3.创建服务器私钥 server-key.pem
openssl genrsa -out server-key.pem 4096
4.签名私钥 server.scr
openssl req -subj "/CN=*" -sha256 -new -key server-key.pem -out server.csr
5.生成数字证书 server-cert.pem
openssl x509 -req -days 1000 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem
6.生成客户端密钥 key.pem
openssl genrsa -out key.pem 4096
7.签名客户端私钥 client.csr
openssl req -subj "/CN=client" -new -key key.pem -out client.csr
8.创建配置文件,生成client自签证书
echo extendedKeyUsage=clientAuth > extfile.cnf
9.生成客户端数字证书 cert.pem
openssl x509 -req -days 1000 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
10.删除多余文件
rm -rf ca.srl client.csr extfile.cnf server.csr
11.配置docker
vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/tls/ca.pem --tlscert=/tls/server-cert.pem --tlskey=/tls/server-key.pem -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock #端口号可自定义
12.重新加载和启动服务
systemctl daemon-reload
systemctl restart docker
13.将ca.pem、cert.pem、key.pem上传客户端
scp ca.pem root@192.168.100.12:/etc/docker/
scp cert.pem root@192.168.100.12:/etc/docker/
scp key.pem root@192.168.100.12:/etc/docker/
验证
本地验证
echo "192.168.100.100 masher" >> /etc/hosts
docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://master:2376 version
#此处必须做域名映射,master要映射到服务端ip地址
发现可以正常查看
客户端验证
echo "192.168.100.100 masher" >> /etc/hosts
docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://master:2376 version
也能正常访问查看docker版本信息