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

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

介绍

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

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

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

先决条件

在开始之前,您应该使用非 root 帐户设置 Ubuntu 14.04 服务器。 此帐户应配置有 sudo 权限才能发出管理命令。 要了解如何设置具有 sudo 权限的用户,请按照我们的 Ubuntu 14.04 初始服务器设置指南进行操作。

安装 Nginx 并配置密码认证

如果您有兴趣使用 fail2ban 保护您的 Nginx 服务器,您可能已经设置并运行了一个服务器。 如果没有,您可以使用 apt 从 Ubuntu 的默认存储库安装 Nginx。

更新本地包索引并通过键入以下内容进行安装:

sudo apt-get update
sudo apt-get install nginx

fail2ban 服务对于保护登录入口点很有用。 为了使这对 Nginx 安装有用,必须对服务器上的至少一部分内容实施密码身份验证。 您可以按照本指南为您的Nginx服务器配置密码保护。

安装 Fail2Ban

一旦你的 Nginx 服务器运行并启用了密码验证,你就可以继续安装 fail2ban(如果你已经在前面的步骤中设置了 Nginx,我们会在此处重新获取另一个存储库):

sudo apt-get update
sudo apt-get install fail2ban

这将安装软件。 默认情况下,fail2ban 配置为仅禁止失败的 SSH 登录尝试。 我们需要启用一些规则,将其配置为检查我们的 Nginx 日志中是否存在指示恶意活动的模式。

调整 Fail2Ban 中的常规设置

首先,我们需要调整 fail2ban 使用的配置文件,以确定要监视哪些应用程序日志以及在发现违规条目时要采取的措施。 提供的 /etc/fail2ban/jail.conf 文件是为此提供的主要资源。

要进行修改,我们需要将此文件复制到 /etc/fail2ban/jail.local。 如果包更新提供了新的默认文件,这将防止我们的更改被覆盖:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

打开新复制的文件,这样我们就可以设置我们的 Nginx 日志监控:

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 来监控 Nginx 日志

现在您已经有了一些通用的 fail2ban 设置,我们可以集中精力启用一些特定于 Nginx 的监狱,这些监狱将监控我们的 Web 服务器日志以了解特定的行为模式。

配置文件中的每个监狱都由包含方括号中的监狱名称的标头标记(除 [DEFAULT] 部分之外的每个部分都表示特定监狱的配置)。 默认情况下,仅启用 [ssh] jail。

为了对 Nginx 登录尝试启用日志监控,我们将启用 [nginx-http-auth] 监狱。 编辑本节中的 enabled 指令,使其显示为“true”:

/etc/fail2ban/jail.local

[nginx-http-auth]

enabled  = true
filter   = nginx-http-auth
port     = http,https
logpath  = /var/log/nginx/error.log
. . .

这是 Ubuntu 的 fail2ban 软件包中唯一包含的 Nginx 特定的监狱。 但是,我们可以创建自己的监狱来添加额外的功能。 这些附加监狱的灵感和一些实现细节来自 herehere

我们可以创建一个 [nginx-noscript] 监狱来禁止正在网站上搜索脚本以执行和利用的客户端。 如果您不将 PHP 或任何其他语言与您的 Web 服务器结合使用,您可以添加此监狱以禁止那些请求这些类型资源的人:

/etc/fail2ban/jail.local

[nginx-noscript]

enabled  = true
port     = http,https
filter   = nginx-noscript
logpath  = /var/log/nginx/access.log
maxretry = 6
. . .

我们可以添加一个名为 [nginx-badbots] 的部分来阻止一些已知的恶意 bot 请求模式:

/etc/fail2ban/jail.local

[nginx-badbots]

enabled  = true
port     = http,https
filter   = nginx-badbots
logpath  = /var/log/nginx/access.log
maxretry = 2

如果您不使用 Nginx 提供对用户主目录中 Web 内容的访问,您可以通过添加 [nginx-nohome] 监狱来禁止请求这些资源的用户:

/etc/fail2ban/jail.local

[nginx-nohome]

enabled  = true
port     = http,https
filter   = nginx-nohome
logpath  = /var/log/nginx/access.log
maxretry = 2

我们应该禁止客户端尝试使用我们的 Nginx 服务器作为开放代理。 我们可以添加一个 [nginx-noproxy] 监狱来匹配这些请求:

/etc/fail2ban/jail.local

[nginx-noproxy]

enabled  = true
port     = http,https
filter   = nginx-noproxy
logpath  = /var/log/nginx/access.log
maxretry = 2

完成所需的修改后,保存并关闭文件。 我们现在必须为我们创建的监狱添加过滤器。

为其他 Nginx 监狱添加过滤器

我们更新了 /etc/fail2ban/jail.local 文件,添加了一些额外的监狱规范,以匹配和禁止更大范围的不良行为。 我们需要为我们创建的监狱创建过滤器文件。 这些过滤器文件将指定要在 Nginx 日志中查找的模式。

首先切换到过滤器目录:

cd /etc/fail2ban/filter.d

我们实际上想首先调整预先提供的 Nginx 身份验证过滤器以匹配附加的失败登录日志模式。 打开文件进行编辑:

sudo nano nginx-http-auth.conf

failregex 规范下方,添加一个附加模式。 这将匹配用户未输入用户名或密码的行:

