介绍
在操作Web服务器时,实施安全措施以保护您的站点和用户非常重要。 使用防火墙策略保护您的网站和应用程序,并使用密码身份验证限制对某些区域的访问是保护系统的一个很好的起点。 然而,任何可以公开访问的密码提示可能会吸引来自恶意用户和机器人的暴力攻击。
设置fail2ban
可以帮助缓解这一问题。 当用户多次未能进行身份验证服务(或从事其他可疑活动) fail2ban
可以动态修改防火墙的运行政策问题上违规IP地址的临时禁令。 每个fail2ban
“监狱”通过检查由服务这表明失败的尝试模式写入日志操作。 设置fail2ban
监控Nginx的日志使用一些包括配置过滤器和一些我们将创建自己的是相当容易的。
在本指南中,我们将演示如何安装fail2ban
和配置它来监控你的Nginx日志入侵企图。 我们将使用Ubuntu 14.04服务器。
先决条件
在开始之前,您应该使用非root帐户设置Ubuntu 14.04服务器。 该帐户应该与配置sudo
权限才能发出管理命令。 要了解如何建立与用户sudo
权限,按照我们最初的服务器设置指南的Ubuntu 14.04 。
安装Nginx并配置密码验证
如果您有兴趣与保护你的Nginx服务器fail2ban
,你可能已经有一个服务器设置和运行。 如果没有,你可以使用从Ubuntu的默认仓库安装Nginx的apt
。
通过键入以下命令更新本地软件包索引并进行安装:
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]
文件中的部分。 这些项设置了一般策略,并且可以在特定的jail中覆盖。
一第一项来看的是,不受到客户的清单fail2ban
政策。 这是通过设置ignoreip
指令。 有时一个好主意是添加您自己的IP地址或网络到异常列表,以避免锁定自己。 这是更少的web服务器登录问题,虽然如果你能够维护shell访问,因为你可以总是手动撤消禁令。 您可以向现有列表添加由空格分隔的其他IP地址或网络:
[DEFAULT]
. . .
ignoreip = 127.0.0.1/8 your_home_IP
你可能需要调整的另一个项目是bantime
,控制违规成员多少秒禁赛。 理想的是将其设置为足够长的时间来破坏恶意演员的努力,同时足够短以允许合法用户纠正错误。 默认情况下,设置为600秒(10分钟)。 根据您的需要增加或减少此值:
[DEFAULT]
. . .
bantime = 3600
接下来的两个项目确定用于确定违规客户端的日志行的范围。 所述findtime
指定的时间量,以秒和maxretry
指令指示要在该时间内耐受的尝试次数。 如果客户端发出超过maxretry
时间由所设定的金额尝试findtime
,他们将被禁止:
[DEFAULT]
. . .
findtime = 3600 # These lines combine to ban clients that fail
maxretry = 6 # to authenticate 6 times within a half hour.
设置邮件通知(可选)
如果您希望在禁令发生时收到邮件,您可以启用电子邮件通知。 为此,您必须首先在服务器上设置MTA,以便它可以发送电子邮件。 要了解如何使用Postfix的这个任务,请按照本指南 。
一旦你有你的MTA设置,您必须将内调整一些额外的设置[DEFAULT]
一节的/etc/fail2ban/jail.local
文件。 通过设置启动mta
指令。 如果你设置Postfix,像上面的教程演示,将此值更改为“mail”:
[DEFAULT]
. . .
mta = mail
您需要选择将要发送通知的电子邮件地址。 修改destemail
该值指示。 该sendername
指令可以用于修改通知电子邮件的“发件人”字段:
[DEFAULT]
. . .
destemail = youraccount@email.com
sendername = Fail2BanAlerts
在fail2ban
说法,一个“行动”的程序,当客户端认证失败过很多次紧随其后。 默认动作(称为action_
)是简单地从有问题的端口禁止的IP地址。 但是,如果您设置了邮件,还可以使用两个其他预先设置的操作。
您可以使用action_mw
行动,禁止在客户端和发送电子邮件通知您配置的帐户上有问题的地址的“Whois”的报告。 你也可以使用action_mwl
动作,做同样的事情,而且还包括触发该禁令违规日志行:
[DEFAULT]
. . .
action = %(action_mwl)s
配置Fail2Ban监控Nginx日志
现在,你有一些一般fail2ban
到位的设置,我们可以集中精力使一些将监控我们的Web服务器日志为特定行为模式的具体Nginx的-监狱。
在配置文件中的每个监狱被包含在方括号监狱名称的头标(每个部分,但[DEFAULT]
部分表示一个特定的监狱的配置)。 默认情况下,只有[ssh]
监狱被启用。
要启用Nginx的登录尝试日志监控,我们将启用[nginx-http-auth]
监狱。 编辑enabled
这一节中,使得其显示为“true”指令:
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
port = http,https
logpath = /var/log/nginx/error.log
. . .
这是包含在Ubuntu的唯一Nginx的特定监狱fail2ban
包。 但是,我们可以创建自己的jail来添加额外的功能。 对于一些这些额外监狱的实现细节的灵感来自这里和这里 。
我们可以创建一个[nginx-noscript]
监狱,禁止客户端搜索的网站上的脚本来执行和利用。 如果您不使用PHP或任何其他语言与您的Web服务器,您可以添加这个监狱禁止请求这些类型的资源:
[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的提供在用户的主目录访问网页内容,您可以禁止谁通过添加请求这些资源的用户[nginx-nohome]
监狱:
[nginx-nohome]
enabled = true
port = http,https
filter = nginx-nohome
logpath = /var/log/nginx/access.log
maxretry = 2
我们应该禁止试图使用我们的Nginx服务器作为开放代理的客户端。 我们可以添加一个[nginx-noproxy]
监狱来匹配这些请求:
[nginx-noproxy]
enabled = true
port = http,https
filter = nginx-noproxy
logpath = /var/log/nginx/access.log
maxretry = 2
完成所需的修改后,保存并关闭文件。 我们现在必须为我们创建的jails添加过滤器。
为其他Nginx Jails添加过滤器
我们更新了/etc/fail2ban/jail.local
一些额外的监狱规范文件相匹配,并禁止更大范围的不良行为。 我们需要为我们创建的jail创建过滤器文件。 这些过滤器文件将指定要在Nginx日志中查找的模式。
首先切换到过滤器目录:
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]
监狱:
sudo nano nginx-noscript.conf
粘贴以下定义。 随意调整脚本Stapling以删除服务器合法使用的语言文件或添加其他Stapling:
[Definition]
failregex = ^<HOST> -.*GET.*(\.php|\.asp|\.exe|\.pl|\.cgi|\.scgi)
ignoreregex =
保存并关闭文件。
接下来,创建了一个过滤器[nginx-nohome]
监狱:
sudo nano nginx-nohome.conf
在文件中放置以下过滤器信息:
[Definition]
failregex = ^<HOST> -.*GET .*/~.*
ignoreregex =
保存并在完成后关闭文件。
最后,我们可以创建适用于过滤器[nginx-noproxy]
监狱:
sudo nano nginx-noproxy.conf
此过滤器定义将匹配将服务器用作代理的尝试:
[Definition]
failregex = ^<HOST> -.*GET http.*
ignoreregex =
保存并在完成后关闭文件。
激活您的Nginx Jails
要实现你的配置更改,则需要重新启动fail2ban
服务。 你可以通过键入:
sudo service fail2ban restart
该服务应重新启动,实施您配置的不同禁止策略。
获取有关启用Jails的信息
您可以通过查看所有已启用监狱fail2ban-client
命令:
sudo fail2ban-client status
您应该会看到您启用的所有jails的列表:
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
,请查看以下链接: