构建你比较满意的分布式扫描平台(上)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介:

0x00、前言

在云安全内部安全能力建设中,对云资产的端口扫描是一个必须要做的事情,因为开放一个端口对外提供一个服务都是扩大了您在云上攻击面。对于这种危险需要尽早的通知云上用户。那么如何对几万甚至几十万云主机做有效的端口扫描和精确的服务识别?这需要一套分布式的扫描系统来支撑。

0x01、实践的认知

在此之前,做了一些的小实践

构建你比较满意的分布式扫描平台(上)

方向3的代码如下:

# coding=utf-8
#!/usr/env/bin python
//存储到redis
def store(result):
 r=redis.Redis(host='127.0.0.1',port=6379,decode_responses=True,password=xxxx)
 with open(result,'r') as f:
 for line in f:
 if line.startswith('{ '}:
 try:
 temp = json.loads(line[:-2])
 tmp1=temp["ports"][0]
 r.append(temp["ip"],str(tmp1["port"])+",")
 except:
 continue
 return r
//masscan扫描模块
def Scan():
 try:
 global g_queue
 while not g_queue.empty():
 item = g_queue.get()
 result = "result"+item+".json"
 p = subprocess.Popen("/root/masscan/bin/masscan "+item+" -p T:21-23,25,80,81,88,110,143,443,1080,1433,1521,1158,3306-3308,3389,3690,5432,5900,6379,7001,8000,8080,9000,9418,27017-27019,50060,111,11211,2049 -oJ "+result, shell=True)
 p.wait()
 if p.returncode==0:
 print ('ok')
 if os.path.getsize(result) != 0:
 print item
 store(result)
 if g_queue.qsize() == 0:
 print (u'公有云高危端口扫描结束')
 return "ok"
 except Exception,e:
 print e
 return e
if __name__ == '__main__':
// ip地址压入队列
 csvfile2 = file('xxx_public_ip.csv', 'r')
 reader = csv.reader(csvfile2)
 for x in reader:
 ips = IP(x[0])
 for y in ips:
 g_queue.put(y.strNormal(0))

Nmap扫描模块

def NmapScan():
 try:
 global g_queue
 
 while not g_queue.empty():
 item = g_queue.get()
 filename = item.split(' ')[1]+"_"+item.split(' ')[0]
 result = "result"+filename.strip()+".xml"
 print result
 p = subprocess.Popen("/usr/bin/nmap -oX "+result+" -sV -p"+item, shell=True)
 p.wait()
 if p.returncode==0:
 nmap_report = NmapParser.parse_fromfile(result)
 for scanned_hosts in nmap_report.hosts:
 print scanned_hosts.address
 for serv in scanned_hosts.services:
 if serv.state == "open":
 m = serv.service_dict.get('extrainfo', '')
 print m
 if m.find('\'') != -1:
 pass
 else:
 writer.writerow([scanned_hosts.address,str(serv.port),serv.service,serv.service_dict.get('product', ''),serv.service_dict.get('version', ''),serv.service_dict.get('extrainfo', '')])
 print "size = ", g_queue.qsize()
 if g_queue.qsize() == 0:
 print (u'公网服务指纹扫描结束')
 return "ok"
 except Exception,e:
 print e
 return e

构建你比较满意的分布式扫描平台(上)

//从队列中读取扫描目标

pool = redis.ConnectionPool(host='127.0.0.1',port=6379,decode_responses=True,password=xxxx,db=0)
 r = redis.Redis(connection_pool=pool)
 
 pipe = r.pipeline()
 pipe_size = 100000
 
 len = 0
 key_list = []
 print r.pipeline()
 keys = r.keys()
 for key in keys:
 key_list.append(key)
 pipe.get(key)
 if len < pipe_size:
 len += 1
 else:
 for (k, v) in zip(key_list, pipe.execute()):
 print k, v
 len = 0
 key_list = []
 
 for (k, v) in zip(key_list, pipe.execute()):
 for sport in v.split(','):
 if sport!='':
 item = sport+" "+k
 print item
 g_queue.put(item)

