“撞库”是安全领域常常发生的一种黑产攻击事件。在常见的安全防御中,安全团队一般会在登录接口设置安全策略来应对攻击。但是,一旦黑产更换攻击规则,就会致使策略失效。java
在这样的状况下,咱们须要的就不只仅的表层的“防火墙”,而是一套完整的业务风控系统,它能够有效的规避风险,下降损失。python
在这篇文章中,咱们将介绍如何利用开源风控系统TH-Nebule(星云)防止“撞库”攻击。mysql
文章会从“撞库”的介绍逐渐深刻到对TH-Nebula的使用,包括:如何部署、如何使用、和为何须要风控系统等。阐述为何须要一套“系统”去解决业务安全问题,接着手把手教你部署本系统,以及如何利用我们这套风控来阻断风险,并提供模拟测试demo。nginx
TH-Nebula是由威胁猎人开源的风控系统,目前源码已放在Github和Gitee上,完全开放全部源代码,文档,以及安装包。git
地址:github
1.什么是撞库?web
说到撞库,先得从”社工库”提及,社工库是社会工程学数据库的简称,这个数据库里找包含了每一个人的各类行为记录(在不一样网站上的帐号、密码、分享的照片、信用卡记录、通话记录、短信记录、开房记录等等)。redis
因此当黑客想尝试登陆某个网站或者app时,就会用”社工库”里的信息去挨个尝试登陆,”撞”出一个个正确帐号。sql
2. 如何防止撞库?docker
首先从企业的web服务视角来看,若是发现如下几种状况,基本能够断定是在撞库:
在这种状况下,最简单粗暴的方法就是直接在登录接口加安全策略。
如,
看起来简单粗暴的方法是能够起到防御做用,但实际上,道高一尺魔高一丈,业务安全就没有一劳永逸的方案。只要有利可图的前提下,黑灰产就会不断的变换本身的规则,来“攻破”业务的防御。
好比,业务限制的是1分钟访问限制<50次,那黑产很容易就能够改为40次就能绕过你的策略,这对于他来讲只是改了一行代码。
再好比,如今互联网社会里,IP资源能够说是至关廉价,简单就从IP角度去断定能够说很是容易被绕过。
因此业务安全的防御不是简单作一层“防火墙”就能够了,是须要有一套完整的能跟黑产持续对抗的“系统”。
这套系统除了能够自定义策略,从各个维度在网络流量中发现风险之外,还得具有
TH-Nebula(星云)就是这样一套系统。它可以让企业有能力主动发现业务风险,并快速的实施攻防对抗。星云采用旁路流量的方式进行数据采集,无需在业务逻辑上作数据埋点或侵入,同时支持本地私有化部署和Docker镜像云端部署,大大下降了使用门槛。
系统分为两块服务
1)Nebula服务:包括风控配置分析系统,流量的接收和分析,策略引擎,风控web控制中心等模块
2)Sniffer服务:流量的抓取服务
其中,流量的抓取服务这块为了作到不对业务系统自己作代码修改,提供了多种配置方式。用户能够直接在web服务机器部署,采用旁路流量的方式获取流量;也能够经过标准化nginx或其余http服务的输出日志,采起抓取日志的方式获取流量
下面就以防止撞库为例子,一步步教你把TH-Nebula风控系统跑起来
如上所述Nebula开源项目分为Sniffer流量抓取服务、Nebula服务两块,建议直接采用docker方式部署,部署参考以下github文档:
1.Nebula服务
参考github教程部署完以后,运行./ctrl.sh status可查看Nebula服务的运行状态,以下图则表明部署成功,默认配置下Nebula的web控制中心是经过9001端口访问:
Name Command State Ports -------------------------------------------------------------------------------------------------- nebula /entrypoint.sh /usr/bin/su ... Up 0.0.0.0:9001->9001/tcp nebula-aerospike /entrypoint.sh asd --foreg ... Up 3000/tcp, 3001/tcp, 3002/tcp, 3003/tcp nebula-db docker-entrypoint.sh mysqld Up 3306/tcp nebula-redis docker-entrypoint.sh redis ... Up 0.0.0.0:16379->6379/tcp cron RUNNING pid 27, uptime 4 days, 22:23:47 java_web RUNNING pid 33, uptime 4 days, 22:23:47 labrador RUNNING pid 10286, uptime 2 days, 21:26:41 nebula:incident_babel_db_writer RUNNING pid 19, uptime 4 days, 22:23:47 nebula:nebula_db_query_web RUNNING pid 12, uptime 4 days, 22:23:47 nebula:nebula_offline RUNNING pid 14, uptime 4 days, 22:23:47 nebula:nebula_online RUNNING pid 19720, uptime 0:29:22 nebula:nebula_query_web RUNNING pid 15, uptime 4 days, 22:23:47 nebula:nebula_web RUNNING pid 11, uptime 4 days, 22:23:47 nebula:notice_babel_db_writer RUNNING pid 13, uptime 4 days, 22:23:47 nginx RUNNING pid 29, uptime 4 days, 22:23:47
2.Sniffer服务
这里为了方便后面模拟测试,建议就直接采用最简单旁路流量方式(bro驱动)启动Sniffer服务,即git上默认配置:
.... - SOURCES=default #default driver - DRIVER_INTERFACE=eth0 - DRIVER_PORT=80,8080,9001 ....
说明:
把Nebula和Sniffer两块服务正常启动起来,则可经过 http://IP:9001端口的方式访问 TH-Nebula界面了,如图:
2.配置防止撞库规则
部署完Nebula服务以后,在策略管理tag中能够看到, Nebula系统针对帐号风险规则,已经默认配置了基本的防撞库策略。以下图:
用户也能够自定义新规则或者修改默认规则,参考以下github文档:
部署并配置好规则以后,接下来就是经过模拟撞库的过程,校验系统的风险检测逻辑。
模拟脚本原理就是针对Sniffer模块监听的9001端口连续发起1000次登陆请求(这里为了方便测试没有在服务端实现login接口,但风控系统对于404的访问也一样会捕获到)。具体python代码以下:
#!/usr/bin/env python # -*- coding: utf-8 -*- from requests import get from requests import put from requests import post from requests import delete port = 9001 class NewRequestsData(object): def __init__(self, url, data, cookies, method='get'): self.data = data self.url = url self.cookies = cookies self.method = method def request(self): m = dict( get=get, put=put, post=post, delete=delete, ) method = m[self.method] text = '默认模式' code = 'None' header = { "connection": "close", "content-type": 'application/json', } try: if self.method in ['get', 'delete']: response = method(self.url, params=self.data, cookies=self.cookies, timeout=10, headers=header) elif self.method in ['post', 'put']: data = dumps(self.data, ensure_ascii=False).encode('utf8') response = method(self.url, data=data, timeout=8, headers=header, cookies=self.cookies) else: raise ValueError text = response.text code = response.status_code except Exception as e: print("error", e) finally: return (text, code) def attack_login(): data = dict( username="threathunter@threathunter.cn" ) r = NewRequestsData('http://127.0.0.1:{}/login'.format(port), data, {}) code, text = r.request() if __name__ == '__main__': i = 0 for i in range(1000): attack_login() print('总访问次数:', i)
捕获流量的截图:
因为 TH-Nebula 属于旁路分析模式,因此没法主动拦截风险事件,须要与企业端应用进行集成后实现自动阻断的功能。
针对业务系统拉黑阻断,系统提供如下两种风险数据获取方法:
主动推送:TH-Nebula 能够将分析发现的风险推送至拦截节点进行自动的风险阻断。
被动调用:TH-Nebula 能够将分析发现的风险名单以接口方式提供给拦截节点调用判断风险。
详细请参考文档:
以上就是经过部署TH-Nebula开源风控系统,配置防撞库策略的整套流程。
在系统使用过程当中,如遇任何疑问,可在Github进行反馈: