前言
本文分享了自动化采集、分析Nginx日志并实时封禁风险IP的方案及实践.
阅读这篇文章你能收获到:
- 日志采集方案.
- 风险IP评估的简单方案.
- IP封禁策略及方案.
阅读本文你需要:
- 熟悉编程.
- 熟悉常用Linux命令.
- 了解Docker.
背景
分析nginx访问日志时, 看到大量404的无效请求, URL都是随机的一些敏感词. 而且近期这些请求越来越频繁, 手动批量封禁了一些IP后, 很快就有新的IP进来.
因此萌生了通过自动化分析Nginx日志实时封禁IP的想法.
需求
序号 | 需求 | 备注 |
---|---|---|
1 | Nginx日志收集 | 方案有很多, 笔者选择了最适合个人服务器的方案: filebeat +redis |
2 | 日志实时分析 | 实时消费redis 的日志, 解析出需要的数据进行分析 |
3 | IP风险评估 | 对IP进行风险评估, 多个维度: 访问次数、IP归属、用途等 |
4 | 实时封禁 | 针对风险IP进行不同时长的封禁 |
分析
从日志中简单总结几个特征:
序号 | 特征 | 描述 | 备注 |
---|---|---|---|
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、历史评分等进行风险评估, 计算出最终的危险系数.
IP封禁
Monitor发现危险IP后(危险系数超过阈值), 调用Actuator进行IP封禁, 封禁时长根据危险系数计算得出.
实施
日志采集
Filebeat的用法很简单, 笔者通过swarm进行部署, 其部署文件如下(为防止代码过长, 此处略去了其他服务):
version: '3.5'
services:
filebeat:
image: docker.elastic.co/beats/filebeat:7.4.2
deploy:
resources:
limits:
me