1、背景:
1、有朋友问,之前的登录安全脚本能否通过fail2ban+mail实现。
2、近期HW,这些基础的安全防护还是有必要的。
3、因为是信创服务器,所以不能通过yum安装,需要源码安装。
2、思路:
1、检查运行环境是否具备安装条件(python环境)。
2、源码下载,编译,安装。
3、配置服务,基本配置,管理服务。
4、测试验证可用性。
3、开干:
1、检查运行环境是否具备安装条件(python环境)。
bash
# 检查系统自带哪些 Python 版本
python --version 2>&1; python3 --version 2>&1; python2 --version 2>&1
# 查看 python 解释器的路径
which python python3 python2 2>/dev/null

麒麟 V10 通常自带 Python3。上面的命令显示有 python3,那就不需要用 安装 python3,直接用系统自带的 python3 即可。
2、源码下载,编译,安装。
下载
bash
wget https://github.com/fail2ban/fail2ban/archive/refs/tags/1.0.2.tar.gz
# 如果没有 wget,可以用 curl:
# curl -L -O https://github.com/fail2ban/fail2ban/archive/refs/tags/1.0.2.tar.gz
#如果有git,用这个
#git clone https://github.com/fail2ban/fail2ban.git


执行
bash
[root@dev1 script]# cd fail2ban/
[root@dev1 fail2ban]# python3 setup.py install
running install
running build
running build_py
creating build
creating build/lib
creating build/lib/fail2ban
copying fail2ban/__init__.py -> build/lib/fail2ban
copying fail2ban/exceptions.py -> build/lib/fail2ban
copying fail2ban/version.py -> build/lib/fail2ban
copying fail2ban/helpers.py -> build/lib/fail2ban
copying fail2ban/setup.py -> build/lib/fail2ban
copying fail2ban/protocol.py -> build/lib/fail2ban
creating build/lib/fail2ban/client
copying fail2ban/client/filterreader.py -> build/lib/fail2ban/client
copying fail2ban/client/fail2banregex.py -> build/lib/fail2ban/client
copying fail2ban/client/fail2banreader.py -> build/lib/fail2ban/client
copying fail2ban/client/__init__.py -> build/lib/fail2ban/client
.........
Creating build/fail2ban-openrc.init (from fail2ban-openrc.init.in): @BINDIR@ -> /usr/local/bin
creating fail2ban-python binding -> /usr/local/bin
changing mode of /usr/local/bin/fail2ban-regex to 755
changing mode of /usr/local/bin/fail2ban-server to 755
changing mode of /usr/local/bin/fail2ban-testcases to 755
changing mode of /usr/local/bin/fail2ban-client to 755
Please do not forget to update your configuration files.
They are in "/etc/fail2ban/".
You can also install systemd service-unit file from "build/fail2ban.service"
resp. corresponding init script from "files/*-initd".
生成 Service 文件,处理 tmpfiles 文件
进入 files 目录,执行以下命令,把模板里的占位符替换掉,并输出为标准的 service 文件:
如果你在当前目录找不到 fail2ban.tmpfiles(可能旧版本叫法不同或没有),我们可以直接手动创建它,这只是为了配置系统运行时的临时目录,很简单:
bash
cd /data/mdm2.0/script/fail2ban/files
# 读取模板,替换占位符,生成最终的 service 文件
python3 -c "import sys; content = open('fail2ban.service.in').read(); print(content.replace('@BINDIR@', '/usr/bin').replace('@LOCALSTATEDIR@', '/var'))" > fail2ban.service
# 确认生成成功,且里面没有残留的 @ 符号
cat fail2ban.service
cat > /etc/tmpfiles.d/fail2ban.conf << 'EOF'
d /var/run/fail2ban 0755 root root -
EOF

复制 service 文件并配置启动
bash
cp fail2ban.service /etc/systemd/system/
# 创建日志目录
mkdir -p /var/log/fail2ban
# 重新加载 systemd
systemctl daemon-reload
# 启动并设置开机自启
systemctl enable --now fail2ban

