网站搜索

如何在 Linux 上安装和配置 Fail2ban


Fail2ban 是一款免费的开源软件,我们可以使用它来缓解暴力破解和 DoS/DDoS 攻击:它会扫描日志文件以查找多次失败的身份验证尝试,并通过创建临时防火墙规则来禁止相关的 IP 地址。

在本教程中,我们将了解如何在 Linux 上安装和配置 fail2ban,并学习其用法背后的基本概念。

在本教程中,您将学习:

  • 如何在一些最常用的 Linux 发行版上安装 Fail2ban
  • 如何配置 Fail2ban
  • 如何使用 fail2ban-client 实用程序

安装

Fail2ban 在所有最常用的 Linux 发行版的官方存储库中都可用。要在基于 Debian 和 Debian 的发行版上安装它,我们可以使用以下命令:

sudo apt install fail2ban


在 Fedora 上,我们使用 dnf 包管理器执行安装:

sudo dnf install fail2ban

在我们可以在 RHEL 或其克隆之一(如 Rocky Linux)上执行安装之前,我们需要添加 EPEL 存储库(Enterprise Linux 的额外软件包)作为软件源。对于 Rocky 来说,这是一个非常简单的作,因为仓库是在我们安装 epel-release 包时自动配置的:

sudo dnf install epel-release

如果采用 RHEL 本身,则可以从 EPEL 站点下载并安装该软件包。

为了确保 fail2ban 服务处于活动状态并在启动时启动,我们启动以下命令:

sudo systemctl enable --now fail2ban

Fail2ban 配置

安装 Fail2ban 软件包后,其所有配置文件都可以在 /etc/fail2ban 目录下找到。我们应该避免修改安装过程中的文件(扩展名为 “.conf” 的文件),而是将自定义配置放在扩展名为 “.local” 的相应文件中。主要的 fail2ban 配置文件是 /etc/fail2ban/fail2ban.conf。此文件包含通用设置,例如 fail2ban loglevel。我们将 override 值放在 /etc/fail2ban/fail2ban.local 文件中,如果它不存在,则应创建该文件。例如,要将日志级别从“INFO”(默认)更改为“DEBUG”,我们可以编写:

[DEFAULT]
loglevel = DEBUG


在使用 Fail2ban 时,我们必须处理三个主要的 “实体 ”:过滤器、作和监狱。让我们来看看它们。

过滤 器

Fail2ban 扫描日志文件并搜索失败的身份验证尝试。通过过滤器,我们基本上告诉它如何识别特定服务的日志文件中的身份验证尝试。现成的过滤器可以在 /etc/fail2ban/filter.d 目录下找到:

ls /etc/fail2ban/filter.d

3proxy.conf                domino-smtp.conf        mysqld-auth.conf        selinux-ssh.conf
apache-auth.conf           dovecot.conf            nagios.conf             sendmail-auth.conf
apache-badbots.conf        dropbear.conf           named-refused.conf      sendmail-reject.conf
apache-botsearch.conf      drupal-auth.conf        nginx-botsearch.conf    sieve.conf
apache-common.conf         ejabberd-auth.conf      nginx-http-auth.conf    slapd.conf
apache-fakegooglebot.conf  exim-common.conf        nginx-limit-req.conf    softethervpn.conf
apache-modsecurity.conf    exim.conf               nsd.conf                sogo-auth.conf
apache-nohome.conf         exim-spam.conf          openhab.conf            solid-pop3d.conf
apache-noscript.conf       freeswitch.conf         openwebmail.conf        squid.conf
apache-overflows.conf      froxlor-auth.conf       oracleims.conf          squirrelmail.conf
apache-pass.conf           gitlab.conf             pam-generic.conf        sshd.conf
apache-shellshock.conf     grafana.conf            perdition.conf          stunnel.conf
assp.conf                  groupoffice.conf        phpmyadmin-syslog.conf  suhosin.conf
asterisk.conf              gssftpd.conf            php-url-fopen.conf      tine20.conf
bitwarden.conf             guacamole.conf          portsentry.conf         traefik-auth.conf
botsearch-common.conf      haproxy-http-auth.conf  postfix.conf            uwimap-auth.conf
centreon.conf              horde.conf              proftpd.conf            vsftpd.conf
common.conf                ignorecommands          pure-ftpd.conf          webmin-auth.conf
counter-strike.conf        kerio.conf              qmail.conf              wuftpd.conf
courier-auth.conf          lighttpd-auth.conf      recidive.conf           xinetd-fail.conf
courier-smtp.conf          mongodb-auth.conf       roundcube-auth.conf     znc-adminlog.conf
cyrus-imap.conf            monit.conf              screensharingd.conf     zoneminder.conf
directadmin.conf           murmur.conf             selinux-common.conf

行动

Fail2ban作在 /etc/fail2ban/action.d 目录中定义。作以用于执行禁令的软件命名。让我们看一个例子。UFW(Uncomplicated Firewall)是一个旨在易于使用的防火墙管理器;以下是 /etc/fail2ban/action.d/ufw.conf 文件的内容:

Fail2Ban action configuration file for ufw
#
You are required to run "ufw enable" before this will have any effect.
#
The insert position should be appropriate to block the required traffic.
A number after an allow rule to the application won't be of much use.

[Definition]

actionstart = 

