介绍
虽然通过SSH连接到服务器可以非常安全,但是SSH守护程序本身是一种必须暴露给互联网才能正常工作的服务。这带来一些固有的风险,并为将来的攻击者创造一个攻击的向量。 以这种方式暴露给网络的任何服务都是潜在的目标。如果你注意这些服务的应用程序日志,你会经常看到重复的,系统的登录尝试,代表用户和bots的暴力攻击。 所谓 的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.local
基于现有的文件
jail.conf
文件。 因此,我们将拷贝过来的文件,与内容注释掉,作为基础
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忽略源地址。 默认情况下,它配置为不禁止来自本地计算机的任何流量。 你可以添加额外的地址加入了忽略
[DEFAULT]
部分与
ignoreip
下,将其设置为
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
。如果您选择使用邮件提醒,请确保配置了相应的邮件设置。
Individual Jail设置
最后,我们进入配置文件中处理单个服务的部分。这些是由节标题指明,像[ssh]
这些部分的每一个都可以通过取消注释在头被启用
jail.local
并改变
enabled
线为“真”:
/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
如果您看到一个看起来与您正在使用的服务相关的文件,则应使用文本编辑器打开该文件。大多数文件都有相当好的评论,你应该能够至少告诉脚本设计防止什么类型的条件。大多数这些过滤器在适当的(disabled)部分
jail.conf
文件,我们可以在使
jail.local
文件如果需要的话。 例如,假装我们正在使用Nginx服务一个网站,并意识到我们网站的密码保护部分正在被砰击着登录尝试。我们可以告诉的fail2ban使用
nginx-http-auth.conf
文件,以检查在这种情况下
/var/log/nginx/error.log
文件。 这实际上已经是一个叫段设置
[nginx-http-auth]
在我们的
/etc/fail2ban/jail.conf
文件。 我们将只需要注释的部分
jail.local
文件,并翻转
enabled
参数来保护我们的服务:
/etc/fail2ban/jail.local
. . .
[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
,使我们的服务客户禁止半个小时设置:
/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
参数为“真”。
/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端口的流量。您还应该已经收到一封有关您配置的帐户中的禁令的电子邮件。