在互联网环境下存在大量的僵尸主机的扫描行为,僵尸主机频繁更换IP,很难通过IP确定僵尸主机。通过使用FP-growth算法,分析防火墙的拦截日志,挖掘出浏览器的user-agent字段和被攻击的目标URL之间的关联关系,初步确定潜在的僵尸主机。完整演示代码请见本书GitHub上的11-4.py。
使用测试数据,其中ip表示攻击源ip,ua表示浏览器的user-agent字段,target表示被攻击的目标URL:
ip=ip1,ua=ua1,target=url1 ip=ip2,ua=ua1,target=url1 ip=ip3,ua=ua1,target=url1 ip=ip1,ua=ua1,target=url2 ip=ip2,ua=ua1,target=url2 ip=ip3,ua=ua1,target=url2 ip=ip4,ua=ua2,target=url2 ip=ip5,ua=ua3,target=url2 ip=ip5,ua=ua6,target=url6 ip=ip6,ua=ua3,target=url4 ip=ip7,ua=ua4,target=url4 ip=ip8,ua=ua5,target=url5
逐行读取测试数据文件,提取ip、ua和target字段,添加到transactions变量中:
with open("../data/KnowledgeGraph/sample7.txt") as f: for line in f: line=line.strip('\n') ip,ua,target=line.split(',') print "Add (%s %s %s)" % (ip,ua,target) transactions.append([ip,ua,target])
建设满足的条件为支持度为3,置信度为0.7的即认为是疑似僵尸主机:
patterns = pyfpgrowth.find_frequent_patterns(transactions, 3) rules = pyfpgrowth.generate_association_rules(patterns, 0.9)
经过FP-growth算法挖掘,满足条件的结果为:
{('target=url1',): (('ua=ua1',), 1.0)}