如何在 CentOS 7 上使用 Fail2Ban 保护 SSH如何在 CentOS 7 上使用 Fail2Ban 保护 SSH如何在 CentOS 7 上使用 Fail2Ban 保护 SSH如何在 CentOS 7 上使用 Fail2Ban 保护 SSH
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

如何在 CentOS 7 上使用 Fail2Ban 保护 SSH

介绍

虽然通过 SSH 连接到您的服务器非常安全,但 SSH 守护程序本身是一项必须暴露在 Internet 上才能正常运行的服务。这带来了一些固有的风险,并为潜在的攻击者提供了攻击媒介。

任何暴露于网络的服务都是这种方式的潜在目标。如果您注意这些服务的应用程序日志,您会经常看到重复的、系统的登录尝试,这些尝试代表用户和类似机器人的暴力攻击。

名为 Fail2ban 的服务可以通过创建规则来缓解此问题,这些规则会根据预定义的不成功登录尝试次数自动更改您的 iptables 防火墙配置。这将允许您的服务器响应非法访问尝试而无需您的干预。

在本指南中,我们将介绍如何在 CentOS 7 服务器上安装和使用 Fail2ban。

在 CentOS 7 上安装 Fail2ban

虽然 Fail2ban 在官方 CentOS 软件包存储库中不可用,但它是为 EPEL 项目打包的。 EPEL,代表 Extra Packages for Enterprise Linux,可以与 CentOS 提供的发行包一起安装:

  1. sudo yum install epel-release

系统将提示您继续 - 按 y,然后按 Enter:

yum prompt
Transaction Summary ============================================================================ Install 1 Package Total download size: 14 k Installed size: 24 k Is this ok [y/d/N]: y

现在我们应该能够安装 fail2ban 包:

  1. sudo yum install fail2ban

再次,在系统提示继续时按 y 和 Enter。

安装完成后,使用 systemctl 启用 fail2ban 服务:

  1. sudo systemctl enable fail2ban

配置本地设置

Fail2ban 服务将其配置文件保存在 /etc/fail2ban 目录中。在那里,您可以找到一个名为 jail.conf 的具有默认值的文件。由于这个文件可能会被包升级覆盖,我们不应该就地编辑它。相反,我们将编写一个名为 jail.local 的新文件。 jail.local 中定义的任何值都将覆盖 jail.conf 中的值。

