Docker 2375端口漏洞问题修复

Docker 2375端口漏洞问题修复

参考:

https://www.cnblogs.com/yxb-blog/p/14631561.html

两种方式:

  1. 防火墙限制访问(上层网关防火墙 / 操作系统防火墙 iptables|firewall)
  2. 设置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 创建服务,开机自动添加规则
  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
    
  2. 创建服务

    # 创建服务文件
    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制作证书秘钥

  1. 再服务器中新建目录

    mkdir /etc/docker && cd /etc/docker
    
  2. 创建跟证书RSA秘钥

    openssl genrsa -aes256 -out ca-key.pem 4096
    

    备注:此处需要两次输入密码,请务必记住该密码,在后面步骤会用到

  3. 创建CA证书

    openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
    

    备注:该步骤以上一步生成的密钥创建证书,也就是自签证书,也可从第三方CA机构签发

  4. 创建服务器私钥

    openssl genrsa -out server-key.pem 4096
    
  5. 创建服务端签名请求证书文件

    openssl req -subj "/CN=47.104.254.199" -sha256 -new -key server-key.pem -out server.csr
    

    备注:其中的IP地址为自己服务器IP地址

  6. 创建extfile.cnf的配置文件

    echo subjectAltName = IP:47.104.254.199,IP:0.0.0.0 >> extfile.cnf
    echo extendedKeyUsage = serverAuth >> extfile.cnf
    

    备注:其中IP地址改为自己服务器IP地址

  7. 创建签名生效的服务端证书文件

    openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \-CAcreateserial -out server-cert.pem -extfile extfile.cnf
    
  8. 创建客户端私钥

    openssl genrsa -out key.pem 4096
    
  9. 创建客户端签名请求证书文件

    openssl req -subj '/CN=client' -new -key key.pem -out client.csr
    
  10. extfile.cnf文件中增加配置

    echo extendedKeyUsage = clientAuth >> extfile.cnf
    
  11. 创建签名生效的客户端证书文件

    openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \-CAcreateserial -out cert.pem -extfile extfile.cnf
    
  12. 删除无用文件

    rm -v client.csr server.csr
    
  13. 为证书文件授权

    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连接

  1. 编辑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,可根据需要修改

  2. 刷新配置,重启Docker

    systemctl daemon-reload && systemctl restart docker
    

2.3 Portainer中使用TLS证书连接

  1. 将证书下载到本地

    将上面创建的ca.pem、cert.pem、key.pem这三个文件下载到本地

  2. 配置连接地址与证书

填写上名称及Api URL,就是ip:2375端口

选择TLS,将上面下载下来的三个证书上传上去,点击连接测试是否可以

posted @ 2024-04-08 16:37  yg0070  阅读(118)  评论(0编辑  收藏  举报