介绍
连接到网络的服务器或计算机会带来一定的风险,任何机器,包括VPS,连接到互联网是潜在的恶意攻击目标。
虽然有一个配置良好的防火墙将防止许多类型的非法访问,但您仍然需要打开某些服务,以便您能够登录和管理服务器 SSH 是最常用的服务来登录远程系统,因此它也是最常见的目标之一。
幸运的是,有一种工具可以减轻这种攻击向量,称为 fail2ban. 这可以配置为允许使用SSH的合法登录,但禁止IP地址,因为它们在规定的次数后未能正确身份验证。
我们将在Debian 7 VPS上安装和配置此软件。
第一步:安装 fail2ban
Debian 包含 fail2ban 在其默认存储库中,我们可以使用以下命令来下载和安装它:
1sudo apt-get update
2sudo apt-get install fail2ban
这不仅会安装 fail2ban,还会以默认设置启动服务。
步骤二 - 配置 fail2ban
fail2ban 配置存储在 /etc/fail2ban
目录中,指定默认禁令规则的配置文件称为 `jail.conf。
由于 fail2ban 在程序有新版本时更新其配置文件的方式,我们不应该编辑默认配置文件。
相反,我们应该将其复制到一个新的位置并在那里编辑:
1cd /etc/fail2ban
2sudo cp jail.conf jail.local
3sudo nano jail.local
在这里,我们可以更改我们不喜欢的任何设置,这些设置是在默认配置中设置的。
默认配置
开始于[DEFAULT]
的部分配置了默认值,可以在更具体的背景下更晚地配置。
大多数已提供的设置都是默认选项的良好选择,但是,有一些区域会从配置中受益。
禁止缺陷
我们可以通过修改几个参数来配置 fail2ban 实施其禁令的方式,以下是其中一些更重要的参数:
- ignoreip:此参数列出了应该从 fail2ban 规则中排除的 IP 地址列表。 这里列出的 IP 地址或区块不会有限制,所以要明智地和具体地选择它们。
- IP 地址和范围是由白色空间分开的。
- 您应该将您的家庭或工作 IP 地址添加到列表的末尾,以便您不会被阻止,如果您遇到登录问题。
- 这将看起来像: "ignoreip = 127.0.1/8
YOUR_IP_ADDRESS
" *_bantime ****: 此列表列出了如果客户端未能正确身份验证,禁令的持续时间。
定义禁令行动
当需要禁令时, fail2ban 可以以几种不同的方式进行,它通过考虑以下参数来决定必要的行动:
- banaction:此设置指定了在需要禁令时使用的配置文件。
- 此参数的值指的是在
/etc/fail2ban/action.d
目录中的文件,该文件将处理实际禁令过程。 - 默认值使用 iptables(防火墙)在所有端口上禁用IP,当它失败身份验证时。我们将稍后查看特定禁令规则。
- action: 此参数指定了上面列出的操作短语之一。 它基本上称呼一个
banaction
脚本(如上所述),然后将适当信息分配给变量并传递给脚本。
- 默认操作是
action_
,它呼叫脚本
配置电子邮件警报
如果您想配置 fail2ban 以向您发送电子邮件,当它设置禁令时,您也可以在默认部分中配置此设置。
如果您在您的计算机上配置了邮件服务器,您可以配置 fail2ban 以将电子邮件发送到外部地址,否则您可以将其发送到本地Unix帐户。
有两个相关参数:
- destemail:此选项设置了在禁令的情况下将通知的电子邮件地址。
- 默认值
root@localhost
将邮件发送到当前计算机的 root 帐户。 - 如果您配置了邮件服务器,请放心将此更改为外部邮件地址。
- mta:此项指定将用于发送邮件的邮件代理。
如果您想要配置电子邮件,您将需要编辑如上所述的行动
参数。更改该操作为action_mw
或action_mwl
,以便将电子邮件信息传递到禁令脚本。
如果您已配置本地邮件发送,您可以通过键入检查邮件:
1sudo nano /var/mail/mail
设置应用程序特定的监狱
进一步在文件中,你应该看到类似于此标记的部分:
[application_name]
您应该能够解读大多数参数。
过滤器
参数指定了在 `/etc/fail2ban/filter.d 目录中的文件,这告诉 fail2ban 如何对程序的日志文件进行审查,以检测未成功的身份验证。
logpath
变量持有到服务的日志文件的路径,而 fail2ban 将对故障进行解析。
例如,maxretry
选项对于 SSH 与 Debian 安装中的 dault 选项不同。
步骤三:配置 iptables
我们实际上不会对 iptables 进行很多配置,但我们会看看执行其行为的配置文件,这将有助于我们了解 fail2ban 如何实施其禁止策略。
在banation
参数下打开我们监狱配置中指定的文件:
1sudo nano /etc/fail2ban/action.d/iptables-multiport.conf
在这里,我们可以看到当 fail2ban 呼叫 IP 被禁止时,实际上会发生什么。
当 fail2ban 开始时,它会调用这些行:
1actionstart = iptables -N fail2ban-<name>
2 iptables -A fail2ban-<name> -j RETURN # questionable usefulness
3 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
因此,当前的流量是,输入流量由我们的INPUT链处理,在这个时刻,它会触及传输控制的规则到fail2ban链,这个链中的第一个规则将控制传回称为INPUT链的链。
因此,在这一点上,控制只是向前转移,实际上没有发生任何事情。然而,我们已经设置了一个控制流,可以容纳额外的规则。当我们需要禁止IP地址时,我们可以将另一个规则添加到右上方的 fail2ban链中,然后将控制传回INPUT链中。
我们可以看到破坏 fail2ban 规则的补充行动,在服务停止时,在这里:
1actionstop = iptables -D <chain> -p <protocol> -m multiport --dports <port> -j fail2ban-<name>
2 iptables -F fail2ban-<name>
3 iptables -X fail2ban-<name>
这基本上只是扭转了我们刚刚建立的所有规则。
当您禁用客户端时,执行此规则:
1actionban = iptables -I fail2ban-<name> 1 -s <ip> -j DROP
这告诉iptables从该IP地址中放下任何包,这有效地禁止他们再次尝试身份验证。
当禁令时间过了,这个规则会扭转禁令:
1actionunban = iptables -D fail2ban-<name> -s <ip> -j DROP
如果您想查看哪些规则正在实施,哪些 IP 地址目前被禁止,您可以通过键入检查当前的 iptables 规则:
1sudo iptables -L
如果任何客户被禁止,他们将处于底链。
第四步:重新启动 fail2ban
当您对配置进行任何更改时,您需要重新启动 fail2ban 以实现新规则。
您可以通过输入这个命令来做到这一点:
1sudo service fail2ban restart
要测试你的新规则,你可以创建另一个VPS实例,并故意错误验证该机器足够的次数,以触发禁令规则。
如果您查看您配置的主机上的 iptable 规则,则会看到一个新的规则:
1sudo iptables -L
1Chain INPUT (policy ACCEPT)
2target prot opt source destination
3fail2ban-ssh tcp -- anywhere anywhere multiport dports ssh
4
5Chain FORWARD (policy ACCEPT)
6target prot opt source destination
7
8Chain OUTPUT (policy ACCEPT)
9target prot opt source destination
10
11Chain fail2ban-ssh (1 references)
12target prot opt source destination
13DROP all -- xxx-xxxxxxxx.dyn.xxxxxxxxx.net anywhere
14RETURN all -- anywhere anywhere
你可以从底部看到第二条规则。
结论
您现在应该通过使您的服务器成为更难的暴力目标来获得一些额外的安全性,虽然这是一个很好的开始,但一个更完整的解决方案将是完全禁用密码身份验证,并允许只有基于密钥的身份验证。