如何在 Ubuntu 14.04 上使用 Fail2Ban 保护 SSH

介绍

虽然通过SSH连接到您的服务器可以非常安全,但SSH大卫本身是一个必须暴露在互联网上才能正常运作的服务,这带来了一些固有的风险,并为潜在的攻击者创造了一个攻击引擎。

如果你注意这些服务的应用日志,你会经常看到重复的,系统的登录尝试,代表用户和机器人一样的暴力攻击。

一个名为 fail2ban的服务可以通过创建规则来缓解这个问题,这些规则可以根据预先定义的成功登录尝试数量自动改变您的iptables防火墙配置,这将使您的服务器能够响应非法访问尝试,而无需您干预。

在本指南中,我们将介绍如何在 Ubuntu 14.04 服务器上安装和使用 fail2ban。

在 Ubuntu 14.04 上安装 Fail2Ban

此工具的安装过程很简单,因为Ubuntu包装团队在默认存储库中维护一个包。

首先,我们需要更新我们的本地包索引,然后我们可以使用apt下载和安装包:

1sudo apt-get update
2sudo apt-get install fail2ban

正如你所看到的,安装是微不足道的,我们现在可以开始为自己的用途配置实用程序。

配置 Fail2Ban 与您的服务设置

fail2ban 服务将其配置文件保存在 /etc/fail2ban 目录中. 有一个默认文件名为 `jail.conf'。

由于这个文件可以通过包升级进行修改,所以我们不应该在本地编辑这个文件,而是复制它,以便我们可以安全地进行更改。为了使这两个文件能够成功一起工作,最好只将您想要重置的设置包含在jail.local文件中。

儘管我們只應該在「jail.local」檔案中包含偏差,但更容易以現有的「jail.local」檔案為基礎創建「jail.local」檔案,所以我們會將該檔案複製,內容被評論出來,作為「jail.local」檔案的基礎。

1awk '{ printf "# "; print; }' /etc/fail2ban/jail.conf | sudo tee /etc/fail2ban/jail.local

一旦檔案被複製,我們可以開啟原始的「jail.conf」檔案,看看事物是如何預設的。

1sudo nano /etc/fail2ban/jail.conf

在此文件中,您可能需要调整一些设置。位于[DEFAULT]部分的设置将适用于所有未在服务本身部分中提及的 fail2ban 功能的服务。

1[label /etc/fail2ban/jail.conf]
2[DEFAULT]
3. . .
4ignoreip = 127.0.0.1/8
5. . .

ignoreip设置配置了 fail2ban 忽略的源地址. 默认情况下,它被配置为不禁止来自本地机器的任何流量. 您可以通过在jail.local文件中添加一个包含ignoreip设置的[DEFAULT]部分来添加额外的地址来忽略。

1[label /etc/fail2ban/jail.conf]
2[DEFAULT]
3. . .
4bantime = 600
5. . .

bantime参数设置了客户端在未能正确身份验证时将被禁用的时间。

1[label /etc/fail2ban/jail.conf]
2[DEFAULT]
3. . .
4findtime = 600
5maxretry = 3
6. . .

您要注意的下一个两个参数是findtimemaxretry,这些参数一起建立了客户端被认为是应该被禁止的非法用户的条件。

maxretry变量设置了客户端在findtime定义的时间窗口内验证的尝试次数,然后被禁用。

1[label /etc/fail2ban/jail.conf]
2[DEFAULT]
3. . .
4destemail = root@localhost
5sendername = Fail2Ban
6mta = sendmail
7. . .

如果您想要配置电子邮件警报,您将需要评估destemailsendernamemta设置。destemail参数设置了应该接收禁止邮件的电子邮件地址。sendername设置了电子邮件中的From字段的值。mta参数配置了将用于发送邮件的邮件服务。再次,将这些值添加到jail.local文件中,在[DEFAULT]标题下,并设置为适当的值,如果您想要调整它们。

1[label /etc/fail2ban/jail.conf]
2[DEFAULT]
3. . .
4action = $(action_)s
5. . .

此参数配置了 fail2ban 想要设置禁令时所采取的操作. 值 action_ 在该参数前不久在文件中定义。 默认操作是简单地配置防火墙以拒绝侵权主机的流量,直到禁令时间过期。

如果您想配置电子邮件警报,请将行动项添加到jail.local文件中,并将其值从action_更改为action_mw。如果您希望电子邮件中包含相关的日志行,则可以更改为action_mwl

个人监狱设置

最后,我们进入处理个别服务的配置文件部分,这些服务由部分标题指定,如[ssh]

可以通过在jail.local中放弃评论标题并将enabled行更改为true来激活这些部分:

1[label /etc/fail2ban/jail.local]
2[jail_to_enable]
3. . .
4enabled = true
5. . .

默认情况下,SSH服务被启用,所有其他服务都被禁用。

这些部分通过使用在[DEFAULT]部分中设置的值作为基础,并根据需要修改它们来工作. 如果您想要排除任何值,您可以通过将相应服务的部分添加到jail.local并修改其值来做到这一点。

这里设置的其他设置包括将用于决定日志中的行是否表示身份验证失败的过滤器,以及告诉 fail2ban 该特定服务的日志所在的logpath

过滤器值实际上是指位于 /etc/fail2ban/filter.d 目录中的文件,其 .conf’ 扩展被删除,这些文件包含确定日志中的行是否是一个未成功的身份验证尝试的常规表达式。

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

1ls /etc/fail2ban/filter.d

如果你看到一个看起来与你正在使用的服务相关的文件,你应该用文本编辑器打开它. 大多数文件都很好地评论,你应该能够至少告诉你脚本的条件是为了防范什么类型。

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

实际上,这已经在我们的/etc/fail2ban/jail.conf文件中设置了一个名为[nginx-http-auth]的部分,我们只需要在jail.local文件中删除该部分的评论并转换启用参数来保护我们的服务:

1[label /etc/fail2ban/jail.local]
2. . .
3[nginx-http-auth]
4
5enabled = true
6. . .

如果您启用此功能,您将想要重新启动您的 fail2ban 服务,以确保您的规则正确构建。

把一切都放在一起

现在你已经理解了 fail2ban 背后的基本想法,让我们通过一个基本的设置来运行。

我们将为 SSH 和 Nginx 配置自动禁用策略,正如我们上面所描述的那样。

首先,让我们安装所有相关的软件。

如果你还没有它,你需要 nginx,因为我们会监控它的日志,你需要sendmail发送通知给我们。我们还会抓住iptables-persistent来允许服务器在启动时自动设置我们的防火墙规则。

1sudo apt-get update
2sudo apt-get install nginx sendmail iptables-persistent

暂停fail2ban服务一会儿,这样我们就可以建立一个基本的防火墙,而没有它添加的规则:

1sudo service fail2ban stop

建立基础防火墙

当它完成时,我们应该实施默认防火墙. 你可以在这里学习 [如何在Ubuntu 14.04上配置iptables防火墙(https://www.digitalocean.com/community/articles/how-to-set-up-a-firewall-using-iptables-on-ubuntu-14-04)。

我们将告诉它允许建立的连接,由服务器本身产生的流量,用于我们的SSH和Web服务器端口的流量. 我们将放弃所有其他流量. 我们可以通过键入设置这个基本的防火墙:

1sudo iptables -A INPUT -i lo -j ACCEPT
2sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
3sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
4sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
5sudo iptables -A INPUT -j DROP

这些命令将执行上述策略,我们可以通过键入以下方式查看当前的防火墙规则:

1sudo iptables -S
1[secondary_label Output]
2-P INPUT ACCEPT
3-P FORWARD ACCEPT
4-P OUTPUT ACCEPT
5-A INPUT -i lo -j ACCEPT
6-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
7-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
8-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
9-A INPUT -j DROP

您可以保存防火墙,以便它们通过键入重启生存:

1sudo dpkg-reconfigure iptables-persistent

之後,您可以重新啟動「fail2ban」來執行包裝規則:

1sudo service fail2ban start

我们可以通过键入查看当前的防火墙规则:

1sudo iptables -S
 1[secondary_label Output]
 2-P INPUT ACCEPT
 3-P FORWARD ACCEPT
 4-P OUTPUT ACCEPT
 5-N fail2ban-ssh
 6-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
 7-A INPUT -i lo -j ACCEPT
 8-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
 9-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
10-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
11-A INPUT -j DROP
12-A fail2ban-ssh -j RETURN

我们有我们每个链条的默认策略,然后是我们建立的五个基本规则。在红色中,我们也有 fail2ban 设置的默认结构,因为它已经默认地实施了 SSH 禁止策略。

调整 Fail2ban 配置

现在,我们需要使用我们想要的设置来配置 fail2ban。

1sudo nano /etc/fail2ban/jail.local

我们可以在这里设置更严厉的禁令时间。 查找和解除评论的[DEFAULT]标题。 在默认标题下,更改bantime设置,以便我们的服务禁止客户半小时:

1[label /etc/fail2ban/jail.local]
2[DEFAULT]
3. . .
4bantime = 1800
5. . .

我们还需要配置我们的警报电子邮件信息。 首先,找到destemail参数,该参数也应该在[DEFAULT]标题下。 输入您想要用来收集这些消息的电子邮件地址:

1[label /etc/fail2ban/jail.local]
2[DEFAULT]
3. . .
4destemail = [email protected]
5. . .

如果您想要的话,您可以将邮件名称设置为其他东西,但使用您的邮件服务可以轻松过滤的值是有用的,否则您的常规邮箱可能会被警告淹没,如果有许多从不同的地方试图中断。

选择在action_mw之间,它设置了禁令,然后在侵犯主机上发送电子邮件的whois报告,或action_mwl,它执行了上述操作,但也发送了相关的日志线。

我们将选择action_mwl,因为日志行将帮助我们解决问题,并在出现问题时收集更多信息:

1[label /etc/fail2ban/jail.local]
2[DEFAULT]
3. . .
4action = %(action_mwl)s
5. . .

继续到我们的SSH部分,如果我们想调整在禁止之前应该允许的失败尝试数量,您可以编辑maxretry条目。如果您使用的是22以外的端口,您将需要适当地调整port参数。

接下来,搜索nginx-http-auth部分. 删除标题并更改启用参数以读取

1[label /etc/fail2ban/jail.local]
2. . .
3[nginx-http-auth]
4
5enabled = true
6. . .

这应该是你需要做的这一部分,除非你的网页服务器在非标准端口上运行,或者你移动了默认错误日志路径。

重新启动 Fail2ban 服务

完成后,保存并关闭文件。

现在,开始或重新启动您的 fail2ban 服务. 有时,最好完全关闭该服务,然后重新启动它:

1sudo service fail2ban stop

现在我们可以通过键入重新启动它:

1sudo service fail2ban start

所有防火墙规则可能需要几秒钟才能被填充,有时,直到第一个此类规则被禁止之前,规则才会被添加。

1sudo iptables -S
 1[secondary_label Output]
 2-P INPUT ACCEPT
 3-P FORWARD ACCEPT
 4-P OUTPUT ACCEPT
 5-N fail2ban-nginx-http-auth
 6-N fail2ban-ssh
 7-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-http-auth
 8-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
 9-A INPUT -i lo -j ACCEPT
10-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
11-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
12-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
13-A INPUT -j DROP
14-A fail2ban-nginx-http-auth -j RETURN
15-A fail2ban-ssh -j RETURN

红色的线条是我们的 fail2ban 政策所创造的线条,现在它们只是将流量引向新的,几乎是空的链条,然后让流量直接回到INPUT链中。

然而,这些新的链条是禁止规则将被添加的地方。

测试禁令政策

从另一个服务器,一个不需要登录你的 fail2ban服务器,我们可以通过禁止我们的第二个服务器来测试规则。

登录到您的第二个服务器后,尝试将 SSH 连接到 fail2ban 服务器中,您可以尝试使用不存在的名称连接:

1ssh blah@fail2ban_server_IP

在密码提示中输入随机字符. 重复几次. 在某个时刻, fail2ban 服务器将停止响应允许拒绝消息. 这表示您的第二个服务器已被禁用 fail2ban 服务器。

在您的 fail2ban 服务器上,您可以通过再次检查我们的 iptables 来查看新的规则:

1sudo iptables -S
 1[secondary_label Output]
 2-P INPUT ACCEPT
 3-P FORWARD ACCEPT
 4-P OUTPUT ACCEPT
 5-N fail2ban-nginx-http-auth
 6-N fail2ban-ssh
 7-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-http-auth
 8-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
 9-A INPUT -i lo -j ACCEPT
10-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
11-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
12-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
13-A INPUT -j DROP
14-A fail2ban-nginx-http-auth -j RETURN
15-A fail2ban-ssh -s 203.0.113.14/32 -j REJECT --reject-with icmp-port-unreachable
16-A fail2ban-ssh -j RETURN

正如您在突出的行中所看到的,我们的配置中有一个新的规则,它拒绝从我们第二个服务器的IP地址传送到SSH端口的流量。

结论

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

如果您想了解有关 fail2ban 如何工作的更多信息,您可以参阅我们的教程 how fail2ban rules and files work

有关如何使用 fail2ban 来保护其他服务的信息,请尝试这些链接:

Published At
Categories with 技术
comments powered by Disqus