系统环境

标题 版本 备注
系统版本 ubuntu 22.04.3 LTS (Jammy Jellyfish) -
内核版本 5.15.0-88-generic #98-Ubuntu SMP Mon Oct 2 15:18:56 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux -
Python v3.10.12 -
Fail2ban v1.1.0.1 -

Fail2ban 简介

Fail2ban 项目地址:https://github.com/fail2ban/fail2ban

Fail2ban 是一个用于保护 Linux 服务器的安全工具,主要用于防范暴力攻击和恶意登录。它通过监视系统日志文件来检测恶意行为,并采取预防措施来阻止攻击者。以下是 Fail2ban 的一些主要功能和特点:

  1. 日志监控: Fail2ban 会监视系统日志文件(如 /var/log/auth.log),以检测到来的登录尝试、密码错误等事件。

  2. 检测恶意行为: 它使用配置文件中定义的规则和模式来识别恶意行为,比如重复的登录失败、SSH 访问尝试等。

  3. 自动封禁: 一旦检测到恶意行为,Fail2ban 会自动封禁攻击者的 IP 地址。默认情况下,它会将攻击者的 IP 地址添加到防火墙规则中(如 iptables 或 firewalld)以屏蔽进一步的访问。

  4. 可定制性: Fail2ban 允许用户根据自己的需求定制防护规则和行为。用户可以编辑配置文件,定义自己的监控规则、阈值和封禁动作。

  5. 日志记录: 它记录所有的封禁事件和解除封禁事件,以便管理员追踪安全事件并进行审计。

  6. 轻量级且高效: Fail2ban 是一个轻量级的程序,对系统资源的消耗很低,可以长时间运行而不会对服务器性能产生显著影响。

总的来说,Fail2ban 是一种强大的工具,可以帮助管理员保护他们的 Linux 服务器免受暴力攻击和恶意登录的威胁。

Fail2ban 安装

1.从 Fail2ban 项目地址将 Fail2ban 整个项目克隆到服务器的 /usr/local/src/ 目录下:

$ sudo git clone https://github.com/fail2ban/fail2ban.git /usr/local/src/fail2ban
Cloning into '/usr/local/src/fail2ban'...
remote: Enumerating objects: 41542, done.
remote: Counting objects: 100% (703/703), done.
remote: Compressing objects: 100% (346/346), done.
remote: Total 41542 (delta 434), reused 542 (delta 355), pack-reused 40839
Receiving objects: 100% (41542/41542), 12.04 MiB | 11.79 MiB/s, done.
Resolving deltas: 100% (31097/31097), done.

2.进入克隆目录,执行 python3 install setup.py 安装 fail2ban:

$ cd /usr/local/src/fail2ban && sudo python3 setup.py install

安装完成后,执行 fail2ban-client -V 看是否能正常输出 fail2ban 的版本号:

$ sudo fail2ban-client -V
1.1.0.1

3.复制安装在 /usr/local/src/fail2ban/build/ 目录下的 fail2ban 启动脚本文件到 /lib/systemd/system/ 目录下:

$ sudo cp /usr/local/src/fail2ban/build/fail2ban.service /lib/systemd/system/

其脚本文件的内容为:

[Unit]
Description=Fail2Ban Service
Documentation=man:fail2ban(1)
After=network.target iptables.service firewalld.service ip6tables.service ipset.service nftables.service
PartOf=iptables.service firewalld.service ip6tables.service ipset.service nftables.service

[Service]
Type=simple
Environment="PYTHONNOUSERSITE=1"
ExecStartPre=/bin/mkdir -p /run/fail2ban
ExecStart=/usr/local/bin/fail2ban-server -xf start
# if should be logged in systemd journal, use following line or set logtarget to sysout in fail2ban.local
# ExecStart=/usr/local/bin/fail2ban-server -xf --logtarget=sysout start
ExecStop=/usr/local/bin/fail2ban-client stop
ExecReload=/usr/local/bin/fail2ban-client reload
PIDFile=/run/fail2ban/fail2ban.pid
Restart=on-failure
RestartPreventExitStatus=0 255

[Install]
WantedBy=multi-user.target

4.执行命令 systemctl daemon-reload 加载下启动脚本:

$ sudo systemctl daemon-reload

5.执行命令 systemctl enable --now fail2ban.service 启动 fail2ban 并将其设置为开机启动:

$ systemctl enable --now fail2ban.service
Created symlink /etc/systemd/system/multi-user.target.wants/fail2ban.service → /lib/systemd/system/fail2ban.service.

这里也许会有人有疑问,你配置文件都没配,就可以启动 fail2ban ? 的确,我这里是没有先配置 fail2ban 。但是,在安装 fail2ban 是系统默认会将其配置文件都安装到了 /etc/fail2ban/ 目录下,里面有默认的配置

