Docker 2375端口漏洞问题修复
Docker 2375端口漏洞问题修复
参考:
两种方式:
- 防火墙限制访问(上层网关防火墙 / 操作系统防火墙 iptables|firewall)
- 设置SSL证书验证
1. 防火墙限制访问
1.1 网关安全组|防火墙
在路由层面限制主机的2375端口不可访问
1.2 系统防火墙
1.2.1 iptables方式
因docker的网络是通过iptables实现的,并且在安装docker时已禁用了firewall,故通过iptables作为防火墙去限制
因docker默认设置的iptables默认策略为全部允许,故增加特定的端口限制规则
如果想设置白名单则需要先设置一条白名单规则,再现在端口规则。iptables为按顺序执行
# 查看iptables所有规则
iptables -L -nv
# 只允许某个ip访问2375端口
iptables -I INPUT -s 172.16.99.34 -p tcp --dport 2375 -j ACCEPT
# 禁止所有ip访问2375端口
iptables -A INPUT -p tcp --dport 2375 -j REJECT
# 移除规则命令
iptables -D INPUT -p tcp --dport 3306 -j REJECT
因iptables在会话中添加的规则重启后会重置,需要将规则保存下来,可以使用iptables-service的iptables-save进行持久化。
因服务器环境比较负责,故考虑另一种方式:在系统启动后执行脚本添加规则
1.2.1.1 创建服务,开机自动添加规则
-
创建shell脚本
# 在root用户目录下创建文件夹 mkdir iptables-confc # 创建reject-port.sh文件 vi /root/iptables-conf/reject-port.sh
#!/bin/bash iptables -I INPUT -s 172.16.99.34 -p tcp --dport 2375 -j ACCEPT iptables -A INPUT -p tcp --dport 2375 -j REJECT iptables -A INPUT -p udp --dport 2375 -j REJECT
# 文件授权 chmod +x /root/iptables-conf/reject-port.sh
-
创建服务
# 创建服务文件 vi /etc/systemd/system/myiptables.service
[Unit] Description=my iptables config server After=docker.socket [Service] # 上一步创建的shell文件路径 ExecStart=/root/iptables-conf/reject-port.sh [Install] WantedBy=default.target
# 文件授权 chmod +x /etc/systemd/system/myiptables.service # 开机自启 systemctl enable myiptables.service # 启动服务(执行一次) systemctl start myiptables.service
1.2.2 firewall
# 添加规则
firewall-cmd --zone=public --add-port=3306/tcp --permanent
# 移除规则
firewall-cmd --zone=public --remove-port=3306/tcp --permanent
2. SSL证书
2.1 使用openssh制作证书秘钥
-
再服务器中新建目录
mkdir /etc/docker && cd /etc/docker
-
创建跟证书RSA秘钥
openssl genrsa -aes256 -out ca-key.pem 4096
备注:此处需要两次输入密码,请务必记住该密码,在后面步骤会用到
-
创建CA证书
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
备注:该步骤以上一步生成的密钥创建证书,也就是自签证书,也可从第三方CA机构签发
-
创建服务器私钥
openssl genrsa -out server-key.pem 4096
-
创建服务端签名请求证书文件
openssl req -subj "/CN=47.104.254.199" -sha256 -new -key server-key.pem -out server.csr
备注:其中的IP地址为自己服务器IP地址
-
创建extfile.cnf的配置文件
echo subjectAltName = IP:47.104.254.199,IP:0.0.0.0 >> extfile.cnf echo extendedKeyUsage = serverAuth >> extfile.cnf
备注:其中IP地址改为自己服务器IP地址
-
创建签名生效的服务端证书文件
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \-CAcreateserial -out server-cert.pem -extfile extfile.cnf
-
创建客户端私钥
openssl genrsa -out key.pem 4096
-
创建客户端签名请求证书文件
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
-
extfile.cnf文件中增加配置
echo extendedKeyUsage = clientAuth >> extfile.cnf
-
创建签名生效的客户端证书文件
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \-CAcreateserial -out cert.pem -extfile extfile.cnf
-
删除无用文件
rm -v client.csr server.csr
-
为证书文件授权
chmod -v 0400 ca-key.pem key.pem server-key.pem chmod -v 0444 ca.pem server-cert.pem cert.pem
2.2 配置Docker支持TLS连接
-
编辑docker.service配置文件
vi /lib/systemd/system/docker.service
找到ExecStart=开头的一行代码,将其替换为如下内容
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem
备注:此处设置docker远程端口为2375,可根据需要修改
-
刷新配置,重启Docker
systemctl daemon-reload && systemctl restart docker
2.3 Portainer中使用TLS证书连接
-
将证书下载到本地
将上面创建的ca.pem、cert.pem、key.pem这三个文件下载到本地
-
配置连接地址与证书
填写上名称及Api URL,就是ip:2375端口
选择TLS,将上面下载下来的三个证书上传上去,点击连接测试是否可以