/etc/fail2ban/filter.d/nginx-http-auth.conf

[Definition]


failregex = ^ \[error\] \d+#\d+: \*\d+ user "\S+":? (password mismatch|was not found in ".*"), client: <HOST>, server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$
            ^ \[error\] \d+#\d+: \*\d+ no user/password was provided for basic authentication, client: <HOST>, server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$

ignoreregex =

完成后保存并关闭文件。

接下来,我们可以复制 apache-badbots.conf 文件以与 Nginx 一起使用。 我们可以按原样使用此文件,但为了清楚起见,我们会将其复制为新名称。 这与我们在 jail 配置中引用过滤器的方式相匹配:

sudo cp apache-badbots.conf nginx-badbots.conf

接下来,我们将为我们的 [nginx-noscript] 监狱创建一个过滤器:

sudo nano nginx-noscript.conf

将以下定义粘贴到里面。 随意调整脚本后缀以删除服务器合法使用的语言文件或添加其他后缀:

/etc/fail2ban/filter.d/nginx-noscript.conf

[Definition]

failregex = ^<HOST> -.*GET.*(\.php|\.asp|\.exe|\.pl|\.cgi|\.scgi)

ignoreregex =

保存并关闭文件。

接下来,为 [nginx-nohome] 监狱创建一个过滤器:

sudo nano nginx-nohome.conf

将以下过滤器信息放入文件中:

/etc/fail2ban/filter.d/nginx-nohome.conf

[Definition]

failregex = ^<HOST> -.*GET .*/~.*

ignoreregex =

完成后保存并关闭文件。

最后,我们可以为 [nginx-noproxy] 监狱创建过滤器:

sudo nano nginx-noproxy.conf

此过滤器定义将匹配使用您的服务器作为代理的尝试:

/etc/fail2ban/filter.d/nginx-noproxy.conf

[Definition]

failregex = ^<HOST> -.*GET http.*

ignoreregex =

完成后保存并关闭文件。

激活你的 Nginx 监狱

要实现配置更改,您需要重新启动 fail2ban 服务。 您可以通过键入:

sudo service fail2ban restart

该服务应该重新启动,实施您配置的不同禁止策略。

获取有关已启用监狱的信息

您可以使用 fail2ban-client 命令查看所有启用的监狱:

sudo fail2ban-client status

您应该会看到您启用的所有监狱的列表:

OutputStatus
|- Number of jail:      6
`- Jail list:           nginx-noproxy, nginx-noscript, nginx-nohome, nginx-http-auth, nginx-badbots, ssh

您可以查看 iptables 以了解 fail2ban 已修改您的防火墙规则以创建用于禁止客户端的框架。 即使以前没有防火墙规则,您现在也可以启用一个框架,允许 fail2ban 通过将客户端添加到专用链来选择性地禁止客户端:

sudo iptables -S
Output-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N fail2ban-nginx-badbots
-N fail2ban-nginx-http-auth
-N fail2ban-nginx-nohome
-N fail2ban-nginx-noproxy
-N fail2ban-nginx-noscript
-N fail2ban-ssh
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-noproxy
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-nohome
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-badbots
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-noscript
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-http-auth
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A fail2ban-nginx-badbots -j RETURN
-A fail2ban-nginx-http-auth -j RETURN
-A fail2ban-nginx-nohome -j RETURN
-A fail2ban-nginx-noproxy -j RETURN
-A fail2ban-nginx-noscript -j RETURN
-A fail2ban-ssh -j RETURN

如果您想查看任何监狱执行的禁令的详细信息,再次使用 fail2ban-client 可能更容易:

sudo fail2ban-client status nginx-http-auth
OutputStatus for the jail: nginx-http-auth
|- filter
|  |- File list:        /var/log/nginx/error.log 
|  |- Currently failed: 0
|  `- Total failed:     0
`- action
   |- Currently banned: 0
   |  `- IP list:
   `- Total banned:     0

测试 Fail2Ban 策略

测试您的 fail2ban 策略以确保它们按预期阻止流量非常重要。 例如,对于 Nginx 身份验证提示,您可以多次提供不正确的凭据。 超过限制后,您应该被禁止并且无法访问该网站。 如果您设置了电子邮件通知,您应该会在您提供的电子邮件帐户中看到有关禁令的消息。

如果您使用 fail2ban-client 命令查看状态,您将看到您的 IP 地址被该站点禁止访问:

sudo fail2ban-client status nginx-http-auth
OutputStatus for the jail: nginx-http-auth
|- filter
|  |- File list:        /var/log/nginx/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 nginx-http-auth unbanip 111.111.111.111

您现在应该能够再次尝试身份验证。

结论

在最简单的情况下,设置 fail2ban 来保护你的 Nginx 服务器是相当简单的。 但是,fail2ban 提供了极大的灵活性来构建适合您特定安全需求的策略。 通过查看 /etc/fail2ban/jail.local 文件中的变量和模式,以及它在 /etc/fail2ban/filter.d/etc/fail2ban/action.d 目录中依赖的文件,您可以找到许多需要调整和调整的部分随着您需求的变化而变化。 学习如何使用 fail2ban 保护您的服务器的基础知识可以以最少的努力为您提供大量的安全性。

如果您想了解有关 fail2ban 的更多信息,请查看以下链接: