前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站

介绍

虽然通过 SSH 连接到服务器可能非常安全,但 SSH 守护程序本身是必须向互联网公开才能正常运行的服务。这带来了一些固有的风险,并为潜在的攻击者提供了一个攻击向量。

任何暴露在网络上的服务都有可能成为目标。如果您关注这些服务的应用程序日志,通常会看到重复、系统化的登录尝试,这代表用户和机器人一样的暴力攻击。

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

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

在 CentOS 7 上安装 Fail2ban

虽然 Fail2ban 在官方 CentOS 软件包存储库中不可用,但它已经打包到了 EPEL 项目。EPEL 代表企业 Linux 的额外软件包,可以通过 CentOS 提供的发布软件包进行安装:

sudo yum install epel-release

您将被提示继续操作—按 y,然后按 Enter

[secondary_label yum prompt]
Transaction Summary
============================================================================
Install  1 Package

Total download size: 14 k
Installed size: 24 k
Is this ok [y/d/N]: y

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

sudo yum install fail2ban

再次按提示继续时按 yEnter

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

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] 部分,首先执行,并且还可以包含各个监狱的部分。对于给定参数,最后设置的值优先。

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

sudo nano /etc/fail2ban/jail.local

粘贴以下内容:


[DEFAULT]
# 封禁主机一个小时:
bantime = 3600

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

[sshd]
enabled = true

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

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

sudo systemctl restart fail2ban

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

sudo fail2ban-client status

Status
|- Number of jail:      1
`- Jail list:   sshd

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

sudo fail2ban-client status sshd

探索可用设置

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

sudo nano /etc/fail2ban/jail.conf

所有监狱的默认设置

首先,浏览[DEFAULT]部分。

ignoreip = 127.0.0.1/8

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

bantime = 600

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

findtime = 600
maxretry = 3

接下来要注意的两个参数是findtimemaxretry。它们共同工作以建立客户端应被禁止的条件。

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

destemail = root@localhost
sendername = Fail2Ban
mta = sendmail

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

action = $(action_)s

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

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

单个监狱的设置

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

[sshd]

port    = ssh
logpath = %(sshd_log)s

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

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

filter值实际上是对位于/etc/fail2ban/filter.d目录中的文件的引用,其.conf扩展名已被移除。此文件包含确定日志中是否存在不良行的正则表达式。我们不会在本指南中深入讨论此文件,因为它相当复杂,并且预定义设置很好地匹配了适当的行。

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

ls /etc/fail2ban/filter.d

如果您看到一个与您正在使用的服务相关的文件,您应该使用文本编辑器打开它。大多数文件都有相当详细的注释,您应该能够知道脚本设计用于防范什么类型的条件。如果需要,我们可以在jail.local中启用大多数这些过滤器在jail.conf中具有适当(已禁用)的部分。

例如,假设我们正在使用 Nginx 提供网站,并意识到我们网站的受密码保护的部分正在遭受大量的登录尝试。我们可以告诉 Fail2ban 使用nginx-http-auth.conf文件来检查/var/log/nginx/error.log文件中的此条件。

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

[DEFAULT]
# 封禁主机一小时:
bantime = 3600

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

[sshd]
enabled = true

[nginx-http-auth]
enabled = true

然后重新启动 fail2ban 服务:

sudo systemctl restart fail2ban

监控 Fail2ban 日志和防火墙配置

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

sudo systemctl status fail2ban

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

sudo journalctl -b -u fail2ban

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

sudo fail2ban-client status
sudo fail2ban-client status jail_name

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

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

列出当前配置的 iptables 规则:

sudo iptables -L

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

sudo iptables -S

结论

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

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

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