ICode9

精准搜索请尝试: 精确搜索
首页 > 互联网> 文章详细

使用fail2ban防止恶意扫描和CC攻击

2020-05-29 09:39:12  阅读:1801  来源: 互联网

标签:fail2ban 恶意扫描 CC攻击 


前文 服务器简易防CC攻击设置 介绍了使用 Nginxfirewalld 对服务器进行防护。尽管过快的恶意请求会返回503错误,但持续攻击也会消耗服务器资源,浪费带宽。

本文介绍使用fail2ban从Nginx日志找出恶意IP并调用firewalld直接封禁,从而达到防止恶意扫描和CC攻击的目的。

为什么需要fail2ban

如果检查Nginx访问日志,可能经常会看到如下恶意扫描日志:

Nginx 404恶意扫描日志
Nginx 404恶意扫描日志

网站流量再大一点,可能不时(经常)会遇到DDos攻击或者 CC攻击 。 使用 服务器简易防CC攻击设置 的方案,恶意请求会返回503错误,Nginx日志会有如下记录:

NGINX防CC攻击返回503错误
NGINX防CC攻击返回503错误

无论404恶意扫描还是CC攻击,最佳做法是一经发现,立马将IP拉入黑名单。遗憾的是firewalld能拉黑IP,但是不知道该拉黑谁。

fail2ban 就是一个能将Nginx日志和firewalld结合的软件:扫描Nginx日志,根据规则找出恶意IP,然后调用firewalld/iptables封禁IP。

fail2ban如其名,根据规则找出有问题的IP(测试fail),然后ban掉。fail2ban不仅可以扫描Nginx日志,也可以扫描SSH、httpd、SMTP等多种应用软件的日志,并按照配置执行封禁操作。实际中fail2ban常用于扫描SSH日志,防止SSH暴力破解。

下面介绍使用fail2ban防止恶意扫描和CC攻击。

fail2ban防止恶意扫描和CC攻击

安装fail2ban

fail2ban软件包包含在绝大多数发行版的软件仓库中,因此可以直接用包管理软件安装:

# CentOS
yum install -y fail2ban
# ubuntu使用apt的系统
sudo apt-get install -y fail2ban

fail2ban配置文件

fail2ban的配置文件位于 /etc/fail2ban 目录内,有以下重要配置文件(夹),分别对应三个核心概念:

  • jail.conf:对应核心概念“jail”(牢笼/监狱),一个jail由action和filter组成,代表监控目标。jail.conf配置软件监控目标及发现恶意IP后的操作;
  •  action.d:对应核心概念action(动作),表示发现恶意IP后采取的操作。action.d目录中预定义了许多常用操作,例如调用iptables/firewalld封禁、sendmail发送通知邮件;
  •  filter.d: 对应核心概念filter(过滤规则),过滤规则是用来匹配恶意行为的规则文件/正则表达式。filter.d目录内预定于了许多软件监控规则,例如SSH、Nginx、Apache。

我们的监控目的由两部分组成:1. 查找短时间内同IP的404记录,防止恶意扫描;2. 查找短时间内的503记录,阻止CC攻击。查找恶意IP由过滤规则负责,我们先对其进行定义。

定义fail2ban过滤规则

过滤规则配置文件位于在 /etc/fail2ban/filter.d 目录下,我们新建 nginxcc.conf 文件,写入如下内容:

[Definition]
failregex = ^<HOST> .* "(GET|POST|HEAD).*HTTP.*" (404|503) .*$
ignoreregex =.*(robots.txt|favicon.ico|jpg|png)

配置文件总共三行,分表表示过滤规则的定义、恶意请求的正则表达式、以及应该忽略的正则。failregex中的<HOST>代表主机IP,404|503表示我们仅匹配这两个为恶意的请求。

请根据Nginx日志格式,以及自身需求修改failregex和ignoreregex

正则表达式比较复杂,因此正式使用前应该测试一下规则是否起作用。fail2ban很贴心的提供了 fail2ban-regex 命令用来测试过滤规则:

# 语法:fail2ban-regex 日志文件 规则文件
fail2ban-regex /var/log/nginx/tlanyan.access.log /etc/fail2ban/filter.d/nginxcc.conf

该命令输出如下:

Running tests
=============

Use   failregex filter file : nginx404, basedir: /etc/fail2ban
Use         log file : test.log
Use         encoding : UTF-8


Results
=======

Failregex: 59 total
|-  #) [# of hits] regular expression
|   1) [59] ^<HOST> .* "(GET|POST|HEAD).*HTTP.*" (404|503) .*$
`-

Ignoreregex: 16 total
|-  #) [# of hits] regular expression
|   1) [16] .*(robots.txt|favicon.ico|jpg|png)
`-

Date template hits:
|- [# of hits] date format
|  [10000] Day(?P<_sep>[-/])MON(?P=_sep)ExYear[ :]?24hour:Minute:Second(?:\.Microseconds)?(?: Zone offset)?
`-

Lines: 10000 lines, 16 ignored, 59 matched, 9925 missed

输出显示匹配到的行数、忽略的行数已经未匹配上的行数。

如果输出与预期相符,说明过滤规则书写正确,否则应该编辑规则文件,修改正则表达式后再次测试。

接下来配置监控目标。

配置fail2ban监控目标

系统内置的监控目标在 /etc/fail2ban/jail.conf 文件中,官方建议自定义的监控目标放在 /etc/fail2ban/jail.local 或者在 /etc/fail2ban/jail.d 目录中新建配置文件。本文将监控目标定义在 /etc/fail2ban/jial.local 文件里,写入下面内容:

[nginxcc]
enabled = true
#port = http,https
filter = nginxcc
action = firewallcmd-allports[name=nginxcc]
logpath = /var/log/nginx/tlanyan.access.log
bantime = 7200
findtime = 600
maxretry = 5

配置说明如下:

  • nginxcc:监控目标名称
  • port:封禁的端口,本文中我们注释掉,表示封禁所有端口
  • filter:过滤规则,我们使用自定义的nginxcc
  • action:捕捉到恶意IP后执行的操作,本文使用firewallcmd对IP封禁所有端口
  • logpath:监控的日志文件
  • bantime:封禁时间,单位为秒
  • findtime:查找时间段,单位为秒
  • maxretry:允许的最大失败次数,这里我们配置10分钟内触发5次规则,那么就封禁掉

配置好后保存配置文件,设置开启启动并启动fail2ban:

systemctl enable fail2ban
systemctl start fail2ban

测试监控目标

接下来可以测试监控目标是否按期执行,我们可以在另外一台VPS上,执行下面的脚本测试能否出发封禁:

#!/bin/bash
for ((i=1;i<=20;i++)); do
curl https://tlanyan.me/test.php
done
echo "done"

注意,不能测试test.png,因为过滤规则配置了忽略png、jpg等后缀

执行完脚本后过一两分钟,再次执行,应该会提示无法连接到服务器,与预期相符。

查看监控状态

fail2ban提供了 fail2ban-client 查看监控状态。

# 查看fail2ban的运行状态
fail2ban-client status
# 输出如下:
# Status
# |- Number of jail:	1
# `- Jail list:	nginxcc

# 查看指定监控的状态
fail2ban-client status nginxcc
# 输出如下:
# Status for the jail: nginx404
# |- Filter
# |  |- Currently failed:	0
# |  |- Total failed:	1461
# |  `- File list:	/var/log/nginx/tlanyan.access.log
# `- Actions
#    |- Currently banned:	3
#    |- Total banned:	9
#    `- Banned IP list:	37.139.8.104 194.99.106.146 185.43.251.185

Banned IP list 列出了当前被封禁的IP。如果发现有误杀IP,可以用unbanip解封:

fail2ban-client set nginxcc unbanip IP地址

其他

  1. fail2ban不是实时的,必须等日志写入文件才能监控,因此封禁滞后是正常的;
  2. fail2ban的日志文件是 /var/log/fail2ban.log
  3. fail2ban性能不是很好,使用fail2ban-regex测试时不建议用大文件;
  4. 可以用 awk '{print $1}' /var/log/nginx/tlanyan.access.log| sort | uniq -c | sort -n | tail 查看请求最频繁的IP地址;
  5. 可以用 netstat -nt | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n | tail 查看与当前服务器连接最多的IP;
  6. 同一个监控目标中可以配置多个日志文件、action,同一个过滤规则中可以写多条正则匹配,但这些行必须对齐。

参考

1. fail2ban manual

2. How to use Fail2ban for securing Apache web server from 404 attacks?

3. Fail2Ban 使用技巧和心得汇总

标签:fail2ban,恶意扫描,CC攻击,
来源: https://tlanyan.me/use-fail2ban-prevent-scan-and-cc-attack/

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有