如何在 Ubuntu 14.04 上使用 Fail2Ban 保护 Apache 服务器
简介
操作 Web 服务器时,实施安全措施以保护您的站点和用户非常重要。使用防火墙策略保护您的网站和应用程序并使用密码验证限制对某些区域的访问是保护您的系统的一个很好的起点。但是,任何可公开访问的密码提示都可能会吸引恶意用户和机器人的蛮力尝试。
设置fail2ban可以帮助缓解这个问题。当用户反复无法对服务进行身份验证(或从事其他可疑活动)时,fail2ban可以通过动态修改正在运行的防火墙策略对违规 IP 地址发出临时禁令。每个fail2ban“监狱”通过检查服务写入的日志中是否存在指示失败尝试的模式来运行。使用包含的配置过滤器很容易设置fail2ban来监控 Apache 日志。
在本指南中,我们将演示如何安装fail2ban并对其进行配置以监控您的 Apache 日志中的入侵尝试。我们将使用 Ubuntu 14.04 服务器。
先决条件
在开始之前,您应该使用非 root 帐户设置 Ubuntu 14.04 服务器。此帐户应配置有sudo权限才能发出管理命令。要了解如何设置具有sudo权限的用户,请遵循我们的 Ubuntu 14.04](https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-14-04)[初始服务器设置指南。
安装Apache并配置密码认证
如果您有兴趣使用fail2ban保护您的 Apache 服务器,您可能已经设置并运行了一个服务器。如果没有,您可以使用apt从 Ubuntu 的默认存储库安装 Apache。
更新本地包索引并通过键入以下内容进行安装:
sudo apt-get update
sudo apt-get install apache2
fail2ban服务对于保护登录入口点很有用。为了使这对 Apache 安装有用,必须对服务器上的至少一部分内容实施密码身份验证。您可以按照本指南为您的 Apache 服务器配置密码保护。
安装Fail2Ban
一旦您的 Apache 服务器正在运行并启用密码身份验证,您就可以继续安装fail2ban(如果您在前面的步骤中已经设置了 Apache,我们会在此处重新获取另一个存储库):
sudo apt-get update
sudo apt-get install fail2ban
这将安装软件。默认情况下,fail2ban配置为仅禁止失败的 SSH 登录尝试。我们需要启用一些规则,将其配置为检查我们的 Apache 日志中是否存在指示恶意活动的模式。
调整 Fail2Ban 中的常规设置
首先,我们需要调整fail2ban使用的配置文件,以确定要监视哪些应用程序日志以及在发现违规条目时要采取哪些措施。提供的/etc/fail2ban/jail.conf文件是为此提供的主要资源。
要进行修改,我们需要将此文件复制到/etc/fail2ban/jail.local。如果包更新提供了新的默认文件,这将防止我们的更改被覆盖:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
打开新复制的文件,这样我们就可以设置我们的 Apache 日志监控:
sudo nano /etc/fail2ban/jail.local
更改默认值
我们应该首先评估文件中设置的默认值,看看它们是否适合我们的需要。这些将在文件中的[DEFAULT]部分下找到。这些项目设置了一般策略,并且每个项目都可以在特定的监狱中被覆盖。
首先要查看的项目之一是不受fail2ban策略约束的客户端列表。这是由ignoreip指令设置的。有时将您自己的 IP 地址或网络添加到例外列表中以避免将自己锁定是一个好主意。如果您能够保持 shell 访问,这对于 Web 服务器登录来说不是问题,因为您总是可以手动撤销禁令。您可以将其他 IP 地址或以空格分隔的网络添加到现有列表中:
/etc/fail2ban/jail.local
[DEFAULT]
. . .
ignoreip = 127.0.0.1/8 your_home_IP
您可能想要调整的另一个项目是bantime,它控制违规成员被禁止的秒数。理想的做法是将其设置为足够长的时间以破坏恶意行为者的努力,同时又足够短以允许合法用户纠正错误。默认情况下,这设置为 600 秒(10 分钟)。根据需要增加或减少此值:
/etc/fail2ban/jail.local
[DEFAULT]
. . .
bantime = 3600
接下来的两项确定用于确定违规客户端的日志行的范围。findtime以秒为单位指定时间量,maxretry指令指示在该时间内允许的尝试次数。如果客户端在findtime设置的时间内尝试超过maxretry次,他们将被禁止:
/etc/fail2ban/jail.local
[DEFAULT]
. . .
findtime = 3600 # These lines combine to ban clients that fail
maxretry = 6 # to authenticate 6 times within a half hour.
设置邮件通知(可选)
如果您希望在禁令发生时接收邮件,您可以启用电子邮件通知。为此,您必须首先在您的服务器上设置一个 MTA,以便它可以发送电子邮件。要了解如何使用 Postfix 完成此任务,请遵循本指南。
设置 MTA 后,您必须在/etc/fail2ban/jail.local文件的[DEFAULT]部分调整一些附加设置。首先设置mta指令。如果你设置 Postfix,就像上面的教程演示的那样,把这个值改为“mail”:
/etc/fail2ban/jail.local
[DEFAULT]
. . .
mta = mail
您需要选择将发送通知的电子邮件地址。使用此值修改destemail指令。sendername指令可用于修改通知电子邮件中的“发件人”字段:
/etc/fail2ban/jail.local
[DEFAULT]
. . .
destemail = youraccount@email.com
sendername = Fail2BanAlerts
用fail2ban的说法,“动作”是客户端多次失败验证时所遵循的过程。默认操作(称为action_)是简单地禁止相关端口的 IP 地址。但是,如果您设置了邮件,还可以使用另外两个预制操作。
您可以使用action_mw操作禁止客户端并向您配置的帐户发送电子邮件通知,其中包含有关违规地址的“whois”报告。您还可以使用action_mwl操作,它执行相同的操作,但还包括触发禁令的违规日志行:
/etc/fail2ban/jail.local
[DEFAULT]
. . .
action = %(action_mwl)s
配置Fail2Ban监控Apache日志
现在您已经有了一些通用的fail2ban设置,我们可以专注于启用特定于 Apache 的监狱,它将监控我们的 Web 服务器日志以了解特定的行为模式。
配置文件中的每个监狱都由一个标头标记,该标题包含方括号中的监狱名称(除了[DEFAULT]部分之外的每个部分都表示特定监狱的配置)。默认情况下,仅启用[ssh]jail。
要启用 Apache 登录尝试的日志监控,我们将启用[apache]监狱。编辑本节中的enabled指令,使其显示为“true”:
/etc/fail2ban/jail.local
[apache]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache*/*error.log
maxretry = 6
. . .
如果您的 Apache 服务器正在写入默认日志位置 (/var/log/apache/error.log),则 jail 已配置为在正确的位置查找。如果您要登录到其他位置,请根据需要修改logpath。此外,如果您希望为此特定监狱设置不同的限制,请随意调整maxretry指令或为此监狱添加findtime值:
/etc/fail2ban/jail.local
[apache]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache/custom_log_location.log
maxretry = 3
findtime = 600
. . .
上述监狱将负责禁止基本身份验证失败。还有一些其他预配置的监狱值得启用([apache-multiport]监狱是不需要的传统监狱)。
[apache-noscript]监狱用于禁止在网站上搜索脚本以执行和利用的客户端。如果您不将 PHP 或任何其他语言与您的 Web 服务器结合使用,您可以启用此监狱来禁止那些请求这些类型资源的人:
/etc/fail2ban/jail.local
[apache-noscript]
enabled = true
. . .
[apache-overflows]jail 用于阻止试图请求异常长且可疑的 URL 的客户端。这些通常是试图通过触发缓冲区溢出来利用 Apache 的迹象。如果您希望防止这些类型的攻击,您可以启用此监狱:
/etc/fail2ban/jail.local
[apache-overflows]
enabled = true
. . .
可以通过复制和粘贴[apache-overflows]条目并稍微修改它来进行一些额外的检查。例如,您可以复制并粘贴该部分并将监狱名称和过滤器修改为apache-badbots以阻止一些已知的恶意机器人请求模式:
/etc/fail2ban/jail.local
[apache-overflows]
enabled = true
port = http,https
filter = apache-overflows
logpath = /var/log/apache*/*error.log
maxretry = 2
[apache-badbots]
enabled = true
port = http,https
filter = apache-badbots
logpath = /var/log/apache*/*error.log
maxretry = 2
如果您不使用 Apache 来提供对用户主目录中 Web 内容的访问,您可以再次复制并粘贴,并将 jail 和过滤器名称更改为apache-nohome:
/etc/fail2ban/jail.local
[apache-overflows]
enabled = true
port = http,https
filter = apache-overflows
logpath = /var/log/apache*/*error.log
maxretry = 2
[apache-badbots]
enabled = true
port = http,https
filter = apache-badbots
logpath = /var/log/apache*/*error.log
maxretry = 2
[apache-nohome]
enabled = true
port = http,https
filter = apache-nohome
logpath = /var/log/apache*/*error.log
maxretry = 2
最后,如果您将 Apache 与 PHP 一起使用,您可能需要启用[php-url-fopen]jail,它会阻止将某些 PHP 行为用于恶意目的的尝试。您可能必须更改logpath指令以指向正确的访问日志位置(在 Ubuntu 上,默认位置是/var/log/apache2/access.log)。您可以使用类似于匹配其他监狱中的错误日志的模式:
/etc/fail2ban/jail.local
[php-url-fopen]
enabled = true
port = http,https
filter = php-url-fopen
logpath = /var/log/apache*/*access.log
完成所需的修改后,保存并关闭文件。
实现你的 Apache Jails
要实施配置更改,您需要重新启动fail2ban服务。您可以通过键入:
sudo service fail2ban restart
该服务应该重新启动,实施您配置的不同禁止策略。
获取有关已启用监狱的信息
您可以使用fail2ban-client命令查看所有启用的监狱:
sudo fail2ban-client status
您应该会看到您启用的所有监狱的列表:
OutputStatus
|- Number of jail: 7
`- Jail list: php-url-fopen, apache-overflows, apache-noscript, ssh, apache-badbots, apache-nohome, apache
您可以看到fail2ban已修改您的防火墙规则以创建用于禁止客户端的框架。即使以前没有防火墙规则,您现在也可以启用一个框架,允许fail2ban通过将客户端添加到专用链来选择性地禁止它们:
sudo iptables -S
Output-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N fail2ban-apache
-N fail2ban-apache-badbots
-N fail2ban-apache-nohome
-N fail2ban-apache-noscript
-N fail2ban-apache-overflows
-N fail2ban-php-url-fopen
-N fail2ban-ssh
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-nohome
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-badbots
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-php-url-fopen
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-overflows
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache-noscript
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-apache
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A fail2ban-apache -j RETURN
-A fail2ban-apache-badbots -j RETURN
-A fail2ban-apache-nohome -j RETURN
-A fail2ban-apache-noscript -j RETURN
-A fail2ban-apache-overflows -j RETURN
-A fail2ban-php-url-fopen -j RETURN
-A fail2ban-ssh -j RETURN
如果您想查看任何监狱执行的禁令的详细信息,再次使用fail2ban-client可能更容易:
sudo fail2ban-client status apache
OutputStatus for the jail: apache
|- filter
| |- File list: /var/log/apache2/error.log
| |- Currently failed: 0
| `- Total failed: 0
`- action
|- Currently banned: 0
| `- IP list:
`- Total banned: 0
测试 Fail2Ban 策略
测试您的fail2ban策略以确保它们按预期阻止流量非常重要。例如,对于 Apache 身份验证提示,您可以多次提供不正确的凭据。超过限制后,您应该被禁止并且无法访问该网站。如果您设置了电子邮件通知,您应该会在您提供的电子邮件帐户中看到有关禁令的消息。
如果您使用fail2ban-client命令查看状态,您将看到您的 IP 地址被该站点禁止访问:
sudo fail2ban-client status apache
OutputStatus for the jail: apache
|- filter
| |- File list: /var/log/apache2/error.log
| |- Currently failed: 0
| `- Total failed: 12
`- action
|- Currently banned: 1
| `- IP list: 111.111.111.111
`- Total banned: 1
当您对您的规则有效时感到满意时,您可以通过键入以下内容手动取消禁止您的 IP 地址为fail2ban-client:
sudo fail2ban-client set apache unbanip 111.111.111.111
您现在应该能够再次尝试身份验证。
结论
在最简单的情况下,设置fail2ban来保护您的 Apache 服务器是相当简单的。但是,fail2ban提供了极大的灵活性来构建适合您特定安全需求的策略。通过查看/etc/fail2ban/jail.local文件中的变量和模式,以及它在/etc/fail2ban/filter.d和/etc/fail2ban/action.d目录中依赖的文件,您可以找到许多需要调整和更改的部分。学习如何使用fail2ban保护您的服务器的基础知识可以以最少的努力为您提供大量的安全性。
要了解有关fail2ban的更多信息,请查看其中一些链接:
-
Fail2Ban 如何保护 Linux 服务器上的服务
-
如何在 Ubuntu 14.04 上使用 Fail2Ban 保护 SSH
-
如何在 Ubuntu 14.04 上使用 Fail2Ban 保护 Nginx 服务器
更多推荐

所有评论(0)