注意:这里手动生成的service服务会有几个坑,主要如下:
(code=exited, status=203/EXEC)

- (code=exited, status=1/FAILURE)


处理办法:
bash
journalctl -u fail2ban -n 30 --no-pager
#确认正确的 PYTHONPATH
python3 -c "import fail2ban; print(fail2ban.__file__)"
/usr/local/lib/python3.7/site-packages/fail2ban/__init__.py

完整的/etc/systemd/system/fail2ban.service文件
bash
[Unit]
Description=Fail2Ban Service
Documentation=man:fail2ban(1)
After=network.target iptables.service firewalld.service ip6tables.service ipset.service nftables.service
[Service]
Type=simple
Environment="PYTHONNOUSERSITE=1"
Environment="PYTHONPATH=/usr/local/lib/python3.7/site-packages"
ExecStart=/usr/bin/python3 /usr/local/bin/fail2ban-server -xf start
ExecStop=/usr/bin/python3 /usr/local/bin/fail2ban-client stop
ExecReload=/usr/bin/python3 /usr/local/bin/fail2ban-client reload
Restart=on-failure
RestartPreventExitStatus=0 255
[Install]
WantedBy=multi-user.target

3、配置服务,基本配置,管理服务。
注意:Fail2Ban 的配置文件位于 /etc/fail2ban/ 目录下。重要原则:不要直接修改 /etc/fail2ban/jail.conf(主配置文件,升级可能被覆盖),应创建或编辑 /etc/fail2ban/jail.local 文件来覆盖默认设置
bash
[root@dev1 ~]# cat /etc/fail2ban/jail.local
[DEFAULT]
# 忽略的 IP 列表(白名单)。多个 IP 用空格隔开。
# 可以写单个 IP,也可以写 CIDR 网段(如 192.168.1.0/24)
# 建议保留 127.0.0.1/8 ::1 以防本机服务互相影响
ignoreip = 127.0.0.1/8 ::1 <你的运维公网IP> <你的内网网段>
# 封禁时间:1天 (86400秒)
bantime = 86400
# 检测时间窗口:10分钟 (600秒)
findtime = 600
# 最大失败次数
maxretry = 5
# 封禁动作:直接丢弃数据包
banaction = iptables-multiport
[sshd]
enabled = true
# 麒麟系统的SSH日志通常在这里,如果路径不对可以改为 /var/log/messages
logpath = /var/log/secure
重载并启动
bash
systemctl daemon-reload
rm -f /var/run/fail2ban/fail2ban.sock
systemctl start fail2ban
systemctl status fail2ban

如果没遇到上面的报错,就不需要管了,如有,可看处理办法:
看这个报错:'python3\r': No such file or directory。
里面的 \r 是 Windows 系统的回车符。这说明 fail2ban-client 这个脚本文件之前可能被 Windows 编辑过,或者解压时带了 Windows 的换行符(CRLF),导致 Linux 无法识别。
我们需要把 /usr/local/bin/ 下的几个脚本文件里的 \r 符号去掉。
bash
# 清理 fail2ban-client 脚本
sed -i 's/\r//' /usr/local/bin/fail2ban-client
# 顺便把 server 和 regex 也一起清理了,防止后面出同样的问题
sed -i 's/\r//' /usr/local/bin/fail2ban-server
sed -i 's/\r//' /usr/local/bin/fail2ban-regex
输出结果显示:
Number of jail: 1--- 已启用 1 个防护规则Jail list: sshd--- SSH 防暴力破解已生效
你的服务器现在已经穿上了"防弹衣"。10分钟内 SSH 登录失败超过 5 次的 IP 将被自动封禁 24 小时。
4、测试验证可用性。
常用的管理命令
bash
# 查看 SSH 防护详情(包括被封禁的 IP 列表)
fail2ban-client status sshd
# 手动封禁某个 IP
fail2ban-client set sshd banip 1.2.3.4
# 手动解封某个 IP
fail2ban-client set sshd unbanip 1.2.3.4
# 重启服务(修改配置后需要执行)
systemctl restart fail2ban