actionstop = 

actioncheck = 

actionban = [ -n "<application>" ] && app="app <application>"
            ufw insert   from  to  $app

actionunban = [ -n "<application>" ] && app="app <application>"
              ufw delete  from  to  $app

[Init]
Option: insertpos
Notes.:  The position number in the firewall list to insert the block rule
insertpos = 1

Option: blocktype
Notes.: reject or deny
blocktype = reject

Option: destination
Notes.: The destination address to block in the ufw rule
destination = any

Option: application
Notes.: application from sudo ufw app list
application = 

作由两个主要部分组成:“定义”和“初始化”。前者中指定的命令在不同的情况下执行:作为预备步骤 (actioncheck)、监狱开始时 (actionstart)、监狱停止时 (actionstop)、禁止 (actionban) 和解禁 (actionunban) IP 地址。



“Init ”部分包含特定于作的配置。例如,在我们上面报告的 ufw作中,您可以看到它包含有关规则列表中防火墙规则位置 (insertpos=1) 和要使用的阻止类型 (reject vs deny) 的说明。

监狱

最后,我们有监狱。jail 基本上将一个 filter 和一个或多个 action 关联起来。Fail2ban 用于 jails 的主配置文件是 /etc/fail2ban/jail.conf;插入式配置文件可以放在 /etc/fail2ban/jail.d 目录中。

监狱以它们使用的过滤器命名:例如,如果监狱名为 “sshd ”,则它与 /etc/fail2ban/filter.d/sshd.conf 过滤器相关联,除非通过 “filter ” 选项明确指定一个过滤器。jail 的名称在方括号之间指定。Debian 默认为 sshd jail 提供覆盖。它在 /etc/fail2ban/jail.d/defaults-debian.conf 文件中定义:

[sshd]
enabled = true

“sshd ” jail 的默认参数在主 jail 配置文件中。Debian 提供此覆盖时,将 “enabled ” 参数设置为 “true ”,以确保 jail 处于活动状态。以下是一些可以在定义 jail 时使用的参数,或者在 “default ” 部分使用(对所有现有 jails 有效):

选择角色默认值
滤波器监狱使用的过滤器/etc/fail2ban/filter.d 下的 jail 名称对应的过滤器
日志路径指定要监控的日志文件的路径服务依赖型
行动监狱要使用的作。作以定义它们的文件命名,不带扩展名%(action)s – 见下文
忽略IP要忽略的 IP 地址列表没有
班泰以秒为单位或带有明确时间后缀的封禁持续时间10 分钟
查找时间要禁止 IP 的 IP 必须达到指定数量的身份验证尝试失败的时间间隔10 分钟
最大重试在指定的 findtime 内必须发生的失败次数才能触发禁令5

如何定义默认作

如果你看一下 jail 的主配置文件 (/etc/fail2ban/jail.conf),在 “default” 部分,你可以看到作是按以下方式定义的(第 268 行):

action = %(action_)s

在上面的定义中,_action变量是 “expanded ”,其值被分配给 “action ” 参数。_action 变量本身在上面几行定义(Debian 上为第 212 行):

action_ = __ %(banaction)s[port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]

在此表达式中,使用了其他一些变量:

  • banaction:这是 “core ” ban作,默认设置为 iptables-multiport
  • port:要禁止的端口 – 默认设置为 0:65535,在特定 jail 中被覆盖
  • protocol:防火墙规则中用于实施禁令的协议 – 默认为 TCP
  • chain:应在需要此参数的 ban作中添加跳转的链

port、protocol 和 chain 变量用在方括号之间,用逗号分隔。使用此语法,它们作为 “arguments ” 传递,并替换作定义中包含的相应占位符。这里, “action_ ” 是可用的宏之一,它只是强制执行禁令。其他 API 在其下方定义。一些示例包括:

  • action_mw – 强制执行禁令并向指定邮件发送包含 whois 报告的电子邮件
  • action_mwl – 同上,但包含相关的日志行

让我们被禁止吧!

让我们验证一下 fail2ban 是否正常工作,并让它触发封禁。正如我们之前看到的,默认 findtime 是 10 分钟,默认 maxretry 值是 5:这意味着如果我们在 10 分钟内 5 次身份验证尝试失败,我们的 IP(在本例中为 192.168.122.1)将被禁止。



我尝试通过 SSH 连接到 IP 为 192.168.122.93 的主机,故意提供错误的密码。这将触发对远程主机的禁令。我们可以通过查看 fail2ban 日志来验证这一点:

sudo tail /var/log/fail2ban.log

相关行是:

2023-09-27 15:54:47,028 fail2ban.actions
[2829]: NOTICE [sshd] Ban 192.168.122.1

可以看到,192.168.122.1 这个 IP 地址已经被封禁了。检查所有活动禁令的更便捷方法是使用 fail2ban-client 实用程序。要获取被禁 IP 的列表,我们将其与 “banned ” 子命令一起使用:

fail2ban-client banned
[{'sshd': ['192.168.122.1']}]

要解禁一个 IP(来自所有 jail),我们将其作为参数传递给 unban 子命令:

sudo fail2ban-client unban 192.168.122.1

fail2ban-client 实用程序还可用于控制服务器(启动、停止、重新加载它)和执行一些运行时配置。

结论

相关文章: