Fail2ban 扫描日志文件,例如 /var/log/httpd/error_log,并封禁表现出恶意迹象的 IP,包括过多身份验证尝试、漏洞扫描等。它通常通过更新防火墙规则,在指定时间内拒绝这些 IP,也可以配置任意其他动作,例如发送邮件。
警告:IP 封禁软件可以阻止简单攻击,但依赖额外守护进程,以及成功记录日志。
如果 sshd 仅启用公钥或类似身份验证,通常没有必要再配合 Fail2ban。
它也不能代替 VPN。没有必要时,不要将服务暴露到互联网。
此外,如果攻击者知道你的 IP,可以发送伪造源地址的数据包,让你的 IP 被封禁。务必在 ignoreip 中指定自己的 IP。
安装
安装 fail2ban 软件包。
使用
配置 Fail2ban,然后启用并启动 fail2ban.service。
fail2ban-client
fail2ban-client 可用于监控 jail,包括重新加载、重启、查看状态等。查看全部命令:
$ fail2ban-client
查看所有已启用的 jail:
# fail2ban-client status
检查某个 jail,例如 sshd 的状态:
# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 1
| |- Total failed: 9
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: 0.0.0.0
以紧凑形式显示全部 jail,包括已封禁 IP:
# fail2ban-client banned
[{'sshd': ['192.168.100.50']}, {'apache-auth': []}]
配置
原文注明:本节仍待扩充,需要补充 dbpurgeage 的说明,相关讨论位于 ArchWiki 的 Fail2ban 讨论页。
升级时,/etc/fail2ban/jail.conf 可能产生 Pacnew 或 Pacsave 文件。因此,jail.conf(5) 的配置文件格式章节建议用户创建 /etc/fail2ban/jail.local,以简化升级。
例如,将默认封禁时间改为一天,在 /etc/fail2ban/jail.local 中写入:
[DEFAULT]
bantime = 1d
也可以在 /etc/fail2ban/jail.d 下创建独立的 name.local 文件,例如 /etc/fail2ban/jail.d/sshd.local。
重新加载 fail2ban.service,应用配置更改。
启用 jail
所有 jail 默认都被禁用。在希望使用的 jail 中加入 enabled = true。例如,要启用 OpenSSH jail,在 /etc/fail2ban/jail.local 中加入:
[sshd]
enabled = true
也可参阅后面的“自定义 SSH jail”。
接收告警邮件
如果希望在有人被封禁时收到邮件,需要配置 SMTP 客户端,例如 msmtp,并按下面的方式修改默认动作。文件为 /etc/fail2ban/jail.local:
[DEFAULT]
destemail = yourname@example.com
sender = yourname@example.com
# to ban & send an e-mail with whois report to the destemail.
action = %(action_mw)s
# same as action_mw but also send relevant log lines
#action = %(action_mwl)s
防火墙与服务
Fail2ban 默认使用 iptables。大多数其他防火墙与服务的配置也很直接。例如,使用 nftables 时,在 /etc/fail2ban/jail.local 中配置:
[DEFAULT]
banaction = nftables
banaction_allports = nftables[type=allports]
其他示例见 /etc/fail2ban/action.d/,例如 ufw.conf。
技巧
自定义 SSH jail
警告:攻击者如果知道你的 IP,就可以伪造源地址,让你的 IP 被锁在服务器之外。SSH 密钥可以优雅解决暴力破解问题,并避免这种封禁机制带来的问题。
编辑 /etc/fail2ban/jail.d/sshd.local,加入以下内容,并在 ignoreip 中更新可信 IP 列表:
[sshd]
enabled = true
filter = sshd
banaction = iptables
backend = systemd
maxretry = 5
findtime = 1d
bantime = 2w
ignoreip = 127.0.0.1/8 ::1
注意:可能需要在 /etc/ssh/sshd_config 中设置 LogLevel VERBOSE,才能让 Fail2ban 完整监控,否则密码失败可能无法正确记入日志。
Fail2ban 从 0.10 起支持 IPv6。请相应配置防火墙,例如启动并启用 ip6tables.service。
使用日志命名空间时,即在单元文件中加入 LogNamespace=something,可以这样设置后端,让 Fail2ban 读取对应日志:backend = systemd[journalfiles="/var/log/journal/*.something/system.journal"]。
提示:使用 ufw 等 iptables 前端时,可以设置 banaction = ufw。
使用 Shorewall 时,可以设置 banaction = shorewall,并在 /etc/shorewall/shorewall.conf 中将 BLACKLIST 设为 ALL。否则,封禁 IP 的规则只会影响新连接。
systemd 后端:journald 筛选
使用 systemd 后端时,可以配置带 journalmatch 的筛选器以提升性能。例如,只解析内核级日志,在 /etc/fail2ban/filter.d/fwdrop.local 中写入:
[Definition]
failregex = ^.*DROP_.*SRC=<ADDR> DST=.*$
journalmatch = _TRANSPORT=kernel
另请参阅 systemd.journal-fields(7)。
服务加固
目前 Fail2ban 必须以 root 运行,因此可以考虑通过 systemd 加固进程。
为 fail2ban.service 创建覆盖配置 /etc/systemd/system/fail2ban.service.d/override.conf:
[Service]
PrivateDevices=yes
PrivateTmp=yes
ProtectHome=read-only
ProtectSystem=strict
ReadWritePaths=-/var/run/fail2ban
ReadWritePaths=-/var/lib/fail2ban
ReadWritePaths=-/var/log/fail2ban.log
ReadWritePaths=-/var/spool/postfix/maildrop
ReadWritePaths=-/run/xtables.lock
CapabilityBoundingSet=CAP_AUDIT_READ CAP_DAC_READ_SEARCH CAP_NET_ADMIN CAP_NET_RAW
CapabilityBoundingSet 中的 CAP_DAC_READ_SEARCH 允许 Fail2ban 读取全部目录和文件;CAP_NET_ADMIN 与 CAP_NET_RAW 允许它操作具有命令行界面的防火墙。详情见 capabilities(7)。
ProtectSystem=strict 将文件系统层级设为只读,ReadWritePaths 则为 Fail2ban 开放所需路径的写入权限。
最后执行 daemon-reload 让单元更改生效,并重启 fail2ban.service。
另请参阅
原文提供以下延伸资源:使用 Fail2Ban jail 将用户加入白名单、优化 Fail2Ban 筛选器、Fail2Ban 与 sendmail、Fail2Ban 与 iptables、Fail2Ban 0.8.3 教程,以及监控 Fail2ban 日志。相关链接保留在原文页面。
原文:Fail2ban。作者/维护方:ArchWiki 贡献者。本文为中文翻译,代码及命令保留原文。
除非另有说明,原文内容按 GNU Free Documentation License 1.3 或更新版本提供。











暂无评论内容