如何在Ubuntu14.04上使用Fail2Ban保护SSH
介绍
虽然通过 SSH 连接到您的服务器非常安全,但 SSH 守护程序本身是一项服务,必须向 Internet 公开才能正常运行。 这带来了一些固有的风险,并为潜在的攻击者创造了攻击媒介。
任何暴露给网络的服务都是这种方式的潜在目标。 如果您注意这些服务的应用程序日志,您会经常看到重复的系统登录尝试,这些尝试代表用户和机器人等的暴力攻击。
名为 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.conf
文件创建 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 启用的所有服务,这些服务未在服务自己的部分中覆盖。
/etc/fail2ban/jail.conf
[DEFAULT] . . . ignoreip = 127.0.0.1/8 . . .
ignoreip
设置配置fail2ban 忽略的源地址。 默认情况下,它被配置为不禁止来自本地计算机的任何流量。 您可以通过将带有 ignoreip
设置的 [DEFAULT]
部分添加到 jail.local
文件中来添加其他要忽略的地址。 您可以通过将它们附加到指令的末尾来添加其他地址,并用空格分隔。
/etc/fail2ban/jail.conf
[DEFAULT] . . . bantime = 600 . . .
bantime
参数设置客户端在无法正确验证时被禁止的时间长度。 这是以秒为单位的。 默认情况下,这设置为 600 秒或 10 分钟。
/etc/fail2ban/jail.conf
[DEFAULT] . . . findtime = 600 maxretry = 3 . . .
接下来要注意的两个参数是 findtime
和 maxretry
。 这些共同建立了发现客户是应该被禁止的非法用户的条件。
maxretry
变量设置客户端在被禁止之前必须在 findtime
定义的时间窗口内进行身份验证的次数。 使用默认设置,fail2ban 服务将禁止在 10 分钟窗口内尝试登录 3 次未成功的客户端。
/etc/fail2ban/jail.conf
[DEFAULT] . . . destemail = root@localhost sendername = Fail2Ban mta = sendmail . . .
如果您希望配置电子邮件警报,您将需要评估 destemail
、sendername
和 mta
设置。 destemail
参数设置应接收禁止消息的电子邮件地址。 sendername
设置电子邮件中“发件人”字段的值。 mta
参数配置将使用什么邮件服务来发送邮件。 同样,将这些添加到 jail.local
文件的 [DEFAULT]
标题下,如果您希望调整它们,请设置为正确的值。
/etc/fail2ban/jail.conf
[DEFAULT] . . . action = $(action_)s . . .
此参数配置 fail2ban 在要制定禁令时采取的操作。 值 action_
在该参数之前的文件中定义。 默认操作是简单地将防火墙配置为拒绝来自违规主机的流量,直到禁令时间结束。
如果您想配置电子邮件警报,请将 action
项添加或取消注释到 jail.local
文件,并将其值从 action_
更改为 action_mw
。 如果您希望电子邮件包含相关的日志行,您可以将其更改为 action_mwl
。 如果您选择使用邮件警报,请确保配置了适当的邮件设置。
个人监狱设置
最后,我们进入配置文件中处理单个服务的部分。 这些由节标题指定,例如 [ssh]
。
可以通过取消注释 jail.local
中的标题并将 enabled
行更改为“true”来启用这些部分中的每一个:
/etc/fail2ban/jail.local
[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
参数来保护我们的服务:
/etc/fail2ban/jail.local
. . . [nginx-http-auth] enabled = true . . .
如果启用此功能,您将需要重新启动 fail2ban 服务以确保您的规则构造正确。
把它们放在一起
现在您已经了解了 fail2ban 背后的基本思想,让我们来看看基本设置。
就像我们上面描述的那样,我们将为 SSH 和 Nginx 配置自动禁止策略。 当 IP 被禁止时,我们希望 fail2ban 向我们发送电子邮件。
首先,让我们安装所有相关软件。
如果您还没有它,您将需要 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
设置,以便我们的服务禁止客户端半小时:
/etc/fail2ban/jail.local
[DEFAULT] . . . bantime = 1800 . . .
我们还需要配置我们的警报电子邮件信息。 首先,找到 destemail
参数,它也应该在 [DEFAULT]
标题下。 输入您要用于收集这些消息的电子邮件地址:
/etc/fail2ban/jail.local
[DEFAULT] . . . destemail = admin@example.com . . .
如果您愿意,可以将 sendername
设置为其他值。 不过,拥有一个可以使用您的邮件服务轻松过滤的值很有用,否则如果来自不同地方的大量中断尝试,您的常规收件箱可能会被警报淹没。
向下移动,我们需要将 action
参数调整为向我们发送电子邮件的操作之一。 选择是 action_mw
发起禁令,然后通过电子邮件向我们发送有关违规主机的“whois”报告,或 action_mwl
执行上述操作,同时通过电子邮件发送相关日志行。
我们将选择 action_mwl
因为日志行将帮助我们排除故障并在出现问题时收集更多信息:
/etc/fail2ban/jail.local
[DEFAULT] . . . action = %(action_mwl)s . . .
继续我们的 SSH 部分,如果我们想调整在建立禁令之前应该允许的不成功尝试的数量,您可以编辑 maxretry
条目。 如果您使用“22”以外的端口,则需要适当调整 port
参数。 正如我们之前所说,该服务已经启用,因此我们不需要对其进行修改。
接下来,搜索 nginx-http-auth
部分。 取消注释标题并将 enabled
参数更改为“true”。
/etc/fail2ban/jail.local
. . . [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 保护其他服务的信息,请尝试以下链接: