如何在 Ubuntu 14.04 上使用 Fail2Ban 保护 Nginx 服务器

介绍

在运行 Web 服务器时,重要的是要实施安全措施来保护您的网站和用户. 通过防火墙策略保护您的网站和应用程序,并限制使用密码身份验证访问某些区域是确保您的系统安全的一个很好的起点。

设置fail2ban可以帮助缓解这个问题。当用户多次未能验证服务(或参与其他可疑活动)时,fail2ban可以通过动态修改运行防火墙策略对侵犯的IP地址发出临时禁令。每个fail2ban``jail通过检查服务所写的日志,查找示意图表明未成功的尝试。设置fail2ban来监控 Nginx日志是相当简单的,使用了一些包含的配置过滤器,我们将自己创建一些。

在本指南中,我们将展示如何安装fail2ban,并将其配置为监控您的Nginx日志,以检测入侵尝试。

前提条件

在你开始之前,你应该有一个 Ubuntu 14.04 服务器,设置一个非 root 帐户. 这个帐户应该配置sudo权限以发出管理命令. 要了解如何设置具有sudo权限的用户,请遵循我们的 Ubuntu 14.04 初始服务器设置指南

安装 Nginx 并配置密码身份验证

如果您有興趣用「fail2ban」保護 Nginx 伺服器,您可能已經有一個伺服器設置並運行,否則您可以使用「apt」在 Ubuntu 的預設儲存庫中安裝 Nginx。

更新本地包索引并通过键入安装:

1sudo apt-get update
2sudo apt-get install nginx

fail2ban服务有助于保护登录入口点,以便在 Nginx 安装中使用,至少必须对服务器上的一小组内容实施密码验证。

安装 Fail2Ban

一旦您的 Nginx 服务器运行,并启用了密码身份验证,您可以继续安装 fail2ban(如果您在上一步中已经安装了 Nginx,我们会在这里添加另一个存储重置):

1sudo apt-get update
2sudo apt-get install fail2ban

这将安装软件. 默认情况下,‘fail2ban’配置为只禁止失败的SSH登录尝试。 我们需要启用一些规则,将其配置为检查我们的Nginx日志,以检测表明恶意活动的模式。

在 Fail2Ban 中调整一般设置

要开始,我们需要调整 fail2ban 使用的配置文件,以确定哪些应用程序日志要监控,以及在发现侵权条目时要采取哪些行动。

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

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

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

1sudo nano /etc/fail2ban/jail.local

改变缺陷

我们应该首先评估文件中设置的默认值,看看它们是否符合我们的需求。这些值将在文件中的DEFAULT部分中找到。

第一個要看的項目之一是不受「fail2ban」政策的客戶列表,這是由「ignoreip」指令所設定的。有時可以將自己的IP地址或網絡添加到例外列表中,以避免自己被鎖定。如果您能夠保持容器存取,這更不容易,因為您可以隨時手動取消禁令。

1[label /etc/fail2ban/jail.local]
2[DEFAULT]
3
4. . .
5ignoreip = 127.0.0.1/8 your_home_IP

您可能想要调整的另一个项目是破坏时间,它控制了侵权会员被禁用了多少秒。 理想情况是将此设置为足够长的时间来破坏恶意行为者的努力,而足够短的时间来允许合法用户纠正错误。

1[label /etc/fail2ban/jail.local]
2[DEFAULT]
3
4. . .
5bantime = 3600

接下来的两个条款决定了用于确定违规客户端的日志线的范围。findtime指定了秒数的时间,而maxretry指示了在该时间内容忍的尝试数量。

1[label /etc/fail2ban/jail.local]
2[DEFAULT]
3
4. . .
5findtime = 3600   # These lines combine to ban clients that fail
6maxretry = 6      # to authenticate 6 times within a half hour.

设置邮件通知(可选)

您可以启用电子邮件通知,如果您希望在发生禁令时收到邮件。 要做到这一点,您必须先在服务器上设置一个MTA,以便它可以发送电子邮件。

