#研发解决方案#基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案
本文档适用人员:技术人员
- 所谓异常流量
- 如何识别异常流量
- Apriori如何工作
- 如何让 Nginx 拦截可疑 IP
- 僵尸网络中的节点对主站发起无目的的密集访问;
- 黑客、白帽子或某些安全公司为了做漏洞扫描,对主站各个 Web 工程发起字典式攻击;
- 实例:大家经常会在自己工程的 Access Log 里看到大量乱七八糟的 URL;
- 某些专门针对电商的犯罪团伙利用主站一些防御性不强的表单,或 Ajax 接口,做注册机或扫描机等;
- 实例:2013年上半年,由于某些互联网公司用户信息泄漏,所以很多团伙开发了自动化脚本,利用几千万用户名密码,对各类电商网站,模拟登录、进入个人中心、查看账户余额、查看有无未消费的券码,如果找到了有价值的目标账户,并不动手只是记录下来,回头在淘宝上批量售卖信息给第四方,第四方再实施盗用余额或盗用未消费券;
- 某些不明来历的爬虫会对商品列表页做无限翻页,或对主站做深度广度遍历,严重消耗系统资源,造成系统严重抖动;
- 第一时间发现高频请求的 IP;
- 第一时间发现低频且“有规律”请求的 IP,如翻页,如慢速扫描,如慢速注册;
- 及时发现 IP 的行为相似性,识别出可疑 IP 段;
- 区分正常搜索引擎爬虫、正常用户访问;
|
关联式规则(Association Rules, AR),又称关联规则,是数据挖掘的一个重要课题,用于从大量数据中挖掘出有价值的数据项之间的相关关系。
关联规则解决的常见问题如:“如果一个消费者购买了产品A,那么他有多大机会购买产品B?”以及“如果他购买了产品C和D,那么他还将购买什么产品?”正如大多数数据挖掘技术一样,关联规则的任务在于减少潜在的大量杂乱无章的数据,使之成为少量的易于观察理解的静态资料。关联式规则多不考虑项目的次序,而仅考虑其组合。
|
| 先验算法(英语:Apriori algorithm)是关联式规则中的经典算法之一。 在关联式规则中,一般对于给定的项目集合(例如,零售交易集合,每个集合都列出的单个商品的购买信息),算法通常尝试在项目集合中找出至少有 C 个相同的子集。先验算法采用自底向上的处理方法,即频繁子集每次只扩展一个对象(该步骤被称为候选集产生),并且候选集由数据进行检验。当不再产生符合条件的扩展对象时,算法终止。 |
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,异常请求的可能性大


图1 URL转换规则
2)配置 URI 的权值:
转换后的 URI 对应的权值,权值越大,异常请求的可能性越大。
3)设置 IP 白名单:
白名单支持 IP 和 IP 段,白名单中的 IP 参与频繁集计算,但不会出现在拦截规则中。
第二步,生成拦截规则:
1)从 ELK 中获取 N 分钟内 Nginx access log 关键信息:remote_ip, guid, referer, uri, agent 等字段;
2)降噪请求 URI,计算每个请求的非法系数:
非法系数和URI权值,页码值成正比。如果请求 URI 不可直接点击到达,非法系数也会增加。
3)利用 Apriori 算法,生成请求的频繁项集。
3.1)对用户请求进行 IP、URI、IP_URI、IP_UUID、IP_REFERER 等分类,类似 Map-Reduce。生成 Map<String, List<RequestRecord>> 结构数据;
3.2)计算出每个分类的频繁项集。生成的 Map<String, List<RequestRecord>> 结果集中,频率大于 N% 且请求次数大于 M 次的,则满足频繁项条件。
3.3)依据历史频繁项集数据和衰减规则生成拦截规则。衰减规则分成不衰减,缓慢衰减(sin函数),匀速衰减,快速衰减(二次函数)。
如下图2所示,拦截规则分为 IP、URI、UUID、Referer 等列,其中 IP 为必选项,URI、UUID、Referer 等列为可选项,即 IP and (URI or Referer or Uuid or other)。


图2 拦截规则
点击上图2中的 IP 或者 URI 进入历史请求记录页,历史记录页有图表和列表两种展示方式,如下图3所示:


图3 某IP历史请求列表页的趋势图展示方式

第三步,提交拦截规则:
拦截规则可以手动拦截和自动拦截。目前默认手动拦截,可以通过接口提交请求来设置自动拦截还是手动拦截。



