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 转换规则包含四个属性:
图1 URL转换规则
2)配置 URI 的权值:
转换后的 URI 对应的权值,权值越大,异常请求的可能性越大。
3)设置 IP 白名单:
白名单支持 IP 和 IP 段,白名单中的 IP 参与频繁集计算,但不会出现在拦截规则中。