在操作Web服务器时,必须实施安全措施来保护您的站点和用户。使用防火墙策略保护您的网站和应用程序并使用密码身份验证限制对某些区域的访问是保护系统安全的一个很好的起点。但是,任何可公开访问的密码提示都可能会吸引恶意用户和机器人的暴力尝试。
设置fail2ban
可以帮助缓解此问题。当用户反复无法对服务进行身份验证(或从事其他可疑活动)时,fail2ban
可以通过动态修改正在运行的防火墙策略对违规IP地址发出临时禁止。每个fail2ban
“jail”通过检查由服务写入的日志来操作,以指示指示失败尝试的模式。fail2ban
使用一些包含的配置过滤器设置监视Nginx日志相当容易,我们将自己创建一些。
在本指南中,我们将演示如何安装fail2ban
和配置它以监控Nginx日志的入侵尝试。我们将使用Ubuntu 14.04服务器。
一台已经设置好可以使用sudo
命令的非root账号的Ubuntu服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。
如果您有兴趣保护您的Nginx服务器fail2ban
,您可能已经设置并运行了服务器。如果没有,您可以使用Ubuntu的默认存储库的apt
安装Nginx 。
通过键入以下命令更新本地包索引并安装:
sudo apt-get update
sudo apt-get install nginx
该fail2ban
服务对于保护登录入口点非常有用。为了使其对Nginx安装有用,必须至少对服务器上的一部分内容实施密码验证。
一旦你的Nginx服务器运行并且启用了密码验证,你就可以继续安装fail2ban
(我们在这里包含另一个存储库重新获取,以防你在前面的步骤中已经设置了Nginx):
sudo apt-get update
sudo apt-get install fail2ban
这将安装该软件。默认情况下,fail2ban
配置为仅禁止失败的SSH登录尝试。我们需要启用一些规则来配置它,以检查我们的Nginx日志中是否存在指示恶意活动的模式。
首先,我们需要调整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的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添加过滤器。
我们已经使用一些额外的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 =
完成后保存并关闭文件。
要实施配置更改,您需要重新启动该fail2ban
服务。您可以通过键入以下内容来执行:
sudo service fail2ban restart
该服务应该重新启动,实现您配置的不同禁止策略。
您可以使用以下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
策略以确保它们按预期阻止流量非常重要。例如,对于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》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。