前言
本文分享了自动化采集、分析Nginx日志并实时封禁风险IP的方案及实践.
阅读这篇文章你能收获到:
- 日志采集方案.
- 风险IP评估的简单方案.
- IP封禁策略及方案.
阅读本文你需要:
-
熟悉编程.
-
熟悉常用Linux命令
-
了解Docker.
背景
分析nginx访问日志时, 看到大量404的无效请求, URL都是随机的一些敏感词. 而且近期这些请求越来越频繁, 手动批量封禁了一些IP后, 很快就有新的IP进来.
因此萌生了通过自动化分析Nginx日志实时封禁IP的想法.
需求
分析
从日志中简单总结几个特征:
备注: 这里分析IP是通过ip2location的免费版数据库, 后面会有详细的描述.
方案
sequenceDiagram
participant Nginx
participant Filebeat
participant Redis
participant Monitor
participant Actuator
Nginx ->> Filebeat: accessLog(File)
Filebeat ->> Redis: accessLog(JSON)
loop Always
Redis ->> Monitor: accessLog(JSON)
activate Monitor
Monitor ->> Monitor: Analysis
Monitor ->> Monitor: Risk assessment
Monitor ->> Actuator: Banned
Monitor ->> Monitor: Storing
end
deactivate Monitor
日志采集
来源: 笔者的网站通过docker部署, Nginx作为唯一入口, 记录了全部访问日志.
采集: 由于资源有限, 笔者选择了一款轻量的日志采集工具Filebeat, 收集Nginx日志并写入Redis.
风险评估
Monitor服务根据URL、IP、历史评分等进行风险评估, 计算出最终的危险系数.
IP封禁
Monitor发现危险IP后(危险系数超过阈值), 调用Actuator进行IP封禁, 封禁时长根据危险系数计算得出.
实施
日志采集
Filebeat的用法很简单, 笔者通过swarm进行部署, 其部署文件如下(为防止代码过长, 此处略去了其他服务):
version: '3.5'
services