jail.conf 包含一个 [DEFAULT] 部分,后面是各个服务的部分。 jail.local 可以覆盖这些值中的任何一个。此外,/etc/fail2ban/jail.d/ 中的文件可用于覆盖这两个文件中的设置。文件按以下顺序应用:

  1. /etc/fail2ban/jail.conf
  2. /etc/fail2ban/jail.d/*.conf,按字母顺序
  3. /etc/fail2ban/jail.local
  4. /etc/fail2ban/jail.d/*.local,按字母顺序

任何文件都可能包含一个 [DEFAULT] 部分,首先执行,也可能包含个别监狱的部分。为给定参数设置的最后一个 vavalue 优先。

让我们从编写一个非常简单的 jail.local 版本开始。使用 nano(或您选择的编辑器)打开一个新文件:

  1. sudo nano /etc/fail2ban/jail.local

粘贴以下内容:

[DEFAULT]
# Ban hosts for one hour:
bantime = 3600

# Override /etc/fail2ban/jail.d/00-firewalld.conf:
banaction = iptables-multiport

[sshd]
enabled = true

这将覆盖三个设置:它为所有服务设置一个新的默认 bantime,确保我们使用 iptables 进行防火墙配置,并启用 sshd 监狱。

退出并保存新文件(在 nano 中,按 Ctrl-X 退出,按 y 保存,按 Enter 确认文件名)。现在我们可以使用 systemctl 重启 fail2ban 服务:

  1. sudo systemctl restart fail2ban

systemctl 命令应该在没有任何输出的情况下完成。为了检查服务是否正在运行,我们可以使用fail2ban-client:

  1. sudo fail2ban-client status
Output
Status |- Number of jail: 1 `- Jail list: sshd

您还可以获得有关特定监狱的更多详细信息:

  1. sudo fail2ban-client status sshd

探索可用设置

我们上面定义的 jail.local 版本是一个好的开始,但您可能需要调整一些其他设置。打开 jail.conf,我们将检查一些默认设置。如果您决定更改这些值中的任何一个,请记住应将它们复制到 jail.local 的适当部分并在那里进行调整,而不是就地修改。

  1. sudo nano /etc/fail2ban/jail.conf

所有监狱的默认设置

首先,滚动浏览 [DEFAULT] 部分。

ignoreip = 127.0.0.1/8

您可以通过向 ignoreip 参数添加值来调整 Fail2ban 忽略的源地址。目前,它被配置为不禁止来自本地机器的任何流量。您可以将要忽略的其他地址附加到参数的末尾,以空格分隔。

bantime = 600

bantime 参数设置客户端在未能正确验证时将被禁止的时间长度。这是以秒为单位测量的。默认情况下,这设置为 600 秒或 10 分钟。

findtime = 600
maxretry = 3

您要注意的下两个参数是 findtime 和 maxretry。这些共同确定了应禁止客户的条件。

maxretry 变量设置客户端在被禁止之前必须在 findtime 定义的时间窗口内进行身份验证的尝试次数。使用默认设置,Fail2ban 将禁止在 10 分钟窗口内 3 次尝试登录失败的客户端。

destemail = root@localhost
sendername = Fail2Ban
mta = sendmail

如果您希望配置电子邮件警报,您可能需要覆盖 destemail、sendername 和 mta 设置。 destemail 参数设置应该接收禁止消息的电子邮件地址。 sendername 设置电子邮件中“From”字段的值。mta 参数配置将使用什么邮件服务来发送邮件。

action = $(action_)s

此参数配置 Fail2ban 在要实施禁令时采取的操作。值 action_ 在此参数之前的文件中定义。默认操作是简单地将防火墙配置为拒绝来自违规主机的流量,直到禁止时间结束。

如果您想配置电子邮件警报,您可以将此值从 action_ 覆盖为 action_mw。如果您希望电子邮件包含相关的日志行,您可以将其更改为 action_mwl。如果您选择使用邮件提醒,您需要确保配置了适当的邮件设置。

个别监狱的设置

在 [DEFAULT] 之后,我们将遇到为不同服务配置单独监狱的部分。这些通常包括要禁止的 port 和用于监视恶意访问尝试的 logpath。例如,我们已经在 jail.local 中启用的 SSH jail 具有以下设置:

[sshd]

port    = ssh
logpath = %(sshd_log)s

在这种情况下,ssh 是标准 SSH 端口的预定义变量,%(sshd_log)s 使用 Fail2ban 标准配置中别处定义的值(这有助于保持jail.conf 可在不同操作系统之间移植)。

您可能会遇到的另一个设置是 filter,它将用于决定日志中的一行是否表示身份验证失败。

filter 值实际上是对位于 /etc/fail2ban/filter.d 目录中的文件的引用,其 .conf 扩展名已删除.该文件包含确定日志中的一行是否错误的正则表达式。我们不会在本指南中深入介绍这个文件,因为它相当复杂并且预定义的设置与适当的行匹配得很好。

但是,您可以通过查看该目录来了解可用的过滤器类型:

  1. ls /etc/fail2ban/filter.d

如果您看到一个看起来与您正在使用的服务相关的文件,您应该使用文本编辑器打开它。大多数文件都有很好的注释,您应该能够分辨出脚本旨在防止哪种类型的情况。大多数这些过滤器在 jail.conf 中都有适当的(禁用的)部分,如果需要,我们可以在 jail.local 中启用它们。

例如,假装我们正在使用 Nginx 为网站提供服务,并意识到我们网站的受密码保护的部分因登录尝试而受到冲击。我们可以告诉 Fail2ban 使用 nginx-http-auth.conf 文件来检查 /var/log/nginx/error.log 文件中的这种情况。

这实际上已经在我们的 /etc/fail2ban/jail.conf 文件中名为 [nginx-http-auth] 的部分中进行了设置。我们只需要为 nginx-http-auth jail 添加一个 enabled 参数到 jail.local:

[DEFAULT]
# Ban hosts for one hour:
bantime = 3600

# Override /etc/fail2ban/jail.d/00-firewalld.conf:
banaction = iptables-multiport

[sshd]
enabled = true

[nginx-http-auth]
enabled = true

并重启 fail2ban 服务:

  1. sudo systemctl restart fail2ban

监控 Fail2ban 日志和防火墙配置

重要的是要知道像 Fail2ban 这样的服务是按预期工作的。首先使用 systemctl 检查服务的状态:

  1. sudo systemctl status fail2ban

如果此处似乎有问题,您可以通过检查自上次启动以来 fail2ban 单元的日志来进行故障排除:

  1. sudo journalctl -b -u fail2ban

接下来,使用 fail2ban-client 查询 fail2ban-server 或任何单个监狱的整体状态:

  1. sudo fail2ban-client status
  2. sudo fail2ban-client status jail_name

按照 Fail2ban 的日志记录最近的操作(按 Ctrl-C 退出):

  1. sudo tail -F /var/log/fail2ban.log

列出当前为 iptables 配置的规则:

  1. sudo iptables -L

以反映启用每个规则所需的命令的格式显示 iptables 规则:

  1. sudo iptables -S

结论

您现在应该能够为您的服务配置一些基本的禁止策略。 Fail2ban 非常容易设置,是保护任何使用身份验证的服务的好方法。

如果您想了解有关 Fail2ban 工作原理的更多信息,可以查看我们关于 fail2ban 规则和文件工作原理的教程。

©2015-2025 艾丽卡 support@alaica.com