如何使用fail2ban防御SSH服务器的暴力破解攻击

介绍

对于SSH服务的常见的攻击就是暴力破解攻击——远程攻击者通过不同的密码来无限次地进行登录尝试。当然SSH可以设置使用非密码验证验证方式来对抗这种攻击,例如公钥验证或者双重验证。将不同的验证方法的优劣处先放在一边,如果我们必须使用密码验证方式怎么办?你是如何保护你的 SSH 服务器免遭暴力破解攻击的呢?

幸运的是,有一种工具可以缓解这种攻击这个工具是fail2ban。这可以配置为允许使用SSH进行合法登录,但在经过一定次数后无法正确验证后攻击将禁用IP地址。我们将在Debian上安装和配置该软件。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后在购买服务器

第一步 - 安装fail2ban

Debian在其默认存储库中包含fail2ban。我们可以使用以下命令下载并安装它:

sudo apt-get update
sudo apt-get install fail2ban

这不仅会安装fail2ban,还会自动设置启动服务。

第二步 - 配置fail2ban

fail2ban配置保存在/etc/fail2ban目录中。默认禁止规则的配置文件称为jail.conf

由于fail2ban在程序有新版本时更新其配置文件的方式,因此我们不应编辑默认配置文件。

相反,我们应该将其复制到新位置进行编辑:

cd /etc/fail2ban
sudo cp jail.conf jail.local
sudo nano jail.local

在这里,我们可以更改默认配置中设置。

默认配置

开始的部分[DEFAULT]是配置默认值,可以在配置中稍后的更具体的上下文中覆盖这些默认值。已经给出的大多数设置都是默认选项的选择。

禁止默认值

我们可以通过修改一些参数来配置fail2ban实现禁止的方式。以下是一些更重要的内容:

  • ignoreip:此参数采用应从fail2ban规则中排除的IP地址列表。此处列出的IP地址或块不会受到限制,因此请而具体地选择它们。
    • IP地址和范围由空格分隔。
    • 您应该将您的家庭或工作IP地址添加到列表的末尾,以便在登录时遇到问题不会被阻止。
    • 这看起来像:“ignoreip = 127.0.0.1/8 YOUR_IP_ADDRESS
  • bantime:这列出了如果客户端无法正确验证禁令将持续的时间。
    • 客户端默认值为10分钟。
  • maxretry:此参数指定禁止实施前允许的尝试次数。

定义禁令操作

当需要禁令时,fail2ban可以以不同的方式进行。它通过查看以下参数来决定必要的操作:

  • banaction:此设置指定在需要禁令时将使用的配置文件。
    • 此参数的值指的是/etc/fail2ban/action.d目录中的文件,该文件将处理实际的禁止过程。
    • 默认值使用iptables在身份验证失败时禁止所有端口上的IP。我们稍后会讨论具体的禁止规则。
  • action:此参数指定其上方列出的操作快捷方式之一。它基本上调用一个banaction脚本(如上所述),然后为变量分配适当的信息并将它们传递给脚本。
    • 默认操作是action_调用脚本并将名称,端口,协议和链传递给脚本。它不会像其他一些操作那样发送电子邮件地址或日志行。

配置电子邮件警报

如果您希望将fail2ban配置为在禁止IP后通过电子邮件发送给您,您也可以在默认部分配置它。

如果已在计算机上配置了邮件服务器,则可以配置fail2ban以将电子邮件发送到外部邮件。

有两个相关参数:

  • destemail:此选项设置在禁止的情况下将通知的电子邮件地址。
    • 默认值root@localhost将邮件传递到当前计算机的root帐户。
    • 如果您配置了邮件服务器,请将其更改为外部邮件地址。
  • mta:这指定将用于传递邮件的邮件代理。
    • 如果您的邮件服务器配置了sendmail,请保留默认选项(sendmail)。
    • 如果您没有配置邮件服务器,但希望将本地邮件传递到用户帐户,则可以将“sendmail”更改为“mail”。

如果您希望配置电子邮件,则必须如上所述编辑action参数。将操作更改为“actionmw”或“actionmwl”,以将电子邮件信息传递给禁止脚本。

如果您已配置本地邮件传递,则可以通过输入以下内容来检查邮件:

sudo nano /var/mail/mail

配置特定于应用程序的Jails

在文件的下方,你应该看到标记为这样的部分:

[application_name]

您应该能够破译大多数参数。

filter参数指定/etc/fail2ban/filter.d目录中的文件。这告诉fail2ban如何解析程序的日志文件以查看失败的身份验证。

如果fail2ban解析失败。logpath变量保存服务日志文件的路径,

您可以在此处覆盖任何其他默认参数。例如,对于SSH,maxretry选项与Debian安装中的dault选项不同。

第三步 - 配置iptables

我们实际上不会对iptables进行太多配置,但我们将查看实现其行为的配置文件。这将有助于我们了解fail2ban如何实施其禁止政策。

在banaction参数下打开我们的jail配置中指定的文件:

sudo nano /etc/fail2ban/action.d/iptables-multiport.conf

在这里,我们可以看到当fail2ban调用禁止IP时实际发生了什么。它使用iptables防火墙软件来实现规则。

当fail2ban开始时,它会调用以下行:

actionstart = iptables -N fail2ban-<name>
              iptables -A fail2ban-<name> -j RETURN   # questionable usefulness
              iptables -I <chain> -p <protocol> -m multiport --dports <port> -j fail2ban-<name>

这会初始化环境以通过过滤链传递流量。iptables软件基于“漏斗”或“链”控制流量。这些渠道中的每一个都对所有流量应用规则,以确定它是否可接受。