还是出现阻塞的情况。

构建你比较满意的分布式扫描平台(上)

不得不要从架构上考虑一下了。

0x02 分布式扫描架构探讨

思维是循序渐进的,否则你在认知的路上永远是抄袭别人,但是不知道为什么这么做。其实核心需要解决的是阻塞的事情,还有通过分布式扩展计算和带宽的能力以满足大规模扫描的安全能力。

思考1:阻塞问题那通过异步IO处理

构建你比较满意的分布式扫描平台(上)

1、web控制层

·使用Nginx搭建,解析VUE生成的html文件。做界面展示

·使用uWSGI搭建web中间件服务器,解析Django开发的python程序,做OpenAPI层。

·数据库使用postgresql。存储扫描配置扫描任务等信息

2、Web数据展示层

·底层扫描数据直接通过logstash进入Elastic Search中,所有的报表都都通过API访问ES,这样方便做变化对比。

3、任务调度层

· 消息队列使用自建的Redis做。

·异步IO使用tornado做。

4、Worker执行者

·控制参数通过redis获取

·扫描插件使用python编写,那么对于端口扫描其实就两个一个masscan和nmapscan插件。

·扫描结果通过logstash传入到Elastic Search

5、数据层

打算用kafka实现,这个要看会不会有突然大量数据涌入到ES中。

思考2:有没有成熟的组件完成上述事情呢?

最近在朋友圈传的百度陆奇《如何成为一名优秀的工程师》提到了上述观点,然后我豁然开朗,异步IO处理,在Django生态中有celery呀。它其实就是把redis+tornado的事做了。同时也借鉴了github同行的Demo程序,确实异步任务处理起来比较麻烦,为什么不用成熟的组件呢?

最终的技术架构图:

构建你比较满意的分布式扫描平台(上)

当然要考虑架构ROI投入产出比,后期会加入web漏洞扫描、web指纹识别、暴力破解、子域名暴力破解、目录文件列举、Web爬虫、SQLi、XSS这些耗时长的任务。

0x03、总结

本篇主要讨论了架构设计方便的问题,下篇会着重在系统搭建、代码实现等方面说明分布式扫描系统的那些事。


原文发布时间为:2018-05-23

