对于SSH服务的常见的攻击就是暴力破解攻击——远程攻击者通过不同的密码来无限次地进行登录尝试。当然SSH可以设置使用非密码验证验证方式来对抗这种攻击,例如公钥验证或者双重验证。将不同的验证方法的优劣处先放在一边,如果我们必须使用密码验证方式怎么办?你是如何保护你的 SSH 服务器免遭暴力破解攻击的呢?
幸运的是,有一种工具可以缓解这种攻击这个工具是fail2ban。这可以配置为允许使用SSH进行合法登录,但在经过一定次数后无法正确验证后攻击将禁用IP地址。我们将在Debian上安装和配置该软件。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后在购买服务器。
Debian在其默认存储库中包含fail2ban。我们可以使用以下命令下载并安装它:
sudo apt-get update
sudo apt-get install fail2ban
这不仅会安装fail2ban,还会自动设置启动服务。
fail2ban配置保存在/etc/fail2ban
目录中。默认禁止规则的配置文件称为jail.conf
。
由于fail2ban在程序有新版本时更新其配置文件的方式,因此我们不应编辑默认配置文件。
相反,我们应该将其复制到新位置进行编辑:
cd /etc/fail2ban
sudo cp jail.conf jail.local
sudo nano jail.local
在这里,我们可以更改默认配置中设置。
开始的部分[DEFAULT]
是配置默认值,可以在配置中稍后的更具体的上下文中覆盖这些默认值。已经给出的大多数设置都是默认选项的选择。
我们可以通过修改一些参数来配置fail2ban实现禁止的方式。以下是一些更重要的内容:
YOUR_IP_ADDRESS
”当需要禁令时,fail2ban可以以不同的方式进行。它通过查看以下参数来决定必要的操作:
/etc/fail2ban/action.d
目录中的文件,该文件将处理实际的禁止过程。iptables
在身份验证失败时禁止所有端口上的IP。我们稍后会讨论具体的禁止规则。banaction
脚本(如上所述),然后为变量分配适当的信息并将它们传递给脚本。
action_
调用脚本并将名称,端口,协议和链传递给脚本。它不会像其他一些操作那样发送电子邮件地址或日志行。如果您希望将fail2ban配置为在禁止IP后通过电子邮件发送给您,您也可以在默认部分配置它。
如果已在计算机上配置了邮件服务器,则可以配置fail2ban以将电子邮件发送到外部邮件。
有两个相关参数:
root@localhost
将邮件传递到当前计算机的root帐户。如果您希望配置电子邮件,则必须如上所述编辑action
参数。将操作更改为“actionmw”或“actionmwl”,以将电子邮件信息传递给禁止脚本。
如果您已配置本地邮件传递,则可以通过输入以下内容来检查邮件:
sudo nano /var/mail/mail
在文件的下方,你应该看到标记为这样的部分:
[application_name]
您应该能够破译大多数参数。
filter
参数指定/etc/fail2ban/filter.d
目录中的文件。这告诉fail2ban如何解析程序的日志文件以查看失败的身份验证。
如果fail2ban解析失败。logpath
变量保存服务日志文件的路径,
您可以在此处覆盖任何其他默认参数。例如,对于SSH,maxretry
选项与Debian安装中的dault选项不同。
我们实际上不会对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以实施新规则。您可以通过输入以下命令来执行此操作:
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》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。