6.执行命令 systemctl status fail2ban.service 查看其启动状态,如果 Activerunning,则说明启动成功:

$ sudo systemctl status fail2ban.service
● fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2024-03-18 09:27:07 CST; 8s ago
Docs: man:fail2ban(1)
Process: 383747 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS)
Main PID: 383749 (fail2ban-server)
Tasks: 3 (limit: 1939)
Memory: 10.3M
CPU: 83ms
CGroup: /system.slice/fail2ban.service
└─383749 /usr/bin/python3 /usr/local/bin/fail2ban-server -xf start

Mar 18 09:27:07 iZ7xv944qlwx78avfc2zlmZ systemd[1]: Starting Fail2Ban Service...
Mar 18 09:27:07 iZ7xv944qlwx78avfc2zlmZ systemd[1]: Started Fail2Ban Service.
Mar 18 09:27:07 iZ7xv944qlwx78avfc2zlmZ fail2ban-server[383749]: Server ready

Fail2ban 配置

安装默认生成的配置文件都在 /etc/fail2ban 目录下,其中各文件或目录的作用如下:

$ sudo tree -L 1 /etc/fail2ban/
/etc/fail2ban/
├── action.d # 动作配置文件目录,用于定义 Fail2ban 在检测到可疑活动后可以采取的行动。
├── fail2ban.conf # 主配置文件
├── fail2ban.d
├── filter.d # 过滤器配置文件目录,用于定义 Fail2ban 如何识别可疑活动。
├── jail.conf # 核心配置文件
├── jail.d
├── paths-arch.conf # 针对 arch linux 系统的
├── paths-common.conf
├── paths-debian.conf
├── paths-fedora.conf
├── paths-freebsd.conf
├── paths-opensuse.conf
└── paths-osx.conf

fail2ban.conf

fail2ban.conf 是 fail2ban 的主配置文件,其中包含了一些全局配置选项,如日志文件路径、pid 文件路径、socket 路径 以及数据库路径、清理等:

[DEFAULT]                     # 默认配置部分
loglevel = INFO # 日志级别设置为 INFO,记录信息级别及更高级别的日志消息
logtarget = /var/log/fail2ban.log # 日志文件的路径
syslogsocket = auto # Syslog socket 设置为自动,以自动检测系统的 Syslog 配置
socket = /var/run/fail2ban/fail2ban.sock # Fail2ban 的 UNIX 套接字文件路径
pidfile = /var/run/fail2ban/fail2ban.pid # PID 文件的路径
dbfile = /var/lib/fail2ban/fail2ban.sqlite3 # 数据库文件的路径
dbpurgeage = 1d # 清除数据库中的旧条目,间隔为 1 天
dbmaxmatches = 10 # 数据库中每个规则的最大匹配次数
[Definition] # 定义部分,用于定义过滤器的规则
[Thread] # 线程部分,用于配置 Fail2ban 的线程设置

jail.conf

Jail.conf 配置文件的作用

Jail.conf 是 Fail2ban 软件的核心配置文件,用于定义服务过滤器行为等配置项,控制 Fail2ban 如何监视和阻止可疑登录行为。

主要作用:

  • 定义需要保护的服务,例如 SSH、FTP、Telnet 等。
  • 配置针对每个服务的登录失败攻击行为检测规则
  • 设定封禁策略,例如封禁 IP 地址、限制登录尝试次数等。
  • 配置通知策略,例如将可疑登录行为发送邮件通知管理员等。

配置文件结构:

  • **[DEFAULT]**:默认配置项,适用于所有服务。
  • **[服务名]**:针对特定服务的配置项,例如 SSH、FTP 等。

重要配置项:

  • enabled: 是否启用该服务配置。
  • port: 监听的端口号。
  • filter: 使用的过滤器名称。
  • maxretry: 最大登录尝试次数。
  • bantime: 封禁时间长度。
  • action: 采取的封禁动作,例如 iptables、nftables 等。
  • logpath: 日志文件路径。
  • backend: 日志后端,例如 syslog、email 等。

示例:

[DEFAULT]
enabled = true
bantime = 3600
backend = syslog

[SSH]
enabled = true
port = 22
filter = sshd
maxretry = 3
action = iptables

[FTP]
enabled = true
port = 21
filter = ftpd
maxretry = 5
action = iptables

配置文件示例:

总结:

  • Jail.conf 是 Fail2ban 的核心配置文件,用于配置服务过滤器行为等。
  • 通过 Jail.conf 可以有效地监视和阻止可疑登录行为,提高服务器安全性。

注意:

  • Jail.conf 配置文件的语法较为复杂,修改配置时请务必谨慎。
  • 建议在修改配置之前备份配置文件。

参考资料:

Fail2ban 测试