为了防止会话劫持、链路劫持等一系列中间人攻击,成为了Docker安全通信的首要目标。为了解决这个问题,我们可以使用TLS加密,为主机颁发认证证书,只有通过认证才可以通过。
中间人攻击是一种非常常见的黑客攻击的手段,如果两台主机,a主机和b主机在通信。这个这个过程被另一台c主机窃听到了两台主机之间的通信内容,如果不加密的话,黑客有可能篡改其中的通信内容,这样就会导致发送的信息并非本意。
构建TSL加密通信:这里需要准备两台主机,一台作为master节点,另一台作为客户机。
1.配置hosts文件:
[root@master tls]# vi /etc/hosts
#将本地127地址解析为主机名
127.0.0.1 master
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
修改主机名
hostnamectl set-hostname master
su
2.创建ca秘钥文件
创建一个TLS文件目录在其中进行相关操作。
#创建目录
mkdir /tls
生成ca秘钥文件
#用openssl生成非对称256位秘钥,-out表示生成
openssl genrsa -aes256 -out ca-key.pem 4096
#指定证书有效期为1000天,指向刚才生成的ca秘钥,指定项目名称,-subj ,-out 生成ca.pem证书。
openssl req -new -x509 -days 1000 -key ca-key.pem -sha256 -subj "/CN=*" -out ca.pem
#非对称私钥
openssl genrsa -out server-key.pem 4096
#需要对刚才的服务器私钥进行认证的过程,指定项目名称和服务器私钥名称。
openssl req -subj "/CN=*" -sha256 -new -key server-key.pem -out server.csr
指定ca秘钥和私钥证书的签名
openssl x509 -req -days 1000 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem
openssl genrsa -out server-key.pem 4096
8.签名客户端秘钥进行认证。
openssl req -subj "/CN=client" -new -key key.pem -out client.csr
9.创建配置文件。
echo extendedKeyUsage=clientAuth > extfile.cnf
10.签名证书,需要指定ca证书、ca秘钥、客户端签名和刚才生成的配置文件。
openssl x509 -req -days 1000 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
11.三处配置文件和签名。
rm -rf ca.srl client.csr extfile.cnf server.csr
12.配置docker的docker.server
vi /lib/systemd/system/docker.service
#在第15行出处添加证书
[Service]
10 Type=notify
11 # the default is not to use systemd for cgroups because the delegate issues still
12 # exists and systemd currently does not support the cgroup feature set required
13 # for containers run by docker
14 #ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
15 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
16 ExecReload=/bin/kill -s HUP $MAINPID
13.将 /tls/ca.pem /tls/cert.pem /tls/key.pem 三个文件复制到另一台主机。
scp ca.pem [email protected]:/etc/docker/
scp cert.pem [email protected]:/etc/docker/
scp key.pem [email protected]:/etc/docker/
14.在本地终端进行TSL加密通信验证。
docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://master:2376 version
docker pull nginx
这里用的是相对路径,如果在其他路径一定要使用秘钥的绝对路径。
15.清空iptables规则否则,节点无法与其通信。
iptables -F
1.配置hosts解析master节点。
vi /etc/hosts
192.168.80.106 master
2.在其他终端验证通信加密。这里的命令也是相对路径。在/etc/docker目录中。
docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://master:2376 version