一旦你已经设置了MTA,你将不得不调整某些额外的设置在文件的 /etc/fail2ban/jail.local部分中。 开始通过设置 mta指令。 如果你设置了Postfix,如上面的教程所示,改变这个值为邮件:

1[label /etc/fail2ban/jail.local]
2[DEFAULT]
3
4. . .
5mta = mail

您需要选择将发送通知的电子邮件地址。 用此值修改destemail指令。 可以使用sendername指令在通知电子邮件中更改发送字段:

1[label /etc/fail2ban/jail.local]
2[DEFAULT]
3
4. . .
5destemail = [email protected]
6sendername = Fail2BanAlerts

fail2ban中,一个操作是当客户端过多次失败身份验证时所遵循的程序。默认操作(称为action_)是简单地禁止 IP 地址从所涉及的端口。

您可以使用「action_mw」操作来禁用客户端,并向配置的帐户发送电子邮件通知,并在侵权地址上发布whois报告,您也可以使用「action_mwl」操作,该操作可以做同样的事情,但还包括触发禁令的侵权日志行:

1[label /etc/fail2ban/jail.local]
2[DEFAULT]
3
4. . .
5action = %(action_mwl)s

配置 Fail2Ban 来监控 Nginx 日志

现在你已经有了一些一般的fail2ban设置,我们可以专注于启用一些 Nginx 特定的监狱,这些监控程序将监控我们的 Web 服务器日志,以检测特定行为模式。

配置文件中的每个监狱都被标记为包含监狱名称的标题(每个部分但[DEFAULT]部分表示特定监狱的配置)。

为了启用 Nginx 登录尝试的日志监控,我们将启用[nginx-http-auth]监狱。

1[label /etc/fail2ban/jail.local]
2[nginx-http-auth]
3
4enabled  = true
5filter   = nginx-http-auth
6port     = http,https
7logpath  = /var/log/nginx/error.log
8. . .

然而,我们可以创建自己的监狱来添加额外的功能. 这些额外监狱的灵感和一些实施细节来自于 这里这里

我们可以创建一个[nginx-noscript]监狱来禁止在网站上寻找脚本的客户执行和剥削,如果你不使用PHP或任何其他语言与你的Web服务器一起,你可以添加这个监狱来禁止那些要求这些类型的资源的人:

1[label /etc/fail2ban/jail.local]
2[nginx-noscript]
3
4enabled  = true
5port     = http,https
6filter   = nginx-noscript
7logpath  = /var/log/nginx/access.log
8maxretry = 6
9. . .

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

1[label /etc/fail2ban/jail.local]
2[nginx-badbots]
3
4enabled  = true
5port     = http,https
6filter   = nginx-badbots
7logpath  = /var/log/nginx/access.log
8maxretry = 2

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

1[label /etc/fail2ban/jail.local]
2[nginx-nohome]
3
4enabled  = true
5port     = http,https
6filter   = nginx-nohome
7logpath  = /var/log/nginx/access.log
8maxretry = 2

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

1[label /etc/fail2ban/jail.local]
2[nginx-noproxy]
3
4enabled  = true
5port     = http,https
6filter   = nginx-noproxy
7logpath  = /var/log/nginx/access.log
8maxretry = 2

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

添加额外的 Nginx 监狱的过滤器

我们已经更新了 /etc/fail2ban/jail.local 文件,加上一些额外的监狱规格,以匹配和禁止更广泛的坏行为。我们需要为我们创建的监狱创建过滤文件。

开始通过更改到过滤器目录:

1cd /etc/fail2ban/filter.d

我们实际上想通过调整预先提供的 Nginx 身份验证过滤器来开始,以匹配额外的失败登录日志模式。

1sudo nano nginx-http-auth.conf

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