第一行iptables -N fail2ban-<name>创建一个名为“fail2ban-”的新链,其中包含以下服务的名称。这将保留禁止某些IP地址的规则。

下一行,iptables -A fail2ban-<name> -j RETURN为我们刚刚创建的链添加一条规则,告诉iptables将控制权返回给调用此链的链。

最后一行,iptables -I <chain> -p <protocol> -m multiport --dports <port> -j fail2ban-<name>将规则添加到INPUT链,该链立即将控制传递给我们的新fail2ban链。

因此,当前的流程是输入流量由我们的INPUT链处理。此时,它会将规则传递控制权发送到fail2ban链。该链中的第一个规则将控制权传递回称为INPUT链的链。

所以,在这一点上,控制只是来回传递,实际上没有发生任何事情。但是,我们已经设置了一个控制流程,可以容纳其他规则。当我们需要禁止IP地址时,我们可以向fail2ban链添加另一个规则,将其传递回INPUT链。

我们可以看到用于拆除fail2ban规则的补充操作,当服务停止时,这里:

actionstop = iptables -D <chain> -p <protocol> -m multiport --dports <port> -j fail2ban-<name>
             iptables -F fail2ban-<name>
             iptables -X fail2ban-<name>

这基本上只是颠倒了我们刚建立的所有规则。

禁用客户端时,将实施此规则:

actionban = iptables -I fail2ban-<name> 1 -s <ip> -j DROP

这告诉iptables丢弃来自该IP地址的任何数据包,这有效地禁止他们甚至再次尝试进行身份验证。

当bantime过去后,这条规则改变了禁令:

actionunban = iptables -D fail2ban-<name> -s <ip> -j DROP

如果您想查看实施了哪些规则以及当前禁止的IP地址,可以通过输入以下内容来检查当前的iptables规则:

sudo iptables -L

如果任何客户被禁止,他们将处于底层链。

第四步 - 重启fail2ban

对配置进行任何更改后,需要重新启动fail2ban以实施新规则。您可以通过输入以下命令来执行此操作:

sudo service fail2ban restart

要测试新规则,您可以创建另一个VPS实例,并在该计算机上有足够的时间错误地进行身份验证,以触发禁止规则。之后,您的SSH不会返回任何提示。

如果查看您配置的主机上的iptable规则,您将看到一条新规则:

sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
fail2ban-ssh  tcp  --  anywhere             anywhere             multiport dports ssh
​
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
​
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
​
Chain fail2ban-ssh (1 references)
target     prot opt source               destination         
DROP       all  --  xxx-xxxxxxxx.dyn.xxxxxxxxx.net  anywhere            
RETURN     all  --  anywhere             anywhere

您可以从底部看到新规则。

结论

您现在应该通过fail2ban使服务器成获得额外的安全性。虽然这是一个很好的开始,但更完整的解决方案是完全禁用密码身份验证并仅允许基于密钥的身份验证。更多Linux教程请前往腾讯云+社区学习更多知识。


参考文献:《How To Protect SSH with fail2ban on Debian 7》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JetpropelledSnake

Django学习笔记之模板渲染、模板语言、simple_tag、母版子版、静态配置文件

C:\Users\yangmingwei\PycharmProjects\yangmv> python manage.py startapp web

9440
来自专栏racaljk

静态库(.a)与动态库(.so)的简明介绍

gcc有很多关于静态库,动态库的选项如-l,-L,-fPIC,-shared -Wl,-soname,看着很复杂容易混淆,其实静态库和动态库都是应需而生,只要有...

20950
来自专栏FreeBuf

在Linux上通过可写文件获取root权限的多种方式

在Linux中,一切都可以看做文件,包括所有允许/禁止读写执行权限的目录和设备。当管理员为任何文件设置权限时,都应清楚并合理为每个Linux用户分配应有的读写执...

61200
来自专栏ytkah

修改lastpass主密码后需重启firefox才能加载已保存的站点密码或用导入工具

  最近索尼事件闹得沸沸扬扬,预防黑客先从升级密码开始。由于开发的需要一般是用firefox作为默认的浏览器,很早以前就装了lastpass密码管理器作为必备附...

31140
来自专栏MongoDB中文社区

使用mlaunch和m快速搭建MongoDB测试集群

不知道大家在使用MongoDB的时候有没有遇到突然想要一个集群但是手边又没有的时候?特别是我已经升级到4.0了,突然想要一个3.2的集群怎么办?然后去下载,改配...

12710
来自专栏极客慕白的成长之路

网站服务器修改SSH默认22端口

2K50
来自专栏武军超python专栏

2018年7月31日学习ubuntu的基础操作命令和打包压缩解压缩

今天遇到的新单词: faith n 信用,信任 usage n 用法 upload n上传

17840
来自专栏Java成神之路

JAVA之 JDK安装及环境变量配置

Path=%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

10810
来自专栏农夫安全

DenyHosts防御ssh暴力破解

前段时间博客刚上线不久,ssh服务就被暴力破解了十几万次,文章也被各种扫描器,爬虫血洗过了,也是醉了......wordpress又没多少重要的数据,我们大农夫...

37320
来自专栏阮一峰的网络日志

Linux 的启动流程

半年前,我写了《计算机是如何启动的?》,探讨BIOS和主引导记录的作用。 那篇文章不涉及操作系统,只与主板的板载程序有关。今天,我想接着往下写,探讨操作系统接管...

33250

扫码关注云+社区

领取腾讯云代金券