如何在 Ubuntu 14.04 上使用 Fail2Ban 保护 SSH
介绍
虽然通过 SSH 连接到您的服务器非常安全,但 SSH 守护进程本身是一项必须暴露在互联网上才能正常运行的服务。这带来了一些固有的风险,并为潜在的攻击者创造了一个攻击媒介。
任何暴露于网络的服务都是这种方式的潜在目标。如果您注意这些服务的应用程序日志,您会经常看到重复的、系统的登录尝试,这些尝试代表了用户和类似机器人的暴力攻击。
名为 fail2ban 的服务可以通过创建规则来缓解这个问题,这些规则可以根据预定义的不成功登录尝试次数自动更改您的 iptables
防火墙配置。这将允许您的服务器响应非法访问尝试而无需您的干预。
在本指南中,我们将介绍如何在 Ubuntu 14.04 服务器上安装和使用 fail2ban。
在 Ubuntu 14.04 上安装 Fail2Ban
这个工具的安装过程很简单,因为 Ubuntu 打包团队在默认存储库中维护了一个包。
首先,我们需要更新本地包索引,然后我们可以使用 apt
下载并安装包:
- sudo apt-get update
- sudo apt-get install fail2ban
如您所见,安装很简单。我们现在可以开始配置该实用程序以供我们自己使用。
使用您的服务设置配置 Fail2Ban
fail2ban 服务将其配置文件保存在 /etc/fail2ban
目录中。有一个名为 jail.conf
的默认文件。
由于这个文件可以通过包升级来修改,我们不应该就地编辑这个文件,而是复制它以便我们可以安全地进行更改。为了让这两个文件一起成功运行,最好只在 jail.local
文件中包含您希望覆盖的设置。所有默认选项都将从 jail.conf
文件中获取。
尽管我们应该只在 jail.local
文件中包含与默认值的偏差,但基于现有 jail 创建一个
文件的基础。您可以通过键入以下内容来执行此操作:jail.local
文件会更容易。配置文件。因此,我们将复制该文件,并将内容注释掉,作为 jail.local
- awk '{ printf "# "; print; }' /etc/fail2ban/jail.conf | sudo tee /etc/fail2ban/jail.local
复制文件后,我们可以打开原始的 jail.conf
文件来查看默认情况下的设置
- sudo nano /etc/fail2ban/jail.conf
在此文件中,您可能希望调整一些设置。 [DEFAULT]
部分下的设置将应用于为 fail2ban 启用的所有服务,这些服务不会在服务自己的部分中被覆盖。
[DEFAULT]
. . .
ignoreip = 127.0.0.1/8
. . .
ignoreip
设置配置 fail2ban 忽略的源地址。默认情况下,它配置为不禁止来自本地计算机的任何流量。您可以通过在 jail.local
文件中添加一个带有 ignoreip
设置的 [DEFAULT]
部分来添加要忽略的其他地址。您可以通过将附加地址附加到指令的末尾来添加附加地址,以空格分隔。
[DEFAULT]
. . .
bantime = 600
. . .
bantime
参数设置客户端在未能正确验证时将被禁止的时间长度。这是以秒为单位测量的。默认情况下,这设置为 600 秒或 10 分钟。
[DEFAULT]
. . .
findtime = 600
maxretry = 3
. . .
您要注意的下两个参数是 findtime
和 maxretry
。这些一起工作来确定客户端被发现是应该被禁止的非法用户的条件。
maxretry
变量设置客户端在被禁止之前必须在 findtime
定义的时间窗口内进行身份验证的尝试次数。使用默认设置,fail2ban 服务将禁止在 10 分钟窗口内 3 次尝试登录失败的客户端。
[DEFAULT]
. . .
destemail = root@localhost
sendername = Fail2Ban
mta = sendmail
. . .
如果您希望配置电子邮件警报,您需要评估 destemail
、sendername
和 mta
设置。 destemail
参数设置应该接收禁止消息的电子邮件地址。 sendername
设置电子邮件中“发件人”字段的值。mta
参数配置将使用什么邮件服务来发送邮件。同样,将这些添加到jail.local
文件,位于 [DEFAULT]
标头下,如果您希望调整它们,请设置为适当的值。
[DEFAULT]
. . .
action = $(action_)s
. . .
此参数配置 fail2ban 在想要实施禁令时采取的操作。值 action_
在此参数之前的文件中定义。默认操作是简单地将防火墙配置为拒绝来自违规主机的流量,直到禁止时间结束。
如果您想配置电子邮件警报,请在 jail.local
文件中添加或取消注释 action
项,并将其值从 action_
更改为 <代码>action_mw。如果您希望电子邮件包含相关的日志行,您可以将其更改为 action_mwl
。如果您选择使用邮件提醒,请确保配置了适当的邮件设置。
个人监狱设置
最后,我们到达处理各个服务的配置文件部分。这些由节标题指定,如 [ssh]
。
可以通过取消注释 jail.local
中的标头并将 enabled
行更改为“true”来启用这些部分中的每一个:
[jail_to_enable]
. . .
enabled = true
. . .
默认情况下,SSH 服务处于启用状态,其他所有服务均处于禁用状态。
这些部分通过使用在 [DEFAULT]
部分中设置的值作为基础并根据需要修改它们来工作。如果您想覆盖任何值,您可以通过将适当的服务部分添加到 jail.local
并修改其值来实现。
此处设置的一些其他设置是 filter
,它将用于决定日志中的一行是否表示身份验证失败,以及 logpath
告诉 fail2ban 的日志在哪里该特定服务位于。
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]
的部分中进行了设置。我们只需要取消注释 jail.local
文件中的部分并翻转 enabled
参数来保护我们的服务:
. . .
[nginx-http-auth]
enabled = true
. . .
如果启用此功能,您将需要重新启动 fail2ban 服务以确保您的规则构建正确。
把它们放在一起
现在您了解了 fail2ban 背后的基本思想,让我们来完成一个基本设置。
如上所述,我们将为 SSH 和 Nginx 配置自动禁止策略。我们希望 fail2ban 在 IP 被禁止时向我们发送电子邮件。
首先,让我们安装所有相关软件。
如果您还没有它,您将需要 nginx,因为我们将监视它的日志,并且您将需要 sendmail 来向我们发送通知。我们还将获取 iptables-persistent
以允许服务器在启动时自动设置我们的防火墙规则。这些可以从 Ubuntu 的默认存储库中获取:
- sudo apt-get update
- sudo apt-get install nginx sendmail iptables-persistent
暂时停止 fail2ban
服务,这样我们就可以建立一个没有它添加的规则的基础防火墙:
- sudo service fail2ban stop
建立基础防火墙
完成后,我们应该实施默认防火墙。您可以在此处了解如何在 Ubuntu 14.04 上配置 iptables 防火墙。我们将为本指南创建一个基本的防火墙。
我们将告诉它允许已建立的连接、服务器本身生成的流量、发往我们的 SSH 和 Web 服务器端口的流量。我们将丢弃所有其他流量。我们可以通过键入以下内容来设置此基本防火墙:
- sudo iptables -A INPUT -i lo -j ACCEPT
- sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
- sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
- sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
- sudo iptables -A INPUT -j DROP
这些命令将实施上述政策。我们可以通过键入以下内容来查看当前的防火墙规则:
- sudo iptables -S
Output-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -j DROP
您可以通过键入以下命令保存防火墙,以便它们在重新启动后仍然存在:
- sudo dpkg-reconfigure iptables-persistent
之后,您可以重新启动 fail2ban
来实现包装规则:
- sudo service fail2ban start
我们可以通过键入以下内容来查看我们当前的防火墙规则:
- sudo iptables -S
Output-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N fail2ban-ssh
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -j DROP
-A fail2ban-ssh -j RETURN
我们对每个链都有默认政策,然后是我们建立的五个基本规则。在红色部分,我们还有 fail2ban 设置的默认结构,因为它已经默认实施了 SSH 禁止策略。这些可能会或可能不会首先出现,因为有时 fail2ban
不会添加结构,直到实施第一个禁令。
调整 Fail2ban 配置
现在,我们需要使用我们想要的设置来配置 fail2ban。打开 jail.local
文件:
- sudo nano /etc/fail2ban/jail.local
我们可以在这里设置一个更严厉的禁令时间。找到并取消注释 [DEFAULT]
标题。在默认标题下,更改 bantime
设置,以便我们的服务禁止客户端半小时:
[DEFAULT]
. . .
bantime = 1800
. . .
我们还需要配置我们的警报电子邮件信息。首先,找到 destemail
参数,它也应该位于 [DEFAULT]
标题下。输入您要用来收集这些消息的电子邮件地址:
[DEFAULT]
. . .
destemail = admin@example.com
. . .
如果您愿意,可以将 sendername
设置为其他内容。不过,拥有一个可以使用您的邮件服务轻松过滤的值是很有用的,否则如果来自不同地方的尝试有很多中断,您的常规收件箱可能会被警报淹没。
向下移动,我们需要将 action
参数调整为向我们发送电子邮件的操作之一。选择是在 action_mw
之间进行选择,它建立禁令,然后通过电子邮件向我们发送有关违规主机的“whois”报告,或者 action_mwl
执行上述操作,但也会通过电子邮件发送相关信息日志行。
我们将选择 action_mwl
,因为日志行将帮助我们排除故障并在出现问题时收集更多信息:
[DEFAULT]
. . .
action = %(action_mwl)s
. . .
转到我们的 SSH 部分,如果我们想调整在建立禁令之前应该允许的不成功尝试次数,您可以编辑 maxretry
条目。如果您使用的端口不是“22”,您需要适当调整端口
参数。正如我们之前所说,该服务已经启用,因此我们不需要修改那。
接下来,搜索 nginx-http-auth
部分。取消注释标题并将 enabled
参数更改为 \true。
. . .
[nginx-http-auth]
enabled = true
. . .
这应该是您在本节中必须执行的全部操作,除非您的 Web 服务器在非标准端口上运行或者您移动了默认错误日志路径。
重新启动 Fail2ban 服务
完成后,保存并关闭文件。
现在,启动或重新启动您的 fail2ban 服务。有时,最好完全关闭服务然后重新启动它:
- sudo service fail2ban stop
现在我们可以通过键入以下命令重新启动它:
- sudo service fail2ban start
填充所有防火墙规则可能需要一些时间。有时,直到制定第一个此类禁令后才添加规则。但是,一段时间后,您可以通过键入以下内容来检查新规则:
- sudo iptables -S
Output-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N fail2ban-nginx-http-auth
-N fail2ban-ssh
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-http-auth
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -j DROP
-A fail2ban-nginx-http-auth -j RETURN
-A fail2ban-ssh -j RETURN
红色线条是我们的 fail2ban 政策创建的。现在,他们只是将流量引导到新的、几乎是空的链,然后让流量直接流回 INPUT 链。
但是,这些新链是将添加禁止规则的地方。
测试禁止策略
从另一台服务器,一个不需要登录到您的 fail2ban 服务器的服务器,我们可以通过禁止我们的第二台服务器来测试规则。
登录到您的第二台服务器后,尝试通过 SSH 连接到 fail2ban 服务器。您可以尝试使用不存在的名称进行连接,例如:
- ssh blah@fail2ban_server_IP
在密码提示中输入随机字符。重复几次。在某些时候,fail2ban 服务器将停止响应 Permission denied
消息。这表示您的第二个服务器已被 fail2ban 服务器禁止。
在您的 fail2ban 服务器上,您可以通过再次检查我们的 iptables 来查看新规则:
- sudo iptables -S
Output-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N fail2ban-nginx-http-auth
-N fail2ban-ssh
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-http-auth
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -j DROP
-A fail2ban-nginx-http-auth -j RETURN
-A fail2ban-ssh -s 203.0.113.14/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-ssh -j RETURN
正如您在突出显示的行中所看到的,我们的配置中有一条新规则拒绝来自我们第二台服务器 IP 地址的 SSH 端口流量。您还应该在您配置的帐户中收到一封关于禁令的电子邮件。
结论
您现在应该能够为您的服务配置一些基本的禁止策略。 Fail2ban 非常容易设置,是保护任何使用身份验证的服务的好方法。
如果您想了解有关 fail2ban 如何工作的更多信息,您可以查看我们关于 fail2ban 规则和文件如何工作的教程。
有关如何使用 fail2ban 保护其他服务的信息,请尝试以下链接:
- 如何在 Ubuntu 14.04 上使用 Fail2Ban 保护 Nginx 服务器
- 如何在 Ubuntu 14.04 上使用 Fail2Ban 保护 Apache 服务器