介绍
将服务器或计算机连接到网络会带来一定的风险。 任何连接到互联网的机器(包括 VPS)都是恶意攻击的潜在目标。
虽然拥有配置良好的防火墙可以防止多种非法访问,但您仍然需要打开某些服务以允许自己登录和管理服务器。 SSH 是最常用于登录远程系统的服务,因此它也是最常成为攻击目标的服务之一。
幸运的是,有一种工具可以缓解这种攻击向量,称为 fail2ban。 这可以配置为允许使用 SSH 进行合法登录,但在 IP 地址在一定次数后未能正确验证后禁止 IP 地址。
我们将在 Debian 7 VPS 上安装和配置该软件。
第一步——安装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 配置为在它制定禁令时向您发送电子邮件,您也可以在默认部分进行配置。
如果您在您的机器上配置了邮件服务器,您可以配置 fail2ban 以将电子邮件发送到外部地址。 否则,您可以将其发送到本地 unix 帐户。
有两个相关参数:
- destemail:此选项设置在被禁止时将通知的电子邮件地址。
- 默认值为“root@localhost”,将邮件投递到当前计算机的root帐户。
- 如果您配置了邮件服务器,请随时将其更改为外部邮寄地址。
- mta:这指定将用于传递邮件的邮件代理。
- 如果您的邮件服务器配置了 sendmail,请保持默认选项 (sendmail) 不变。
- 如果您没有配置邮件服务器,但希望将本地邮件发送到用户帐户,您可以将“sendmail”更改为“mail”。
如果您确实希望配置电子邮件,则必须如上所述编辑 action
参数。 将操作更改为“action_mw”或“action_mwl”以将电子邮件信息传递给禁止脚本。
如果您已配置本地邮件传递,则可以通过键入以下内容来检查邮件:
sudo nano /var/mail/mail
配置特定于应用程序的监狱
在文件的更下方,您应该看到标记如下的部分:
[应用程序名称]
您应该能够破译大部分参数。
filter
参数指定 /etc/fail2ban/filter.d
目录中的文件。 这告诉fail2ban 如何解析程序的日志文件以查找失败的身份验证尝试。
logpath
变量保存服务日志文件的路径,fail2ban 将解析失败。
您可以在此处覆盖任何其他默认参数。 例如,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 链(在我们的 jail.local 文件中指定)添加了一条规则,该规则立即将控制权传递给我们的新 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 地址的任何数据包,从而有效地禁止它们甚至尝试再次进行身份验证。
当禁令时间过去后,这条规则会撤销禁令:
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
您可以从底部第二个看到新规则。
结论
您现在应该通过使您的服务器成为更难暴力破解的目标来获得一些额外的安全性。 虽然这是一个很好的开始,但更完整的解决方案是完全禁用密码身份验证并仅允许基于密钥的身份验证。