介绍
虽然通过 SSH 连接到您的服务器非常安全,但 SSH 守护程序本身是一项服务,必须向 Internet 公开才能正常运行。 这带来了一些固有的风险,并为潜在的攻击者提供了攻击媒介。
任何暴露给网络的服务都是这种方式的潜在目标。 如果您注意这些服务的应用程序日志,您会经常看到重复的、系统的登录尝试,这些尝试代表用户和机器人等的暴力攻击。
名为 Fail2ban 的服务可以通过创建规则来缓解此问题,这些规则会根据预定义的不成功登录尝试次数自动更改您的 iptables 防火墙配置。 这将允许您的服务器在无需您干预的情况下响应非法访问尝试。
在本指南中,我们将介绍如何在 CentOS 7 服务器上安装和使用 Fail2ban。
在 CentOS 7 上安装 Fail2ban
虽然 Fail2ban 在官方 CentOS 软件包存储库中不可用,但它是为 EPEL 项目 打包的。 EPEL 代表 Enterprise Linux 的 Extra Packages,可以使用 CentOS 提供的 是 的发行包安装:
sudo yum install epel-release
系统将提示您继续 - 按 y,然后按 Enter:
yum promptTransaction 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
再次,在提示继续时按 y 和 Enter。
安装完成后,使用 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/
中的文件可用于覆盖这两个文件中的设置。 文件按以下顺序应用:
/etc/fail2ban/jail.conf
/etc/fail2ban/jail.d/*.conf
,按字母顺序/etc/fail2ban/jail.local
/etc/fail2ban/jail.d/*.local
,按字母顺序
任何文件都可能包含一个 [DEFAULT]
部分,首先执行,还可能包含各个监狱的部分。 为给定参数设置的最后一个 vavalue 优先。
让我们从编写一个非常简单的 jail.local
版本开始。 使用 nano
(或您选择的编辑器)打开一个新文件:
sudo nano /etc/fail2ban/jail.local
粘贴以下内容:
/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保存,回车确认文件名)。 现在我们可以使用 systemctl
重新启动 fail2ban
服务:
sudo systemctl restart fail2ban
systemctl
命令应该在没有任何输出的情况下完成。 为了检查服务是否正在运行,我们可以使用 fail2ban-client
:
sudo fail2ban-client status
OutputStatus |- 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
接下来要注意的两个参数是 findtime
和 maxretry
。 这些共同确定应禁止客户的条件。
maxretry
变量设置客户端在被禁止之前必须在 findtime
定义的时间窗口内进行身份验证的次数。 使用默认设置,Fail2ban 将禁止在 10 分钟窗口内尝试登录 3 次未成功的客户端。
destemail = root@localhost sendername = Fail2Ban mta = sendmail
如果您希望配置电子邮件警报,您可能需要覆盖 destemail
、sendername
和 mta
设置。 destemail
参数设置应接收禁止消息的电子邮件地址。 sendername
设置电子邮件中“发件人”字段的值。 mta
参数配置将使用什么邮件服务来发送邮件。
action = $(action_)s
此参数配置 Fail2ban 在要制定禁令时采取的操作。 值 action_
在该参数之前的文件中定义。 默认操作是简单地将防火墙配置为拒绝来自违规主机的流量,直到禁令时间结束。
如果您想配置电子邮件警报,您可以将此值从 action_
覆盖到 action_mw
。 如果您希望电子邮件包含相关的日志行,您可以将其更改为 action_mwl
。 如果您选择使用邮件警报,您需要确保配置了适当的邮件设置。
个人监狱的设置
在 [DEFAULT]
之后,我们将遇到为不同服务配置单独监狱的部分。 这些通常包括要禁止的 port
和监视恶意访问尝试的 logpath
。 例如,我们已经在 jail.local
中启用的 SSH jail 有以下设置:
/etc/fail2ban/jail.local
[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.conf
中都有适当的(禁用)部分,如果需要,我们可以在 jail.local
中启用这些部分。
例如,假设我们正在使用 Nginx 为网站提供服务,并意识到我们网站的受密码保护的部分因登录尝试而受到抨击。 我们可以告诉 Fail2ban 使用 nginx-http-auth.conf
文件来检查 /var/log/nginx/error.log
文件中的这种情况。
这实际上已经在我们的 /etc/fail2ban/jail.conf
文件中名为 [nginx-http-auth]
的部分中设置。 我们只需将 nginx-http-auth
监狱的 enabled
参数添加到 jail.local
:
/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 [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 规则和文件如何工作 的教程。