15.1 Fail2Ban 配置(基于 IPFW、PF 与 IPF)

在网络安全实践中,暴力破解(brute-force attack)是针对身份认证系统的常见威胁向量。Fail2Ban 作为一种基于日志的入侵防御系统(Intrusion Prevention System, IPS),通过动态更新防火墙规则来实现自适应访问控制,为服务器提供实时防护。

根据 官方说明arrow-up-right 备份arrow-up-right,Fail2Ban 可封禁多次身份验证错误的主机,即通过更新系统防火墙规则来拒绝来自那些 IP 地址的新连接arrow-up-right 备份arrow-up-right。Fail2Ban 几乎完全由 Python 写就(Python 占比约 96%)。本文适配了 FreeBSD 中常见的三种防火墙——IPFW、PF、IPF,读者无需同时配置以上所有防火墙,只需选择其中一款即可。

安装 Fail2Ban

Fail2Ban 的安装过程如下,用户可选择使用 pkg 或 Ports 进行安装。

安装 Fail2Ban 有两种主要方式,分别是通过 pkg 二进制包和通过 Ports 源代码编译,用户可根据自身需求选择其中一种。

  • 使用 pkg 安装:

# pkg install security/py-fail2ban
  • 或者使用 Ports 安装:

# cd /usr/ports/security/py-fail2ban/ 
# make install clean

安装完成后,需要启用服务以实现开机自动启动。

  • 启用 fail2ban 服务,实现开机自动启动:

# service fail2ban enable

查看 Fail2Ban 安装后说明

安装完成后,可通过以下命令查看软件包提供的配置说明。

# pkg info -D security/py-fail2ban
py311-fail2ban-1.1.0_1:
On install:
Please do not edit the fail2ban.conf, jail.conf, or any other
files in the distribution as they will be overwritten upon each
upgrade of the port. Instead, create new files named *.local e.g.
fail2ban.local or jail.local.
# 请不要直接修改 fail2ban.conf、jail.conf 或其他官方提供的配置文件
# 因为它们在每次升级软件包时会被覆盖
# 应该创建 *.local 文件,如 fail2ban.local 或 jail.local,来自定义配置。

For more information, see the official manual:
http://www.fail2ban.org/wiki/index.php/MANUAL_0_8#Configuration
# 更多信息可参见官方手册。

If you have custom filters or actions and you are upgrading from
0.9.x please check them.
# 如果你定义了自定义过滤器或操作,且从 0.9.x 升级而来,请检查其兼容性。

Users of pf: please read the notes in action.d/pf.conf and the
discussion at https://github.com/fail2ban/fail2ban/pull/1925
# 使用 pf 防火墙的用户请阅读 action.d/pf.conf 中的注释,
# 以及上面 GitHub 讨论链接中的相关说明。

Please note that fail2ban will put curly braces '{}' around the
ports in the action so you shouldn't do it yourself.
# 注意:fail2ban 会自动在动作命令中将端口号用大括号 {} 包裹,
# 因此你自己不需要再加。

Fail2Ban 配置解释

注意

此处的 jail 不是 BSD 系统中的 jail(一种容器)。这里的 jail 指的是“封禁”的含义。

配置示例位于 /usr/local/etc/fail2ban/jail.conf(勿直接编辑,参见上文),下文仅列出本书所需内容:

  • ① 列出 Fail2Ban 的过滤器选项:

需要注意,以 bsd- 开头的文件(如 bsd-sshd.conf)是 FreeBSD Port 维护者打的补丁,但在本文中不能使用,应直接使用 sshd.conf

  • ② 查看 Fail2Ban 支持的防火墙:

Fail2Ban 封禁配置

创建并编辑文件 /usr/local/etc/fail2ban/jail.d/sshd.conf,写入如下内容:

配置解释:

  • 白名单,表示不会被封禁的 IP 段。192.168.0.0/24 表示从 192.168.0.0192.168.0.254

  • bsd-ipfw 是示例防火墙,读者可自选,参见下文。

警告

若使用 IPFW 防火墙,必须选择 bsd-ipfw,而不能使用 ipfw,否则无法生效。

配置防火墙

完成上述配置后,即可启动 Fail2Ban 服务。

启动 Fail2Ban 服务:

IPFW

IPFW 是 FreeBSD 自带的防火墙,其配置如下。

Fail2Ban 配置同上。

配置自启服务

启用防火墙,实现开机自动启动:

警告

请勿立即执行 start 命令,否则可能导致无法通过 SSH 连接。

修改 IPFW 默认规则

IPFW 规则的默认策略是“默认拒绝”,可将其修改为“默认允许”:

  • 显示当前 IPFW 防火墙规则列表:

参考文献

PF

PF(Packet Filter,包过滤器)是源自 OpenBSD 的防火墙,其配置如下。

Fail2Ban 配置文件

将上方配置文件 /usr/local/etc/fail2ban/jail.d/sshd.confaction=bsd-ipfw 改为 action=pf[port={22 23}, name=ssh],其他不需要改。

修改 PF 配置文件

需要先准备 PF 的配置文件,具体步骤如下。

  • 将示例 PF 配置文件复制到 /etc 目录以便修改和使用,否则 PF 无法启动。

  • 编辑 /etc/pf.conf,写入:

  • em0:示例中的 em0 为笔者的网卡名称,请根据实际网卡修改,可使用命令 ifconfig 查看。

服务

PF 服务的启动和配置如下。

参考文献

IPFILTER (IPF)

IPFILTER(IPF)是一款开源防火墙,其配置如下。

Fail2Ban 配置文件

将上方配置文件 /usr/local/etc/fail2ban/jail.d/sshd.confaction=bsd-ipfw 改为 action=ipfilter,其他不需要改。

服务

IPF 服务的配置和启动如下。

复制示例文件作为默认配置规则集文件,否则 ipfilter 启动后会没有规则。示例文件自带的规则不影响使用。

  • 配置守护进程:

完成上述步骤后,Fail2Ban 即可正常使用。终于不用再配置了,默认就可以用

测试效果

配置完成后,可以通过以下步骤测试 Fail2Ban 的效果。

  • 为了查看效果,使用 Fail2Ban 客户端将 IP 192.168.179.1 在 sshd 监控下加入封禁列表

  • TTY 输出

已建立的 SSH 连接也会被强制断开。

查看状态

可以通过以下命令查看 Fail2Ban 的运行状态。

查看 fail2ban 对 sshd 监控的状态,包括被封禁的 IP 列表:

解禁 IP

若需解除对特定 IP 的封禁,可执行以下操作。

从 sshd 监控中解除对指定 IP 的封禁:

故障排除与未竟事宜

若遇到问题,可通过查看日志文件进行排查。

  • Fail2Ban 的日志文件位于 /var/log/fail2ban.log 文件。

最后更新于