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

介绍

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

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

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

准备

一台已经设置好可以使用sudo命令的非root账号的Ubuntu服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器

安装Nginx并配置密码验证

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

通过键入以下命令更新本地包索引并安装:

sudo apt-get update
sudo apt-get install nginx

fail2ban服务对于保护登录入口点非常有用。为了使其对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]在文件中的部分下找到。这些项设置了一般策略,可以在特定的jails中覆盖每个策略。

要查看的第一个项目之一是不受fail2ban策略约束的客户列表。这是由ignoreip指令设置的。有时,最好将自己的IP地址或网络添加到例外列表中,以避免锁定自己。如果您能够维护shell访问权限,那么这不是Web服务器登录的问题,因为您始终可以手动撤消禁令。您可以将空格分隔的其他IP地址或网络添加到现有列表中:

[DEFAULT]
​
. . .
ignoreip = 127.0.0.1/8 your_home_IP

您可能想要调整的另一个项目是bantime,它控制违规成员被禁止的秒数。理想的做法是将其设置为足够长的时间以破坏恶意行为者的努力,同时又足够短以允许合法用户纠正错误。默认情况下,此值设置为600秒(10分钟)。根据需要增加或减少此值:

[DEFAULT]
​
. . .
bantime = 3600

接下来的两个项目确定用于确定违规客户端的日志行的范围。的findtime以秒为指定的时间量和所述maxretry指令指示要在该时间内耐受尝试的数目。如果客户在findtime设定的时间内进行多次尝试maxretry,则会被禁止:

[DEFAULT]
​
. . .
findtime = 3600   # These lines combine to ban clients that fail
maxretry = 6      # to authenticate 6 times within a half hour.

设置邮件通知(可选)

如果您希望在禁止发生时接收邮件,则可以启用电子邮件通知。为此,您必须首先在服务器上设置MTA,以便它可以发送电子邮件。

设置好MTA后,您必须在/etc/fail2ban/jail.local文件[DEFAULT]部分中调整一些其他设置。首先设置mta指令。如果您设置Postfix,如上面的教程演示,请将此值更改为“mail”:

[DEFAULT]
​
. . .
mta = mail

您需要选择将发送通知的电子邮件地址。destemail使用此值修改[DEFAULT]指令。该sendername指令可用于修改通知电子邮件中的“发件人”字段:

[DEFAULT]
​
. . .
destemail = youraccount@email.com
sendername = Fail2BanAlerts

fail2ban说法中,“行动”的程序,当客户端认证失败过很多次紧随其后。默认操作(被调用action_)是简单地禁止有问题的端口的IP地址。但是,如果您设置了邮件,还可以使用其他两个预先制作的操作。

您可以使用该action_mw操作禁止客户端,并通过有关违规地址的“whois”报告向您配置的帐户发送电子邮件通知。您也可以使用action_mwl进行同样的操作,但也包括触发禁令的违规日志行:

[DEFAULT]
​
. . .
action = %(action_mwl)s

配置Fail2Ban以监视Nginx日志

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

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

要为Nginx登录尝试启用日志监控,我们将启用[nginx-http-auth]jail。在此部分中编辑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的监狱。但是,我们可以创建自己的jails来添加其他功能。

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

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

我们可以添加一个名为[nginx-badbots]停止某些已知恶意僵尸程序请求模式的部分:

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

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

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

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

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

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

为其他Nginx Jails添加过滤器

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

首先更改为filters目录:

cd /etc/fail2ban/filter.d

我们实际上希望首先调整预先提供的Nginx身份验证筛选器以匹配其他失败的登录日志模式。打开文件进行编辑:

sudo nano nginx-http-auth.conf

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

[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]jail 创建一个过滤器:

sudo nano nginx-noscript.conf

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

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

保存并关闭文件。

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

sudo nano nginx-nohome.conf

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

[Definition]
​
failregex = ^<HOST> -.*GET .*/~.*
​
ignoreregex =

完成后保存并关闭文件。

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

sudo nano nginx-noproxy.conf

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

[Definition]
​
failregex = ^<HOST> -.*GET http.*
​
ignoreregex =

完成后保存并关闭文件。

激活你的Nginx Jails

要实施配置更改,您需要重新启动该fail2ban服务。您可以通过键入以下内容来执行:

sudo service fail2ban restart

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

获取有关启用的Jails的信息

您可以使用以下fail2ban-client命令查看所有已启用的jail :

sudo fail2ban-client status

你应该看到你启用的所有jail的列表:

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
-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
Status 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
Status 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

如果您对规则有效,您可以用fail2ban-client通过键入以下内容手动取消禁用您的IP地址:

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保护服务器的基础知识可以轻松地为您提供极大的安全性。

更多Ubuntu教程请前往腾讯云+社区学习更多知识。

参考文献:《How To Protect an Nginx Server with Fail2Ban on Ubuntu 14.04》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java达人

项目本机部署过程中的若个问题

项目本机部署对老手来说纯粹是一个操作的过程,没有任何的技术难点,因此不会去关注,也不常去操作,有时候换一台计算机,或者在别人的计算机上开发一个新项目,部署的时候...

1915
来自专栏lonelydawn的前端猿区

基于java swing的设备管理系统

一.系统介绍 一个简易的设备管理系统,包含了管理员登录注册、设备录入、设备状态管理功能,具体状态有购买时、正在运行、正在修理和已报废。 二.开发环境 开发环境:...

3097
来自专栏Python爬虫与数据挖掘

如何在vSphere Client的虚拟机上安装Centos6.7操作系统

前几天给小伙伴们介绍了Centos对应版本的下载教程以及如何在vSphere Client上如何创建虚拟机,感兴趣的童鞋们可以点击进去看看~~

1321
来自专栏张戈的专栏

shell脚本实现整站缓存和预缓存,进一步提升网站整体加载速度

在 Linux 中,shell 脚本结合系统任务计划 crontab,非常简单就能实现一些复杂程序才能完成的工作,开发成本低,且简单易学。 张戈博客之前也分享过...

4369
来自专栏云瓣

打包优化实践(如何Code Spliting)

开发环境中可使用 analyze-webpack-plugin 观察各模块的占用情况。以该项目为例:浏览器中输入 http://localhost:3000/a...

1232
来自专栏喵了个咪的博客空间

[喵咪开源软件推荐(5)]开源DNS服务-bind

[喵咪开源软件推荐(5)]开源DNS服务-bind ? 哈喽大家好呀!~~ 今天又为大家带来了一个有趣的东西就是DNS服务器,稍微了解网络的童鞋都知道我们在使用...

7425
来自专栏后端技术探索

[干货实战]为最佳性能调优nginx

通常来说,一个优化良好的 Nginx Linux 服务器可以达到 500,000 – 600,000 次/秒 的请求处理性能,然而我的 Nginx 服务器可以稳...

972
来自专栏前端小栈

利用Hexo+coding搭建博客,优化github博客打开速度

上次用hexo和github上搭建博客后,用了几天发现博客搭建在github上有一定的局限:

1602
来自专栏FreeBuf

如何通过Emond在macOS上实现持久化访问

在这篇文章中,我们会介绍如何通过emond在macOS上实现持久化访问。根据苹果公司的说法,事件监视进程(emond)会“接受来自各种服务的事件,通过一个简单的...

2039
来自专栏同步博客

Git服务器搭建

  Git是目前世界使用最广泛的分布式版本控制系统,它是由林纳斯·托瓦兹(Linus Torvalds)创作,最初的目的是为了更好地管理Linux内核开发而设计...

3523

扫码关注云+社区

领取腾讯云代金券