转载

#研发解决方案#基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案

0x01,如何识别异常流量

对于异常流量,一般是做 rate limiting,即对访问频次做限制,参考我的文章《 电商课题:集群环境下业务限流 》。Nginx 的 limit_req 模块,利用红黑树数据结构,能够限定一个 IP 访问某 URI 的频次,如 10r/s,或 100r/m,还能定义访问频次超过阈值之后的 action,如返回 403 状态码,或跳转到某个 URL 上。

但定义了“URI-访问速率阈值”的 rate limiter 偏生硬,不够灵活,不能自适应,那有没有其他的解决方案呢?

我们先定义一下系统设计目标:

  • 第一时间发现高频请求的 IP;

  • 第一时间发现低频且“有规律”请求的 IP,如翻页,如慢速扫描,如慢速注册;

  • 及时发现 IP 的行为相似性,识别出可疑 IP 段;

  • 区分正常搜索引擎爬虫、正常用户访问;

接下来,我们先了解一下关联式规则。以下内容摘自维基百科: 

关联式规则

关联式规则(Association Rules, AR),又称关联规则,是数据挖掘的一个重要课题,用于从大量数据中挖掘出有价值的数据项之间的相关关系。

关联规则解决的常见问题如:“如果一个消费者购买了产品A,那么他有多大机会购买产品B?”以及“如果他购买了产品C和D,那么他还将购买什么产品?”正如大多数数据挖掘技术一样,关联规则的任务在于减少潜在的大量杂乱无章的数据,使之成为少量的易于观察理解的静态资料。关联式规则多不考虑项目的次序,而仅考虑其组合。

再看一下先验算法:

先验算法

先验算法(英语:Apriori algorithm)是关联式规则中的经典算法之一。

在关联式规则中,一般对于给定的项目集合(例如,零售交易集合,每个集合都列出的单个商品的购买信息),算法通常尝试在项目集合中找出至少有 C 个相同的子集。先验算法采用自底向上的处理方法,即频繁子集每次只扩展一个对象(该步骤被称为候选集产生),并且候选集由数据进行检验。当不再产生符合条件的扩展对象时,算法终止。

我们就是要用 Apriori 算法检测可疑 IP 或 IP 段。

0x02,Apriori 如何工作

首先,我们有很多 Web 工程,每一个工程都是集群,其次 Web 工程前面挂的 Nginx 反向代理也有不少,一个独立访问者的浏览行为可能分散在多个 Nginx 上。

因此,准实时的流量分析将 基于窝窝已存在的 ELK 体系展开,即聚合各个 Nginx 上的流量。

什么是 ELK?

E lastic Search+ L ogstash+ K ibana。

这几乎是互联网公司里日志聚合、索引和可视化搜索的标准解决方案,搜索时采用 Lucene 语法。

第一步,初始化系统

我们有一个异常流量识别系统 FlowGuard,得先配置一些规则进去。

1)配置  URI 转换规则:

观察主站  URI 设计规则,用户请求的  URI 虽然具备一定的规律性,其实往往多个  URI 对应后端同一个入口。

/cate/canyinmeishi/all   /cate/canyinmeishi/chaoyang /cate/canyinmeishi/sandadonglilu/page6 等  URI 都是跳转到某前台工程 的  index.do  服务,只是所携带的参数不同。

除此之外,用户还能手动在地址栏  URI 手动输入参数,如   /cate/all/all?pageNo=24,如果直接按照用户请求的  URI 进行  Apriori 频繁集运算,将很难发现用户的请求的相似性,从而不容易发现异常流量。

因此, 需要对用户请求的  URI 进行降噪处理,以便发现请求的相似性

如下图1所示, URI 转换规则包含四个属性:

  • 正则表达式: URI转换规则的正则规则,用户请求 URI匹配该正则才能进行转换;
  • 转换后 URI:降噪后的地址,目前设计为用户请求 URI对应的后端服务,必须以 “ / ”开头;
  • 页码值索引:列表页的页码值在正则表达式中的位置,页码值越大,异常请求的可能性越大,首页值为 0,非列表页值为 -1;
  • 可点击到达:正常鼠标点击能否跳转到此  URI,请求不可点击到达的 URI,异常请求的可能性大

#研发解决方案#基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案 #研发解决方案#基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案

图1 URL转换规则

2)配置  URI 的权值:

转换后的  URI 对应的权值,权值越大,异常请求的可能性越大。

3)设置  IP 白名单:

白名单支持  IP 和  IP 段,白名单中的  IP 参与频繁集计算,但不会出现在拦截规则中。

正文到此结束
Loading...