Nginx日志中漏洞扫描应对方法

  • A+
所属分类:网站建设

这两天查看了一下Nginx日志,发现大量恶意漏洞扫描枚举攻击,下面说说一些相对简单的应对方法!
一、使用fail2ban工具结合防火墙(iptables | firewalld),将大量404请求的IP地址封掉。
fail2ban安装完成后, 在/etc/fail2ban/filter.d/目录下建立nginx.conf文件保存下面的内容:

  1. [Definition]  
  2. failregex = <HOST> -.*- .*HTTP/1.* 404 .*$  
  3. ignoreregex =  

过滤原理是通过查找一定时期内访问结果为404 的所有IP,并通过定义下面的条件,找出符合该规则的IP 。
打开/etc/fail2ban/jail.local配置文件,在其最后加入下面的内容:

  1. [nginx-get-dos]  
  2. enabled = true  
  3. port = http,https  
  4. filter = nginx   //对应上面过滤规则中我们新建的nginx.conf文件  
  5. logpath = /logs/nginx/361way.access.log   //日志文件位置  
  6. maxretry = 20   //失败多少次后就封掉IP  
  7. findtime = 60   //在多少时间内,查找符合规则的IP  
  8. bantime = 3600  //禁止该IP多长时间  
  9. action = iptables[name=HTTP, port=http, protocol=tcp]  
  10. #ignoreip = 192.168.1.2   //白名单中的IP  

通过fail2ban-regex命令,查看符合规则的IP :

  1. fail2ban-regex /logs/nginx/361way.access.log /etc/fail2ban/filter.d/nginx.conf  
  2. …………………………  
  3. …………………………  
  4.     110.20.60.68 (Mon Oct 22 21:08:26 2012)  
  5.     123.205.60.22 (Mon Oct 22 21:11:58 2012)  
  6.     203.202.60.69 (Mon Oct 22 21:14:18 2012)  
  7. Date template hits:  
  8. 0 hit(s): Month Day Hour:Minute:Second  
  9. 0 hit(s): Weekday Month Day Hour:Minute:Second Year  
  10. 0 hit(s): Weekday Month Day Hour:Minute:Second  
  11. 0 hit(s): Year/Month/Day Hour:Minute:Second  
  12. 77607 hit(s): Day/Month/Year:Hour:Minute:Second  
  13. 0 hit(s): Year-Month-Day Hour:Minute:Second  
  14. 0 hit(s): Day-Month-Year Hour:Minute:Second[.Millisecond]  
  15. 0 hit(s): TAI64N  
  16. 0 hit(s): Epoch  
  17. Success, the total number of match is 35201  
  18. However, look at the above section 'Running tests' which could contain important  
  19. information.  

以上结果是从日志中批配nginx.conf规则的数,并未对jail.local文件中的规则进行匹配 。

  1. [root@bj1 fail2ban]# fail2ban-client status nginx-get-dos  
  2. Status for the jail: nginx-get-dos  
  3. |- filter  
  4. |  |- File list:        /logs/nginx/361way.access.log  
  5. |  |- Currently failed: 1  
  6. |  `- Total failed:     210  
  7. `- action  
  8.    |- Currently banned: 1  
  9.    |  `- IP list:       192.168.1.5  
  10.    `- Total banned:     1  

上面查看到的结果同iptables -L (或iptables -nL)得到的结果对应:

  1. [root@bj1 fail2ban]# iptables -nL  
  2. ……………………………………  
  3. ……………………………………  
  4. Chain fail2ban-HTTP (1 references)  
  5. target     prot opt source               destination  
  6. DROP       all  --  192.168.1.5         0.0.0.0/0  
  7. RETURN     all  --  0.0.0.0/0            0.0.0.0/0   

二、将所有非法请求跳转至首页:
在nginx.conf 或 虚拟主机的配置文件中的server 配置段落里执行:
1. 把返回错误页面配置 打开注释:

  1. error_page 403 404 500 502 503 504 = /error.html;  

2. 加入下面配置:

  1. location / {  
  2. if (!-e $request_filename){  
  3. rewrite ^(.*)$ /index.php?s=$1 last; break;  
  4. }  
  5. }  

3. 编写error.html页面
略。
4. 重启nginx service nginx reload
三、指定User-Agent 并返回403
1. 在nginx.conf配置文件中加入:

  1. include agent_deny.conf;  

2. 在/../nginx/conf目录下新建agent_deny.conf

  1. vi agent_deny.conf  
  1. # 禁止Scrapy等工具的抓取  
  2.     if ($http_user_agent ~* (Scrapy|Curl|HttpClient)) {  
  3.       return 403;  
  4.     }  
  5.   
  6.     # 禁止指定UA及UA为空的访问  
  7.     if ($http_user_agent ~ "FeedDemon|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|YisouSpider|HttpClient|MJ12bot|heritrix|EasouSpider|LinkpadBot|Googlebot|Ezooms|^$" )  
  8.     {  
  9.       return 403;  
  10.     }  
  11.   
  12.     # 禁止非GET|HEAD|POST的方式抓取  
  13.     if ($request_method !~ ^(GET|HEAD|POST)$) {  
  14.       return 403;  
  15.     }  

3. 修改Nginx配置文件后重启或重载

  1. systemctl reload nginx  |  /etc/init.d/nginx reload  | service nginx reload  

该方法会屏蔽大量爬虫和自动化无差别攻击,提高自己的服务器安全性和高可用性。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: