实时文章采集(实时采集并分析Nginx日志,自动化封禁封禁风险IP方案 )
优采云 发布时间: 2021-12-10 08:21实时文章采集(实时采集并分析Nginx日志,自动化封禁封禁风险IP方案
)
实时采集并分析Nginx日志,自动拦截有风险的IP程序php
文章地址:html
前言
本文分享了自动化采集、分析Nginx日志、实时封禁风险IP的解决方案和实践。节点
阅读这个文章你可以得到:nginx
阅读这篇文章你需要:git
背景
分析nginx访问日志时,看到大量无效的404请求,URL都是随机的敏感词。这些请求最近变得更加频繁。手动批量禁止部分IP后,新的IP很快就会进来。 web
于是萌生了自动分析Nginx日志后实时封禁IP的想法。
需求序号需求备注
1
Nginx 日志采集
解决方案很多,我选择了最适合我服务器的方案:filebeat+redis
2
实时日志分析
实时消费redis日志,分析需要的数据进行分析
3
知识产权风险评估
IP风险评估,多维度:访问次数、IP归属、使用等。
4
实时禁止
阻止风险 IP 不同的时间长度
分析
简单从日志中总结了几个特点:sql
序列号功能说明备注
1
经常来访
每秒数次甚至数十次
正常的流量行为也有突发流量,但不会持续太久
2
连续请求
持久的
和上面一样
3
多数 404
大部分请求的URL可能不存在,还有admin、login、phpMyAdmin、backup等敏感词。
这种情况下正常的交通行为并不多
4
IP异常
在ASN之后,我们可以看到一些线索,通常这种请求的IP不是普通的我的用户。
查询其用途通常是COM(商业)、DCH(数据中心/网络托管/传输)、SES(搜索引擎蜘蛛)等。
备注:这里分析的IP是通过ip2location的免费版数据库,后面会详细介绍。
项目日志采集
来源:作者网站由docker部署,Nginx为唯一入口,记录所有访问日志。
采集:由于资源有限,我选择了一个轻量级的日志工具Filebeat,它采集Nginx的日志并写入Redis。
风险评估
Monitor服务根据URL、IP、历史分数等进行风险评估,计算出最终的风险系数。
知识产权禁令
Monitor发现危险IP(风险系数超过阈值)后,调用Actuator对该IP进行封堵,根据风险系数计算封禁时长。
实现日志采集
Filebeat 的使用非常简单。笔者通过swarm进行部署,部署文件如下(为防止代码过长,其余服务在此省略):
version: '3.5'
services:
filebeat:
image: docker.elastic.co/beats/filebeat:7.4.2
deploy:
resources:
limits:
memory: 64M
restart_policy:
condition: on-failure
volumes:
- $PWD/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro
- $PWD/filebeat/data:/usr/share/filebeat/data:rw
- $PWD/nginx/logs:/logs/nginx:ro
environment:
TZ: Asia/Shanghai
depends_on:
- nginx
filebeat.yml 文件内容如下:
filebeat.inputs:
- type: log
enabled: true
paths:
- /logs/nginx/access.log
json.keys_under_root: true
json.overwrite_keys: true
output.redis:
hosts: ["redis-server"]
password: "{your redis password}"
key: "filebeat:nginx:accesslog"
db: 0
timeout: 5
部署成功后,查看redis数据:
风险评估
Monitor 服务是用 Java 编写的,使用 docker 部署,并通过 http 与 Actuator 服务交互。
风险评估需要整合多个维度:
序列号维度策略
1
知识产权归属
中文网站的用户群通常属于中国。如果IP属于国外,就需要警惕了。
2
用
IP获得使用后,DCH(数据中心/网络托管/传输)、SES(搜索引擎蜘蛛)等,增加风险评分。
3
访问资源
访问资源不存在且路径收录敏感词,如admin、login、phpMyAdmin、backup等,提高风险评分。
4
访问的频率和持续时间
频繁和持续的请求,考虑提高分数。
5
历史成绩
历史分数被整合到当前分数中。
获取 IP 归属
获取IP归属地相对容易。许多数据服务网站提供免费的包,例如IpInfo。还有免费版本的 IP 数据库可以下载,例如 ip2location。
作者使用了免费版的ip2location数据库:
ip_from 和 ip_to 是IP段的开始和结束,存储格式为十进制。在 MySQL 中,可以通过 inet_aton('your ip') 函数将 IP 转换为十进制。例如:
set @a:= inet_aton('172.217.6.78');
SELECT * FROM ip2location_db11 WHERE ip_from = @a LIMIT 1;
ip_fromip_tocountry_codecountry_nameregion_namecity_namelatitudelongitudezip_codetime_zone
2899902464
2899910655
我们
美国
加利福尼亚州
山顶风光
37.405992
-122.07852
94043
-07:00
获取AS、ASN和用法
网站提供的大部分免费服务都无法查询ASN或者没有目的。ASN数据也有免费的数据库,但还是没有目的和类型等,这时候作者通过其他方式救国。
ip2location 提供免费版本的 IP2Location™LITE IP-ASN 和 IP2Proxy™LITE 数据库。
IP2Location™LITE IP-ASN:该数据库提供了对肯定自治系统和编号 (ASN) 的参考。
IP2Proxy™LITE:数据库收录用作开放代理的 IP 地址。该数据库包括所有公共 IPv4 和 IPv6 地址的代理类型、国家、地区、城市、ISP、域、使用类型、ASN 和最新记录。
IP2Location™LITE IP-ASN 无法找出所使用的 IP 类型。如果数据较少,IP2Proxy™LITE 不一定收录指定的 IP。但是可以结合这两个库来粗略猜测IP的用途:
首先,在 IP2Proxy™LITE 中查找 IP 的 ASN。
set @a:= inet_aton('172.217.6.78');
SELECT * FROM ip2location_asn WHERE ip_from = @a LIMIT 1;
ip_fromip_tocidrasnas
2899904000
2899904255
172.217.6.0/24
15169
谷歌有限责任公司
结合ASN和IP,查询与指定IP最近的同一个ASN的两条记录:
<p>set @a:= inet_aton('172.217.6.78');
SELECT * FROM ip2proxy_px8 WHERE ip_from >= @a AND asn = 15169 ORDER BY ip_from ASC LIMIT 1;
SELECT * FROM ip2proxy_px8 WHERE ip_from