这是一篇原本想谈用开源工具AssetsView做企业安全的文字,但还是忍不住多说些什么,包括基于网络层的大规模网络管理在内,成为我时常想关注想学习的内容。
缘由最近心血来潮,想把IT资产管理这件困难的事情在思想上理一理。一是遵从合规要求,真正意义上干漂亮这个事,同时更希望通过自动化工具实现资产识别和风险检测;二是自15年工作中接触过网络拓扑发现技术后,便一直对其强大的能力念念不忘,而对这种技术应用于大规模网络的网络安全保持着巨大的兴趣。
一、 拓扑发现的二三事
(一) 拓扑发现是什么
拓扑发现是网络设备与网络连接之间的探索和映射过程,通过技术手段获取网络节点的存在信息和节点之间的连接信息,从而形成网络拓扑图。拓扑发现的过程能够动态进行,持续发生,能够监控网络状态,识别网络瓶颈,这也是保证网络有效性的重要手段。
(二) 怎样实现拓扑发现
现实世界我们有很多商业化的工具可以做拓扑发现,功能强大,包括大量的网络安全功能;也有包括LanTopoLog这样的免费软件可以体验。
这些工具背后的技术很多与网络2层或3层有关,包括SNMP协议、网络活跃性探测和路由分析技术(指OSPF、EIRGP这样的路由协议),以及厂商的Cisco Discovery Protocol (CDP)和Juniper Discovery Protocol (JDP)等等。这些技术一般都属于网络工程师所接触的高级技能范畴,日常都不大去涉及,玩深玩透更是有难度。不过笔者非常建议大家多去了解一下这一块内容,这能够帮助我们不断接触到很多强大的网络工具。
(三) 拓扑发现的网络安全功能
可以预期通过拓扑发现技术,可以不断识别网络地址空间,并不断探索网络的边界;可以持续地对终端设备进行普查,这种审查发生在网络核心,不需要安装终端;同时,能够不断积累设备元数据和行为数据。
这些能力能够发现未曾记录在档案的网络,发现网络中的无赖设备,甚至发现有威胁特征的设备,等等。而消除这些网络安全风险所付出的代价又较小,这也是我青睐于拓扑技术在网络安全中应用的重要原因。
二、 AssetsView安装教程
商业工具和免费工具往往由于“只有一块钱做安全”和扩展性较差这样的理由直接枪毙掉,因此选择开源软件,进行二次开发也成为持续能力的重要保证。Assets View是偶然发现的安全类开源软件,并且使用了拓扑技术实现资产发现、网络拓扑管理,这很符合我的关注点。为此,我决定搭建这样的一套系统。
由于系统前端Web采用PHP+MYSQL开发,后端拓扑发现使用C实现,我分两步搭建。
(一) Web前端部署
虽然与拓扑发现有关,但AssetsViews与很多LAMP系统的搭建别无二致。具体给出CentOS 7下面的安装脚本:
- 安装MySql数据库
yum -y install mariadb-server mariadb
systemctl start mariadb.service
systemctl enable mariadb.service
MySQL的数据导入使用source指令即可,数据库脚本文件路径在“data\db”。
2.安装Apache服务器
yum -y install httpd
systemctl enable httpd.service
systemctl start httpd.service
3.开启CentOS 7的防火墙
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload
4.安装PHP和需要扩展模块
yum -y php php-mysql
LAMP环境部署完成后,可以将AssetsView导入Web目录,并配置Apache权限。之所以修改Apache权限,主要由于AssetsView使用了Apache的URL地址重写功能。
另外,大家在访问Web时会遇到部分JS调用异常的问题,这是由于“static\js\json”下面的JS文件内存在固定IP的缘故,删除或者替换为自己主机的IP,调用异常的情况就能够解决。
(四) 后端源码编译
如果,你和我一样尝试过对topo_scan模块进行编译,就知道整个编译过程并不顺利,有依赖库、数据库配置需要去修改,而且在GCC环境下,遗留个的C代码总有一些错误让你无法绕过;同时由于topo_scan使用了nmap的源码,目录分离进行编译必然又是一件吃苦头的事情。
既然topo_scan基于nmap,那么以nmap编译为基础,整个过程就会顺利不少。附上过程:
建立开发环境
yum groupinstall "Development Tools"
yum install glib2-devel mariadb-devel net-snmp-devel
下载nmap-7.12.tar.bz2,默认使用的是7.12版本的nmap,暂时还没测试过7.50。
bzip2 -cd nmap-7.12.tar.bz2 | tar xvf -
cd nmap-7.12
./configure
make
为了降低编译过程的难度,最好将修改后topo_scan源码与nmap源码合并编译。为了实现外部定义数据库连接信息,笔者引入RapidJSON作为配置管理工具,对应的文件为“topo_scan.json”。
我将修改后的源码附上,大家可以做参考。为了达成编译,需要对nmap下Makefile文件的做一定的修改,包括源码文件列表,具体为Makefile文件展示部分:
Makefile文件引用
export SRCS = main.cc handle_hash.cc thread_pool.cc common.cc icmp_snmp.cc handle_mysql.cc handle_snmp.cc switch_link.cc queue.cc charpool.cc FingerPrintResults.cc FPEngine.cc FPModel.cc idle_scan.cc MACLookup.cc main_nmap.cc nmap.cc nmap_dns.cc nmap_error.cc nmap_ftp.cc NmapOps.cc NmapOutputTable.cc nmap_tty.cc osscan2.cc osscan.cc output.cc payload.cc portlist.cc portreasons.cc protocols.cc scan_engine.cc scan_engine_connect.cc scan_engine_raw.cc service_scan.cc services.cc Target.cc TargetGroup.cc targets.cc tcpip.cc timing.cc traceroute.cc utils.cc xml.cc $(NSE_SRC)
export HDRS = charpool.h FingerPrintResults.h FPEngine.h idle_scan.h MACLookup.h nmap_amigaos.h nmap_dns.h nmap_error.h nmap.h nmap_ftp.h NmapOps.h NmapOutputTable.h nmap_tty.h nmap_winconfig.h osscan2.h osscan.h output.h payload.h portlist.h portreasons.h protocols.h scan_engine.h scan_engine_connect.h scan_engine_raw.h service_scan.h services.h TargetGroup.h Target.h targets.h tcpip.h timing.h traceroute.h utils.h xml.h $(NSE_HDRS)
OBJS = handle_hash.o thread_pool.o common.o icmp_snmp.o handle_mysql.o handle_snmp.o switch_link.o queue.o main_nmap.o charpool.o FingerPrintResults.o FPEngine.o FPModel.o idle_scan.o MACLookup.o nmap_dns.o nmap_error.o nmap.o nmap_ftp.o NmapOps.o NmapOutputTable.o nmap_tty.o osscan2.o osscan.o output.o payload.o portlist.o portreasons.o protocols.o scan_engine.o scan_engine_connect.o scan_engine_raw.o service_scan.o services.o TargetGroup.o Target.o targets.o tcpip.o timing.o traceroute.o utils.o xml.o $(NSE_OBJS)
对Makefile文件的修改,算是玩了一个小把戏,也是遵循nmap的源码结构做的微调。个人体会,在基于成熟的开源项目做开发时,一定要迎合原有的体系去做功能调整,这样改动小也能事半功倍,同时通过摸索nmap原来的源码结构可学到成熟的开发体系。
AssetsViews的效果图大家可以在项目主页去看,目前修改后的topo_scan代码仍在网络核心层SNMP代码部分的测试过程中。根据目前测试的情况,后续需要修订部分代码以完善SNMP的扫描功能。当然这也将是后续的事情了。
三、 总结
一直觉得做网络安全,学习路由、交换的知识是很有必要的,最终虽不一定去考证去配置设备,但学会规划网络,理解复杂网络技术,对于做好网络安全大有裨益,这才能真正地做好网络层的IT资产管理。
最后,向AssetsView的作者致谢,他开了个好头。
四、 参考资料
- topo_scan.rar 下载