1[label /etc/fail2ban/filter.d/nginx-http-auth.conf]
2[Definition]
3
4failregex = ^ \[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*$
5            ^ \[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*$
6
7ignoreregex =

保存并关闭文件,当你完成。

接下来,我们可以复制 apache-badbots.conf 文件用于 Nginx. 我们可以使用这个文件 as-is,但我们会将其复制到一个新的名称来澄清。

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

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

1sudo nano nginx-noscript.conf

请自由调整脚本序列,以删除您的服务器合法使用的语言文件或添加额外的序列:

1[label /etc/fail2ban/filter.d/nginx-noscript.conf]
2[Definition]
3
4failregex = ^<HOST> -.*GET.*(\.php|\.asp|\.exe|\.pl|\.cgi|\.scgi)
5
6ignoreregex =

保存并关闭文件。

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

1sudo nano nginx-nohome.conf

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

1[label /etc/fail2ban/filter.d/nginx-nohome.conf]
2[Definition]
3
4failregex = ^<HOST> -.*GET .*/~.*
5
6ignoreregex =

保存并关闭文件完成后。

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

1sudo nano nginx-noproxy.conf

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

1[label /etc/fail2ban/filter.d/nginx-noproxy.conf]
2[Definition]
3
4failregex = ^<HOST> -.*GET http.*
5
6ignoreregex =

保存并关闭文件,当你完成。

激活您的 Nginx 监狱

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

1sudo service fail2ban restart

该服务应该重新启动,执行您已配置的不同禁用策略。

获取有关启用监狱的信息

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

1sudo fail2ban-client status

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

1[secondary_label Output]
2Status
3|- Number of jail:      6
4`- Jail list:           nginx-noproxy, nginx-noscript, nginx-nohome, nginx-http-auth, nginx-badbots, ssh

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

1sudo iptables -S
 1[secondary_label Output]
 2-P INPUT ACCEPT
 3-P FORWARD ACCEPT
 4-P OUTPUT ACCEPT
 5-N fail2ban-nginx-badbots
 6-N fail2ban-nginx-http-auth
 7-N fail2ban-nginx-nohome
 8-N fail2ban-nginx-noproxy
 9-N fail2ban-nginx-noscript
10-N fail2ban-ssh
11-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-noproxy
12-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-nohome
13-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-badbots
14-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-noscript
15-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-http-auth
16-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
17-A fail2ban-nginx-badbots -j RETURN
18-A fail2ban-nginx-http-auth -j RETURN
19-A fail2ban-nginx-nohome -j RETURN
20-A fail2ban-nginx-noproxy -j RETURN
21-A fail2ban-nginx-noscript -j RETURN
22-A fail2ban-ssh -j RETURN

如果你想看到任何一个监狱实施禁令的细节,那么可能更容易再次使用fail2ban客户端:

1sudo fail2ban-client status nginx-http-auth
 1[secondary_label Output]
 2Status for the jail: nginx-http-auth
 3|- filter
 4|  |- File list:        /var/log/nginx/error.log 
 5|  |- Currently failed: 0
 6|  `- Total failed:     0
 7`- action
 8   |- Currently banned: 0
 9   |  `- IP list:
10   `- Total banned:     0

测试 Fail2Ban 政策

重要的是要测试您的fail2ban策略,以确保它们按预期阻止流量。例如,对于 Nginx 身份验证提示,您可以多次提供错误的身份验证信息。一旦您超过了限制,您应该被禁用并无法访问该网站。

如果你用fail2ban-client命令查看状态,你会看到你的IP地址被禁止从网站:

1sudo fail2ban-client status nginx-http-auth
 1[secondary_label Output]
 2Status for the jail: nginx-http-auth
 3|- filter
 4|  |- File list:        /var/log/nginx/error.log 
 5|  |- Currently failed: 0
 6|  `- Total failed:     12
 7`- action
 8   |- Currently banned: 1
 9   |  `- IP list:       111.111.111.111
10   `- Total banned:     1

当您确信您的规则正在工作时,您可以通过键入fail2ban-client来手动解禁您的IP地址:

1sudo 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’的信息,请查看以下链接:

Published At
Categories with 技术
comments powered by Disqus