如何在Ubuntu14.04上使用Fail2Ban保护Apache服务器

来自菜鸟教程
跳转至:导航、​搜索

介绍

操作 Web 服务器时,实施安全措施以保护您的站点和用户非常重要。 使用防火墙策略保护您的网站和应用程序并使用密码验证限制对某些区域的访问是保护您的系统的一个很好的起点。 但是,任何可公开访问的密码提示都可能会吸引恶意用户和机器人的蛮力尝试。

设置 fail2ban 可以帮助缓解这个问题。 当用户反复无法对服务进行身份验证(或从事其他可疑活动)时,fail2ban 可以通过动态修改正在运行的防火墙策略对违规 IP 地址发出临时禁令。 每个 fail2ban “监狱”通过检查服务写入的日志中是否存在指示失败尝试的模式来运行。 使用包含的配置过滤器很容易设置 fail2ban 来监控 Apache 日志。

在本指南中,我们将演示如何安装 fail2ban 并将其配置为监控您的 Apache 日志中的入侵尝试。 我们将使用 Ubuntu 14.04 服务器。

先决条件

在开始之前,您应该使用非 root 帐户设置 Ubuntu 14.04 服务器。 此帐户应配置有 sudo 权限才能发出管理命令。 要了解如何设置具有 sudo 权限的用户,请按照我们的 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 内容的访问,您可以再次复制和粘贴,并将监狱和过滤器名称更改为 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] 监狱,它会阻止将某些 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 的更多信息,请查看以下链接: