如何在 CentOS 8 和 Fedora 33 上安装和配置 Fail2Ban
本教程适用于这些操作系统版本
- 中央操作系统 8
- 中央操作系统 7
在此页
- 先决条件
- 安装 Fail2Ban
- 配置 Fail2Ban
- 配置jail.local
- 更多设置
- 白名单 IP
- 禁止时间和重试次数
- 电子邮件提醒
- SSHD 监狱
- Nginx 监狱
Fail2Ban 是一个日志解析实用程序,它扫描各种进程的日志文件并禁止密码失败次数过多的 IP 地址。当尝试登录时,Fail2Ban 将向 iptables 添加新规则以暂时或永久阻止攻击者的 IP 地址。它还可以通过电子邮件提醒您。
它主要专注于通过 SSH 检测入侵,但它可以配置为与任何使用日志文件的服务一起使用。
先决条件
-
A Fedora 33 or a CentOS 8 based server with a non-root user with sudo privileges.
-
Install Nano editor because that's what we will use.
$ sudo dnf install nano -y
安装 Fail2Ban
要在 CentOS 8 上安装 Fail2Ban,您需要先安装 EPEL Yum 存储库。
$ sudo dnf install epel-release
Fedora 33 附带 Fail2Ban。
运行以下命令在 Fedora 33 和 CentOS 8 上安装 Fail2Ban。
$ sudo dnf install fail2ban
安装后,我们需要启用该服务。
$ sudo systemctl enable fail2ban
接下来,启动 fail2ban 服务。
$ sudo systemctl start fail2ban
您现在可以检查服务的状态,看它是否正常工作。
$ sudo systemctl status fail2ban ? fail2ban.service - Fail2Ban Service Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; enabled; vendor preset: disabled) Active: active (running) since Mon 2020-11-02 21:15:59 UTC; 5s ago Docs: man:fail2ban(1) Process: 19031 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS) Main PID: 19032 (f2b/server) Tasks: 3 (limit: 1125) Memory: 11.0M CPU: 96ms CGroup: /system.slice/fail2ban.service ??19032 /usr/bin/python3 -s /usr/bin/fail2ban-server -xf start Nov 02 21:15:59 howtoforge-tutorial systemd[1]: Starting Fail2Ban Service... Nov 02 21:15:59 howtoforge-tutorial systemd[1]: Started Fail2Ban Service. Nov 02 21:15:59 howtoforge-tutorial fail2ban-server[19032]: Server ready
配置 Fail2Ban
Fail2Ban 服务将其配置文件保存在
/etc/fail2ban
目录中。您会在其中遇到一个文件jail.conf
。该文件通常在软件包升级期间被覆盖,因此不应对其进行编辑。相反,所有配置都应该在一个我们称之为
jail.local
的新文件中完成。这两个文件中的设置可以通过/etc/fail2ban/jail.d/
目录中的文件进一步覆盖。配置按以下顺序应用:
<开始>
/etc/fail2ban/jail.conf
etc/fail2ban/jail.d/*.conf
,按字母顺序/etc/fail2ban/jail.local
/etc/fail2ban/jail.d/*.local
,按字母顺序
jail.conf
包含一个 [DEFAULT]
部分,后面是各个服务的部分。这些部分中的任何部分都可以通过在 .local
文件中定义来覆盖。
配置jail.local
我们将创建一个新的 jail.local
文件。
$ sudo nano /etc/fail2ban/jail.local
将以下代码粘贴到其中。
[DEFAULT]
# Ban hosts for one hour:
bantime = 3600
# Override backend=auto in /etc/fail2ban/jail.conf
backend = systemd
[sshd]
enabled = true
按 Ctrl + X 关闭编辑器,并在提示保存文件时按 Y。这将为所有服务设置一个新的默认 bantime
,将后端更改为 systemd
并启用 \sshd
jail。
重新启动 Fail2ban 以实施新更改。
$ sudo systemctl restart fail2ban
我们可以使用 fail2ban-client
实用程序确认新应用的设置。
$ sudo fail2ban-client status
Status
|- Number of jail: 1
`- Jail list: sshd
我们也可以通过以下方式具体获取各个jail的详细状态。
$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:
更多设置
jail.conf
提供了更多可以使用 /jail.local
文件自定义的设置。接下来我们将检查一些设置。
白名单IP
您可以使用以下代码将 IP 列入白名单/忽略被 Fail2ban 阻止的 IP。
[DEFAULT]
ignoreip = 127.0.0.1/8 123.45.67.89
如果你只想将某些监狱的 IP 列入白名单,你可以通过 fail2ban-client
来实现。
$ sudo fail2ban-client set JAIL addignoreip 123.45.67.89
将上述命令中的 JAIL
替换为您要为其编辑设置的监狱名称。
禁止时间和重试次数
有 3 个设置可以设置禁令的时间和重试次数。
bantime
- 是 IP 被禁止的时间长度(以秒为单位)。要设置永久禁止,请将此值设置为负数。默认值为 10 分钟或 600 秒。
findtime
- 是在设置禁令之前登录尝试之间的时间长度。该值始终为秒数。例如,如果 Fail2ban 设置为在 5 次登录尝试失败后禁止 IP,则这 5 次尝试必须在设置的 10 分钟 bantime
限制内发生。
maxretry
- 是在实施禁令之前从单个 IP 地址重试的次数。默认值为 3。
要自定义这些设置,请将以下行粘贴到 [DEFAULT]
部分下的 tc ail2ban\jail.local
文件中。
bantime = 3600
findtime = 300
maxretry = 4
电子邮件提醒
要发送电子邮件提醒,您需要先安装邮件传输代理 (MTA)。出于我们的目的,我们将安装 sendmail
。
$ sudo dnf install sendmail
要接收电子邮件,请在 [DEFAULT]
部分下的 tc ail2ban\jail.local
文件中添加以下代码。
destemail =
sendername = Fail2Ban
mta = sendmail
action = %(action_mw)s
destemail
指的是目标电子邮件 ID,这是您要在其中接收邮件的 ID,sendername
指的是发件人的姓名,因此我们为此使用 Fail2Ban。 mta
是指正在使用的邮件传输代理,这里是sendmail
。如果您使用的是 Postfix
,则为 mta
变量使用值 mail
。
action
是指一旦检测到入侵就会执行的默认操作。默认值是 %(action_)s
,它只禁止用户。 %(action_mw)s
将禁止并发送带有 Whois 报告的电子邮件;而 %(action_mwl)s
将禁止并发送一封电子邮件,其中包含 Whois 报告以及相关日志文件中的信息。这也可以在特定于监狱的基础上进行更改。
个别监狱的设置
正如我们已经知道的,[DEFAULT]
部分适用于所有 Jail,是时候研究一些特定的 Jail 及其设置了。
SSHD监狱
我们之前已经在 jail.local
文件中定义了 [sshd]
。我们可以通过以下代码对其进行更多自定义。
[sshd]
enabled = true
port = ssh
logpath = %(ssh_log)s
在这种情况下,我们使用预定义变量 ssh
作为默认 SSH 端口的端口。如果您使用不同的 SSH 端口,您应该更改它。 logpath
是指要监视的日志文件的位置。 %(ssh_log)s
使用 Fail2bans 标准配置文件 (/etc/fail2ban/paths-common.conf
) 中定义的值。
Nginx 监狱
Nginx 有几个 Jails 可以在 Fail2Ban 中使用。例如,如果您站点的密码保护部分反复受到攻击,您可以使用 jail.local
文件中的 [nginx-http-auth]
部分。
[nginx-http-auth]
enabled = true
我们还可以添加一个名为 [nginx-botsearch]
的部分来停止对不存在的文件夹或位置的请求。
[nginx-badbots]
enabled = true
还有其他 Nginx 监狱,但它们没有预先配置 Fail2Ban。它们需要手动创建,其中大部分可以基于 Fail2Ban 附带的 Apache。
Fail2Ban 过滤器和 Failregex
Fail2Ban 配置中还有另一个设置称为过滤器。过滤器决定日志文件中的一行是否表示身份验证失败。
配置文件中的过滤器值是对位于 /etc/fail2ban/filter.d
目录中的文件的引用,其 .conf
扩展名已删除。
您可以通过检查目录来查看可用的过滤器类型。
$ ls /etc/fail2ban/filter.d
您将在其中看到 2 个 Nginx 日志文件; nginx-badbots.conf
和 nginx-http-auth.conf
。
这些配置文件使用正则表达式(regex)来解析日志文件。这些被称为 Failregex。您可以通过编写自己的正则表达式来自定义或创建新的过滤器。我们不会深入介绍这些正则表达式,因为它们超出了本教程的范围。
监控 Fail2Ban 日志和防火墙
如前所述,您可以使用 systemctl
检查 Fail2Ban 的状态。
$ sudo systemctl status fail2ban
要获得更多细节,您可以使用 journalctl
命令。
$ sudo journalctl -b -u fail2ban
您还可以使用 fail2ban-client
查询 fail2ban-server
或个人监狱的状态。
$ sudo fail2ban-client status
$ sudo fail2ban-client status jail_name
您还可以查询 Fail2bans 日志文件。
$ sudo tail -F /var/log/fail2ban.log
您可以列出当前为 iptables 配置的规则。
$ sudo iptables -L
您还可以以反映启用这些规则所需的命令的格式列出 iptables 规则。
$ sudo iptables -S
结论
我们关于在基于 Fedora 33 或 CentOS 8 的服务器上安装和配置 Fail2Ban 的教程到此结束。如果您有任何问题,请在下面的评论中发表。