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,将上面下载下来的三个证书上传上去,点击连接测试是否可以


__EOF__

本文作者yg0070
本文链接https://www.cnblogs.com/yg0070/p/18121653.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   yg0070  阅读(1002)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示