企业安全怎么建设?企业安全漏洞通告引擎。如今大多数企业都在用漏洞扫描+漏洞通告,存在如下两个问题:
1. 漏扫存在“扫描周期长、扫描库更新不及时”等情况,同时扫描报告中有无数干扰项,导致了漏扫报告约等于“漏洞信息堆砌”,真正有用的可能没几个,而让甲方运维人员从中找到有用的信息,真是异常耗时耗力。
2. 安全厂商的漏洞通告是“只通知,具体影响那台服务器,运维自己找去吧。”
由以上两个痛点,我们想出来一个二者结合的用法:通过各种方法收集到所有服务器当前的中间件、数据库等版本,再通过资产列表匹配到相应服务器的运维人员邮箱,最后再到靠谱的安全厂商漏洞公告网站抓到最新的漏洞资讯以及影响范围,一旦“当前版本”处于“影响版本”范围内,则立即进行邮件告警。
0×01 整体框架
整体分为输入、主引擎以及输出三个部分。
1. 输入部分:
a) 版本探测:针对服务器各应用的版本探测扫描、不便于扫描的区域进行手工检查版本并录入
b) 爬虫:选出多家安全厂商,通过其安全漏洞公告的网站进行每日(或更高频次)漏洞信息抓取
2. 主引擎部分:
a) Python:真心好用
b) 数据库:制定“应用-IP-版本-管理员”表
c) 版本比较:通过比较漏洞影响范围&当前应用版本,来判断是否存在安全问题
d) 最新漏洞告警:定时任务运行(每日一次或更高频次),以自动发现最新的安全漏洞
3. 输出部分:
根据“应用-IP-版本-管理员”的对应关系,自动将相应的应用漏洞发送给相应的运维管理员,实现较为精准的自动化漏洞通告&新漏洞预警。
0×02 输入部分
这里有多种方式来实现版本的自动扫描,如Nessus、各厂家的漏扫等等,由于应用版本更新频率低,漏洞更新频率高,故而通过每个月一次的扫描可以较为准确地获得当前可探测到的服务器中所运行的应用版本。另外需要制作出“应用-IP-版本-管理员”的对应关系,以便发现最新漏洞后通知给相应应用的负责人。
2.1 制作“应用- IP-版本”对应关系表(表名为apps)
首先需要定位“版本信息”所在位置,通过漏扫导出的excel主机报表可以发现,仅在“扫描报告-漏洞信息sheet-返回信息列”可能会包含版本信息(如下图),故想办法定位到指定sheet+指定列,从而使用正则获取到形如[Microsoft-IIS/8.5]中的信息
这里会用到pyexcel_xls,该模块可以读取excel表中信息,如下。
#从excel中读出漏洞信息这个sheet
vulList = xls_data[u'漏洞信息']
#设置一个去重的集合,存放当前IP的app和version
currentIPApps = set()
#从第二行开始读
for i in range(1,len(vulList),1):
#取excel表中第4列的漏洞描述和第14列的版本信息
#print vulList[i]
name = vulList[i][3]
try:
version = vulList[i][13]
if "/" in version:
if ("[" in version) and ("]" in version):
version_tmp = re.findall("\[(\w+.*/\d+.*)]",version)
之后再通过细粒度的正则和各种奇葩内容的排除后,得到当前版本信息,如nginx 1.8.1,存到数据库待用。
每次扫描都会有大量的主机报表产生(如下图)
此时需要逐个遍历目录中的所有文件:
def GetFileList(dir, fileList):
newDir = dir
if os.path.isfile(dir):
fileList.append(dir.decode('gbk'))
elif os.path.isdir(dir):
for s in os.listdir(dir):
# 如果需要忽略某些文件夹,使用以下代码
# if s == "xxx":
# continue
newDir = os.path.join(dir, s)
GetFileList(newDir, fileList)
return fileList
于是通过目录遍历+excel遍历后,应用- IP-版本的对应关系就搞定了。
2.2 完善“应用-IP-版本-管理员关系对应表”
有了上面的表还不够,即使有漏洞通告,无法自动落实到人,也是空谈。于是要将IP-管理员的对应关系加入进来。
此时我们需要先要有信息系统资产表,其中至少应包括“IP-管理员”(如下图)
再根据每次遍历扫描结果输出目录中的报表IP作为查询条件,进行资产表查询,将获取到的管理员名称添加到“apps”表中的对应位置,制作完毕后如下图所示,资产输入部分完毕。
2.3 漏洞公告网站爬虫
爬虫的目的:抓到所有应用名称的漏洞信息&影响范围。
爬虫示例:绿盟漏洞公告爬虫