使用Fail2ban保护SSH

・9 分钟阅读

SSH允许你登录到远程计算机或服务器,并通过命令行接口控制它,但是,由于SSH是暴露在互联网上; 攻击者可以尝试通过尝试各种用户名和密码组合来登录。

保护SSH的一个好方法是在登录失败次数过多的情况下禁止登录IP地址。为此,您可以使用名为"fail2ban "的程序包,它可以使用最少的配置。此外,您甚至可以配置Fail2ban以保护其他应用程序,如Web服务器。

在本文中,我们将介绍如何使用Fail2ban保护SSH ,这些指令应该在现代版本的Ubuntu (16.04和更高版本),Debian和CentOS 7.

正在安装Fail2ban

在Debian和Ubuntu上,你可以通过以下方式安装Fail2ban :

sudo apt updatesudo apt install fail2ban

在CentOS上,你应该首先启用EPEL存储库,并且安装Fail2ban 。

sudo yum -y install epel-releasesudo yum -y install fail2ban

现在,使用文本编辑器(如nano )创建/etc/fail2ban/jail.local

sudo nano /etc/fail2ban/jail.local

在文本编辑器中,键入以下文本:

[sshd]enabled = truebanaction = iptables-multiport

保存文件内容并退出文本编辑器,然后,启用Fail2ban服务并启动它:

sudo systemctl enable fail2bansudo systemctl restart fail2ban

如果它注意到在10分钟内发生了5次失败的登录,则Fail2ban将阻止IP 10分钟,

Fail2ban基础知识

那是怎样工作的? 简单来说,Fail2ban是监控日志,并且根据它内容采取操作的守护进程,它由三种类型的配置驱动:

  • 筛选器指定Fail2ban在日志文件中识别的特定文本模式,
  • 操作是Fail2ban能做的事情,
  • jail告诉Fail2ban在某些日志上匹配筛选器,当匹配数超出监狱中指定的某一限制时,Fail2ban将获取在监狱中指定的操作,

Fail2ban带有一个监狱,指示它查看系统日志,并且对SSH的攻击采取行动。默认动作(稍后将详细讨论)添加规则来阻止攻击者。

在上一节中,我们将"sshd "jail的"enabled "设置为true,以便Fail2ban可以阻止这些攻击。在下一节中,我们将了解如何配置Fail2ban的某些方面。

配置jail

虽然默认设置足以满足大多数需求,但是,有时您可能需要更改内容以便更好地满足您的需求。

比如说,如果他们试图在12小时内尝试10次登录,你想要屏蔽那个IP地址一天。要执行这个操作,请打开/etc/fail2ban/jail.local文件,以前,我们在这个文件中设置了"启用"设置,现在,我们将在文件末尾添加以下设置:


maxretry = 10findtime = 43200bantime = 86400

文件将以如下形式显示:

[sshd]enabled = truebanaction = iptables-multiportmaxretry = 10findtime = 43200bantime = 86400

这里:

  • maxretry控制允许重试的最大次数,
  • findtime指定用于禁止IP的时间窗口(以秒为单位),(43200秒为12小时)
  • bantime指定将被禁止(86400秒为24小时)地址的时间窗口(以秒为单位),

如果已将SSH移动到其他端口,也可以在此文件中指定带有port =的端口号。

要使这些更改生效,请使用以下命令重新启动Fail2ban :

sudo systemctl restart fail2ban

配置操作

在"安装Fail2ban "部分中,我们设置Fail2ban以使用"iptables-multiport "操作。默认情况下,它拒绝带有"unreachable消息的包,如果要丢弃数据包而不是拒绝数据包,请创建,/etc/fail2ban/action.d/iptables-common.local 然后键入以下内容:

[Init]blocktype = DROP

如果要采取完全自定义操作,必须首先定义一个操作文件,/etc/fail2ban/action.d/my-action.local , (您可以将文件命名为您想要的任何内容,只要它具有.local扩展名,)典型的操作文件如下所示:

[Definition]actionstart = ...actionstop = ...actioncheck = ...actionban = ...actionunban = ...

如他们的名称所提示的,actionstart和actionstop允许你指定在Fail2ban启动和关闭时将运行的初始化命令,当Fail2ban想要阻止IP时,actionbanactionunban指定要运行的命令,另外,Fail2ban可能还需要验证IP是否已经被阻塞,actioncheck中指定的命令可以帮助它这样做。

要查看此示例的实际示例,请查看 /etc/fail2ban/action.d/iptables-multiport.conf 文件。

指定这些命令时,可以使用占位符获取攻击者的IP地址。

编写了操作文件后,在/etc/fail2ban/jail.local定义的SSH狱中,可以通过设置以下操作来设置操作:

banaction = my-action

阻止多个jail的重复犯罪者

作为服务器管理员,您可能已经注意到,尽管存在屏蔽,仍有一些IP会一遍又一遍地强制执行。你可以通过设置低一些的值maxretry和findtime以及bantime的高一些的值来解决这个问题,但是,这种风险可能会误杀合法用户,幸好,你可以通过设置多个jail来阻止这些攻击。

在我们的例子中,我们将定义一个名为sshlongterm的jail ,如果有35个失败尝试登录尝试超过3天,它将阻止一个星期的IP 。

但是,在开始之前,我们需要默认的jail配置,打开/etc/fail2ban/jail.conf,并且查找只包含[sshd]的行,此行下方提到了默认配置。在Ubuntu 16.04上,缺省配置如下所示:

[sshd]port = sshlogpath = %(sshd_log)s

将这些规则复制到/etc/fail2ban/jail.local,在sshlongterm jail的定义下,文件的外观应该如下所示:

[sshd]; rules for the default SSH jail[sshlongterm]port = sshlogpath = %(sshd_log)s

现在你需要设置监狱的主要规则,这包括设置过滤器类型,以及maxretry,findtime和bantime的值,添加以下行:


banaction = iptables-multiportmaxretry = 35findtime = 259200bantime = 608400enabled = truefilter = sshd

这些设置允许3天内最多35次登录失败, 超出阻止IP一周。

完整的监狱最终会像这样

[sshlongterm]port = sshlogpath = %(sshd_log)sbanaction =iptables-multiportmaxretry = 35findtime = 259200bantime = 608400enabled = truefilter = sshd

重新启动fail2ban使这些更改生效。

默认的监狱以及sshlongterm监狱现在应该可以联合工作了,短期攻击将由缺省监狱处理,而且长期攻击由我们自己的监狱处理。

结束语

就像我们所看到的,Fail2ban立即保护SSH ,通过一些配置,它可以使大规模的暴力攻击成为一个微不足道的问题。

Zhongy0410 profile image