前言
仅记录在开发过程中的思考和理解如何构建一个网络空间指纹系统
- 整体架构: 整体搭建的结构;
- 任务调度: 怎样让多个扫描合理的去扫描而不错乱;
- 扫描器构造: 使用哪些指纹库,如何写出适合自己的扫描器;
- 存储归类: 怎么处理获得的凌乱的数据;
- 攻击框架: 如何发现网站的表示,以及快速发现网络的漏洞;
- 其他: 想改进的地方;
引言
有不少人都看过网络空间指纹扫描的系统,用户只要轻轻的一点,就能检索出,自己要求组件的主机信息。有不少人也很好奇这是怎么实现的,同样我也是,于是自己就开始动手,因此也就有了下文。当然水平有限,有些地方表述不一定正确,如果有什么地方存在不足,欢迎指正。
整体架构
整体的架构主要分为调度框架、ES存储、UI呈现等模块。
然而最核心的部分(调度框架)可以简化为两个工人集群。一个是抓取信息部分,另一个是处理信息。其中一批量爬虫工负责从任务池中接收任务,并抓取信息。另一批专门负责处理。有点类似于生产者与消费者。要构建这么一个系统,我们只要多个线程就能解决。但是如果我们想要变成一个集群的话,那思路略有不同。
我们在服务器中,首先要提供一个接口,负责当前访问的工人分配任务。当工人接收到任务的时候,接着就去完成任务,等到任务做好后,将得到的数据,重新提交给服务器。由服务器负责,将数据存储起来。同样的思维,处理信息的工作群也是这样的思路。这样整个雏形就出来了。
为了提高访问的速度以及使得信息能快速得到反馈,我们可以把工人反馈的任务在存储到数据库的同时,也把用户频繁检索所对应的数据,存入redis。这样,用户在检索的时候,首先去redis里面查找,如果找不到的话,就会去数据库里面找,如果还是找不到的话,才创建一个任务,并让工人类去执行任务。
如果不熟悉这样的操作方式的话,类似的思路可以去参考一下scapy,他的整体框架也是两批爬虫,一批负责爬取,一批负责存储,或者处理。
任务调度
任务调度常见的就是多线程/多进程,不过由于Python语言在多线程的实现上采用了全局锁,使得即使你采用多线程,也只能够在单核上跑.因此出现了多进程和协程的结合方式。常见的Python的调度框架有很多,如果你仔细去看的话,就会发现他们的实现方式有很多共同性,他们的整体逻辑就是一个队列和工人,然后根据需要处理完任务,是否返回其他操作。所以你也完全可以自己是定制一个适合自己的实现方式。
未完待续。。。