运维利器:WEB日志分析场景介绍


运维利器:WEB日志分析场景介绍

文章插图
作者简介
朱林 资深开发人员,《Elasticsearch技术解析与实战》作者 。有接近20年的开发经验,15年安全产品开发经验,对安全技术、数据分析有较深的研究 。现任安全派技术总监,研究业务安全 。
 
为什么要对 Web日志进行分析随着 Web 技术不断发展,Web 被应用得越来越广泛,现在很多企业对外就一个网站来提供服务,所以网站的业务行为,安全性显得非常重要 。正如安全行业的一句话:“世界上只有两种人,一种是知道自己被黑了的,另外一种是被黑了还不知道的” 。
对网站的业务行为分析,网站的安全性分析一个很重要的途径就是通过日志 。通过WEB日志分析最直接明显的几个目的:
  • 一为网站安全自检查,了解服务器上正在发生的安全事件;
  • 二为应急事件中的分析取证;
  • 三是可根据日志分析一些常用的业务行为 。
 
如何进行日志分析?在进行日志分析之前,我们先来了解一下 Web服务器中产生的日志是什么样子 。我们来看一条 Apache 的访问日志为例:
114.221.137.87 - - [10/Sep/2019:14:52:28 +0800] "GET /login HTTP/1.1" 200 1068 https://secilog.secisland.com/ Mozilla/5.0 (windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/73.0.3683.105 Safari/537.36 Vivaldi/2.4.1488.40通过以上信息,我们可以得知服务器会记录来自客户端的每一个请求,其中有大量来自正常用户的请求,当然也包括来自恶意攻击者的请求,那么我们如何区分正常请求和恶意攻击请求呢?
站在攻击者的角度,攻击者对网站进行渗透时,其中包含大量的扫描请求和执行恶意操作的请求,而这两者在日志中都有各自的特征,如扫描请求会访问大量不存在的地址,在日志中体现则为大量的响应状态码为404,而不同的恶意请求都有各自相应的特征 。
如当有人对服务器进行SQL注入漏洞探测时会有类似:/login?attack=test';select/* */1/**/from/**/1等内容 。通过关键字分析可以分析哪些 IP 在进行攻击,可以进一步的进行处置,比如封ip等 。
 
日志分析场景介绍一般可以按照两种思路展开,逐步深入,还原整个攻击过程 。
  • 第一种:确定入侵的时间范围,以此为线索,查找这个时间范围内可疑的日志,进一步排查,最终确定攻击者,还原攻击过程 。
  • 第二种:攻击者在入侵网站后,通常会留下后门权限,以方便再次访问,我们可以找到该文件,并以此为线索来展开分析 。
曾经有人问过运维的人员的大神,该如何分析日志?大神回答了三个字:“用命令” 。
因为站在脚本操作经验丰富的人角度来看,的确用命令足矣,可是对于一般的人员来说用linux的shell命令还是稍显复杂 。还是需要借助一些工具来提高效率 。这里用了secisland 新推出的免费工具 secsoso 来作为示例:
spl 完整语法:secsoso ‘file=("文件名"," ") 过滤|统计…’简化语法:secsoso ‘文件名 过滤|统计…’
 
业务行为统计列出文件中访问次数最多的10个IPsecsoso 'file=("/export/home/20190613/access.log"," ")|stats count($1) by $1|sort 10 -count_$1'说明:其中/export/home/20190613/access.log为文件路径,“ ”为字段分割符 。文件名可以是绝对路径(/export/home/20190613/access.log) 也可以是相对路径(access.log) 。默认列名为$1,$2..., count($1)后的默认名称为count_$1 。
结果如下:
$1 count_$1101.226.68.137 972163.177.71.12 972183.195.232.138 971111.192.165.229 377114.252.89.91 37466.249.66.84 246222.70.152.149 226220.181.89.174 172111.194.118.58 16060.247.77.253 146你也可以给字段重命名以友好方式显示,这个是简化语法:结果同上 。
secsoso ‘access.log|rename $1 as ip |stats count(ip) by ip|sort 10 -count_ip’ 
查看文件中有多少个不同的IP访问secsoso 'access.log|rename $1 as ip |stats dc(ip) '结果如下:
dc_ip1050 
查看某一个页面被访问的次数比如 /nodejs-underscore/?cf_action=sync_comments为访问页面
secsoso 'access.log "/nodejs-underscore/?cf_action=sync_comments"|eventcount'红色字是过滤的含义,结果如下:
event_count14 
查看每一个IP访问了多少个页面


推荐阅读