谈到日志分析大多数人的感受是这是一个过后行为,场景当黑客成功将网站黑了。运营人员发现的时候安全人员会介入分析入侵缘由,经过分析黑客攻击行为每每会回溯最近几天甚至更加久远的日志。 php
0x01:处理过程。我的认为日志分析的过程分为3个阶段: java
过去: python
在以前不少网站的运营日志并很少少,只有几G多的可能几十,上百G,当出现了攻击行为时,利用grep、perl或者python脚本能够来完成,但这也是基本偏向于过后阶段。原始阶段,经过grep关键字来发现异常,这样并不能达到实时分析的结果,每每也是须要到出过后才能介入。 在后来,咱们在服务器上部署了perl脚本想经过实时tail日志来发现攻击者的行为从而进行一个好的分析。这里的问题是对服务器负载压力大,运维人员未必会协助你部署,比较苦逼。那么咱们可否在事前阶段介入呢? 答案是有的,经过下文介绍的方法来逐步实现。 mysql
如今: nginx
如今是大数据时代数据的最根本的体现就是大,随着电子商务的兴起。天天日志量上亿或者上十几亿基本成为了主流,若是仍是依赖以前的脚本或者grep根本没法完成既定的分析,更谈不上能实时分析。 web
大数据给咱们带来了不少针对大量数据处理的方案,好比hive(离线分析)、storm(实时分析框架)、impala(实时计算引擎)、haddop(分布式计算)、以及hbase,spark这样的技术。 正则表达式
那么在有了数据以前,咱们应该作点什么可以支撑咱们的安全数据分析平台呢? 算法
我以为能够分为几个阶段来进行: sql
数据收集。 shell
数据处理。
数据实时计算。
数据存储 分为2个部分:离线和实时。
首先第一点没有数据的话,就不要往下看了。
安全分析的基础是数据,全部的数据来源都源自web日志,从业务的角度来讲,这些都是业务日志,可是在个人眼里这些数据是“蜜罐”。
日志当中存在好的坏的人,咱们的目标就是从中筛出坏人。
基于大数据的技术如此多,经过架构及技术选型,选择的数据类型是这样:
数据收集经过flume实现,数据订阅使用kafka来实现,数据实时计算框架使用strorm来实现实时处理,数据存储经过2个方面来实现,实时存储和离线存储。
flume: Flume提供对数据进行简单处理,并写到各类数据接受方(可定制)的能力 Flume提供了从console(控制台)、RPC(Thrift-RPC)、text(文件)、tail(UNIX tail)、syslog(syslog日志系统,支持TCP和UDP等2种模式),exec(命令执行)等数据源上收集数据的能力。
kafka: Kafka1是linkedin用于日志处理的分布式消息队列。
storm: 实时计算框架,经过流处理来实现对数据的实时处理,storm具备实时性高、吞吐量大,低延迟,实时等特色,适合的场景是源源不断的数据源。 下图为storm ui界面:
日志基本处理:
经过这些方式,咱们有了日志后,须要观察日志的格式理解其各个字段的意思,将日志格式化方便进行提取,此处使用正则完成匹配。 好比一段nginx 日志规则:
log_format combined '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"';对于恶意攻击日志,在这里的关键字有哪些用的上呢? $request、$status、$body_bytes_sent、http_user_agent等。
经过格式化整理工做,在有了大量数据后,咱们要作的就是尽量去除眼前的障碍。
这些障碍包括各类扫描,各类爬虫,各类有意无心的入侵行为。
对于基本过滤,咱们关注的主要是2个:疑似成功的和不成功的,这些经过日志能够作基本的判别。
HTTP code = 403,404,502,301,这些基本均可以判断为不成功的攻击。
而htttp code 等于200和500状态基本可判断为疑似“成功攻击”。那么在有了这些基础的筛选后,能够去除较多的无用数据。
咱们的目标:记住咱们要抓的那种隐藏在大量障碍数据下的攻击,并不能仅仅依靠这些来实现分析,这是不专业且不负责任的行为。
规则定制:
经过规则定制,能够结合攻防经验加以前分析过程当中发现的问题整理成为规则,加入到storm实时分析job中,来发现攻击行为,将攻击行为入库。发现的多少,彻底取决于规则的多少与精准,包括正则的编写, 规则的定制。
Storm规则捕获:
在storm里的实现方式是,经过正则表达式匹配关键字,如:phpinfo。
Storm里的数据流向是storm接入Kafka topic,咱们能够经过tupple接收到的数据,将数据作预处理。
这个部分storm是使用prepare来作预处理,这里能够将正则表达式写入到prepare里。
Storm job是使用java编写的,这里匹配phpinfo的代码是:
有了数据的预处理后,须要执行搜索,正则表达式的逻辑就是,非黑即白,有就匹配没有就略过,这里忽略大小写。
Storm 使用execute来作执行层的逻辑判断,经过匹配tupple里是否包含Phpinfo,若是是则显示已找到phpinfo,若是不是则不回显结果。
经过将storm job,上传到Nimbus后,执行结果可发现以下信息,可实时发现phpinfo关键字,storm job的编译使用mvn来作。
最后经过数据库将匹配后的结果输出到数据库内,匹配到的结果是这样子的:
storm 实时计算支持本地调试和远程调试,本地访问http://hostname/phpinfo.php,storm 抓取到的信息:
写入数据库内的信息:
最后写入数据库后信息,能够看到14:23:41秒测试,14:23:49秒插入数据库。
经过Phpinfo 这个关键字匹配到的信息以下:
数据可视化:
经过基础的数据分析能够将结果绘成图,这样作的好处能够将攻击的监控时间段拉长不在拘泥于单一的数据库查询,固然不是为了可视化而可视化这就失去不 了了其意义,可视化的目的是为了运营须要。
表不如图,要作的足够好就应该考虑用户体验,但这样的可视化是有用的吗?
答案未必,可视化的目标是为了让别人清晰的看出来你所作的数据分析的真谛。
数据存储:
数据分析后,须要有针对性的存储,以备后续联合分析,数据存储主要采用离线和实时,实时主要是提供一天内的攻击趋势展示。
数据分析:(重点)
经过将这些规则的检查结果写入数据库,经过数据库查询方式将日志筛选,提炼出攻击时间,攻击ip,攻击次数,ip来源归属地以及一天有哪些时间段攻击最多,由此能够给黑客画一张活动轨迹图。
判断黑客的技术能力,是不是常客,以及做案动机是什么,但比较悲观的是即便分析了这些,对于攻击行为仍是须要采起必定的行为,好比把前top20 提取出来封掉。
其次就是攻击行为是否可进一步分析?若是只是这样分析是人人都会的,须要将这些数据结合漏洞来分析好比出现个shellshock漏洞,php cgi远程代码执行漏洞是否能发现?通过一段时间内的分析是能够总结个趋势的。
这一切的重点是特征、关键字,经过关键字势识别,就像识别你是胖的、瘦的、高的、矮的同样,先将你以类别区分出来,而后进行分析。
分析的前提是,先创建表,你想作啥查询,数据库表结构须要设置好,好比:
这里,咱们关心的信息是:攻击日志、攻击payload、攻击方法、攻击返回状态、攻击ip、攻击者浏览器指纹。
肯定分析范围:
须要肯定想找到哪些问题?sql注入、xss、文件包含、目录遍历、爆破、各类扫描器扫描。将这些信息聚集后,写入到规则中,经过storm实时计算,运算一段时间咱们就会获得各类各样的数据,有了分析的基本样本。
分析,其实就是个汇总的过程,使用mysql就能够完成。
咱们全部的分析都是从安全的角度来进行的,因此看看你们感兴趣的内容,有哪些user_agent?这里是awvs的扫描器指纹
各类各样的各类扫描数据:
从数据分析上来看,攻击者彷佛对discuz的.bak文件情有独钟。又或者,咱们来看看攻击者最热衷哪些phpmyadmin?
以及各类各样的xss:
以及咱们熟悉的struts2?
等等这些都是有特征,可被查找到的,查找到了其实不是目标,咱们的目标是能不能在智能点?
由于不少的攻击数据,都是无心义的,怎么从这些当中筛选出真正的危险,这部分是自动化测试的范畴,这里先不讲。
经过对这些数据的分析,能够比较轻易的知道有哪些东西是攻击者感兴趣的,以及市面上是否出现了1day被大规模利用。
0x02:将来:日志分析的将来,必定是以数据为前提的,经过机器学习和数据挖掘算法来实现对日志及攻击趋势的预测。
最后日志分析是个不断进化的过程,不断修炼。
数据库层面的压力比较大,使用Mysql对于千万级别的数据库查询有点不太适合,后续会考虑hbase等来处理。
以及考虑到使用诸如:贝叶斯算法来对历史数据进行评分及策略调整。