#研发解决方案#基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案的更多相关文章
- 基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案 郑昀 基于杨海波的设计文档(转)
郑昀 基于杨海波的设计文档 创建于2015/8/13 最后更新于2015/8/25 关键词:异常流量.rate limiting.Nginx.Apriori.频繁项集.先验算法.Lua.ELK 本文档 ...
- 实战:一种在http请求中使用protobuffer+nginx+lua收集打点日志的方案
背景 app打点日志的上报和收集,是互联网公司的基本需求. 一.方案选择 1.1 protobuffer vs json 探究一种以最高效的方式上报和解析打点数据是一个系统性的问题,需要解决的子问题有 ...
- 基于 Nginx && Lua 的简易CC防护方案
零.前言 1.CC攻击简述 CC攻击(Challenge Collapsar)是常见网站应用层攻击的一种,目的是消耗服务器资源,降低业务响应效率:极端情况会让站点无法正常提供服务: 2.本文要点 旨在 ...
- 简单版nginx lua 完成定向流量分发策略
本文链接:https://www.cnblogs.com/zhenghongxin/p/9131362.html 公司业务前端是使用 “分发层+应用层” 双层nginx架构,目的是为了提高缓存的命中率 ...
- #研发解决方案介绍#基于ES的搜索+筛选+排序解决方案
郑昀 基于胡耀华和王超的设计文档 最后更新于2014/12/3 关键词:ElasticSearch.Lucene.solr.搜索.facet.高可用.可伸缩.mongodb.SearchHub.商品中 ...
- #研发解决方案介绍#基于StatsD+Graphite的智能监控解决方案
郑昀 基于李丹和刘奎的文档 创建于2014/12/5 关键词:监控.dashboard.PHP.graphite.statsd.whisper.carbon.grafana.influxdb.Pyth ...
- #研发解决方案介绍#Recsys-Evaluate(推荐评测)
郑昀 基于刘金鑫文档 最后更新于2014/12/1 关键词:recsys.推荐评测.Evaluation of Recommender System.piwik.flume.kafka.storm.r ...
- #研发解决方案介绍#Tracing(鹰眼)
郑昀 最后更新于2014/11/12 关键词:GoogleDapper.分布式跟踪.鹰眼.Tracing.HBase.HDFS. 本文档适用人员:研发 分布式系统为什么需要 Tracing? ...
- #研发解决方案介绍#IdCenter(内部统一认证系统)
郑昀 基于朱传志的设计文档 最后更新于2014/11/13 关键词:LDAP.认证.权限分配.IdCenter. 本文档适用人员:研发 曾经一个IT内部系统配一套帐号体系和授权 线上生产环境里 ...
随机推荐
- stm32控制电机
一.总体思路 使用端口GPIOA来连接电机,所以给GPIOA编程就可以控制电机.使用系统时钟SysTick来周期性的给电机发送脉冲.用四个按钮来控制需要发送脉冲的个数,每个按钮被按下就设置 ...
- 从零开始构建 Wijmo & Angular 2 小应用
中秋之际,Angular 团队发布 Angular 2 正式版,一款不错的图表控件Wijmo当天宣布支持 . Angular 2移除和替代了 Angular 1.X 中的 directives, co ...
- publishing failed with multiple errors resource is out of sync with the file system--转
原文地址:http://blog.csdn.net/feng1603/article/details/7398266 今天用eclipse部署项目遇到"publishing failed w ...
- hibernate笔记--基于外键的单(双)向的一对一映射关系
假设我们有两张表,人员信息表Person,和身份信息表IdCard,我们知道每个人只有一个身份证号,所以这里的Person和IdCard表是一一对应的,也就是一对一的映射关系,基于外键的单向一对一映射 ...
- (3)MEF插件系统中通信机制的设计和实现
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 一般的WinForm中通过C#自带的Event机制便能很好的实 ...
- Service实现文件下载
首先在Activity中声明Intent对象,启动Service: //生成Intent对象 Intent intent = new Intent(); //将文件名对象存入到intent对象当中 i ...
- 小div布局之卡片堆叠(card-stacking)
前端的页面布局和各种效果真是让人眼花缭乱,公司的设计师恨不得在一个网站上把前端的布局和样式效果都用一遍. 如何实现下面这种布局效果?我给这种布局效果起了个名字,叫做小div布局之卡片堆叠.然后我百度了 ...
- Spring加载xsd引起的问题小记
前言 最近要把之前写好的监控系统加上报警功能,就是通过rpc调用发短信发邮件的服务发送报警信息.发短信发邮件的功能是通过dubbo管理提供的.自然使用这些服务就难免用到spring.而我这又是一个st ...
- MySQL PXC构建一个新节点只需IST传输的方法
需求场景:原有的pxc环境数据量已经比较大,新买的服务器要加入此集群中,如何让其用IST的方式传输,而不是SST. PXC传输数据有两种方式: IST: Incremental State Trans ...
- 【原创】Kafka console consumer源代码分析(二)
我们继续讨论console consumer的实现原理,本篇着重探讨ZookeeperConsumerConnector的使用,即后续所有的内容都由下面这条语句而起: val connector = ...