本文来自云栖社区合作伙伴“嘶吼网”,了解相关信息可以关注“嘶吼网”。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
3月前
|
存储 监控 固态存储
【vSAN分布式存储服务器数据恢复】VMware vSphere vSAN 分布式存储虚拟化平台VMDK文件1KB问题数据恢复案例
在一例vSAN分布式存储故障中,因替换故障闪存盘后磁盘组失效,一台采用RAID0策略且未使用置备的虚拟机VMDK文件受损,仅余1KB大小。经分析发现,该VMDK文件与内部虚拟对象关联失效导致。恢复方案包括定位虚拟对象及组件的具体物理位置,解析分配空间,并手动重组RAID0结构以恢复数据。此案例强调了深入理解vSAN分布式存储机制的重要性,以及定制化数据恢复方案的有效性。
96 5
|
16天前
|
消息中间件 监控 数据可视化
Apache Airflow 开源最顶级的分布式工作流平台
Apache Airflow 是一个用于创作、调度和监控工作流的平台,通过将工作流定义为代码,实现更好的可维护性和协作性。Airflow 使用有向无环图(DAG)定义任务,支持动态生成、扩展和优雅的管道设计。其丰富的命令行工具和用户界面使得任务管理和监控更加便捷。适用于静态和缓慢变化的工作流,常用于数据处理。
Apache Airflow 开源最顶级的分布式工作流平台
|
21天前
|
存储 运维 负载均衡
构建高可用性GraphRAG系统:分布式部署与容错机制
【10月更文挑战第28天】作为一名数据科学家和系统架构师,我在构建和维护大规模分布式系统方面有着丰富的经验。最近,我负责了一个基于GraphRAG(Graph Retrieval-Augmented Generation)模型的项目,该模型用于构建一个高可用性的问答系统。在这个过程中,我深刻体会到分布式部署和容错机制的重要性。本文将详细介绍如何在生产环境中构建一个高可用性的GraphRAG系统,包括分布式部署方案、负载均衡、故障检测与恢复机制等方面的内容。
77 4
构建高可用性GraphRAG系统:分布式部署与容错机制
|
30天前
|
运维 供应链 安全
SD-WAN分布式组网:构建高效、灵活的企业网络架构
本文介绍了SD-WAN(软件定义广域网)在企业分布式组网中的应用,强调其智能化流量管理、简化的网络部署、弹性扩展能力和增强的安全性等核心优势,以及在跨国企业、多云环境、零售连锁和制造业中的典型应用场景。通过合理设计网络架构、选择合适的网络连接类型、优化应用流量优先级和定期评估网络性能等最佳实践,SD-WAN助力企业实现高效、稳定的业务连接,加速数字化转型。
SD-WAN分布式组网:构建高效、灵活的企业网络架构
|
25天前
|
监控 算法 网络协议
|
23天前
|
存储 监控 大数据
构建高可用性ClickHouse集群:从单节点到分布式
【10月更文挑战第26天】随着业务的不断增长,单一的数据存储解决方案可能无法满足日益增加的数据处理需求。在大数据时代,数据库的性能、可扩展性和稳定性成为企业关注的重点。ClickHouse 是一个用于联机分析处理(OLAP)的列式数据库管理系统(DBMS),以其卓越的查询性能和高吞吐量而闻名。本文将从我的个人角度出发,分享如何将单节点 ClickHouse 扩展为高可用性的分布式集群,以提升系统的稳定性和可靠性。
55 0
|
3月前
|
监控 Java 开发者
随着软件开发的发展,传统单体应用已难以适应现代业务需求,微服务架构因此兴起,成为构建可伸缩、分布式系统的主流
随着软件开发的发展,传统单体应用已难以适应现代业务需求,微服务架构因此兴起,成为构建可伸缩、分布式系统的主流。本文探讨Java微服务架构的设计原则与实践。核心思想是将应用拆分为独立服务单元,增强模块化与扩展性。Java开发者可利用Spring Boot等框架简化开发流程。设计时需遵循单一职责、自治性和面向接口编程的原则。以电商系统为例,将订单处理、商品管理和用户认证等拆分为独立服务,提高可维护性和容错能力。还需考虑服务间通信、数据一致性及监控等高级话题。掌握这些原则和工具,开发者能构建高效、可维护的微服务应用,更好地应对未来挑战。
88 1
|
3月前
|
消息中间件 Java Kafka
"Kafka快速上手:从环境搭建到Java Producer与Consumer实战,轻松掌握分布式流处理平台"
【8月更文挑战第10天】Apache Kafka作为分布式流处理平台的领头羊,凭借其高吞吐量、可扩展性和容错性,在大数据处理、实时日志收集及消息队列领域表现卓越。初学者需掌握Kafka基本概念与操作。Kafka的核心组件包括Producer(生产者)、Broker(服务器)和Consumer(消费者)。Producer发送消息到Topic,Broker负责存储与转发,Consumer则读取这些消息。首先确保已安装Java和Kafka,并启动服务。接着可通过命令行创建Topic,并使用提供的Java API实现Producer发送消息和Consumer读取消息的功能。
73 8
|
3月前
|
机器学习/深度学习 分布式计算 PyTorch
构建可扩展的深度学习系统:PyTorch 与分布式计算
【8月更文第29天】随着数据量和模型复杂度的增加,单个GPU或CPU已无法满足大规模深度学习模型的训练需求。分布式计算提供了一种解决方案,能够有效地利用多台机器上的多个GPU进行并行训练,显著加快训练速度。本文将探讨如何使用PyTorch框架实现深度学习模型的分布式训练,并通过一个具体的示例展示整个过程。
160 0

热门文章

最新文章

下一篇
无影云桌面