4. 使用指南

analog 是一款命令行下的Web日志审计工具,旨在帮助使用者能够在终端上快速得进行Web日志审计和排查,包含了日志审计、统计的终端图形化和机器学习识别恶意请求的功能

经过安装以及配置文件,现在已经可以使用 analog 进行日志审计了,但要使用机器学习识别恶意请求的功能则还需要进行一定量的训练数据筛选和黑白测试样本的选择 详细步骤点击这里

4.1. 语法

在设计analog之初,考虑到要展示统计、分析、审计,训练等功能、还要兼顾变量设置、其他功能的调用,于是设计了如下的analog的基本语法。
可能使用者第一次看到会觉得比较复杂难记,但是analog实现了较为完整的命令行提示,可以通过简单地输入<tab>和<space>键获得当前可用选项,进而调用完整的功能,具体效果请看动图。其实现基于开源的命令行工具 prompt-toolkit
_images/analog_prompt.gif

让我们来看一下语法的整体架构和具体功能:

show

展示各类功能

statistics <requests | ip | ua | url>

统计功能。当统计量为requests时,将统计时间范围内的访问请求数量,给出统计柱状图。其他则为统计表。

current <hour | day | week | month | year>

给出统计的日志时间范围:当前小时、天、周、月、年

top <N>

给出统计结果的前多少个(默认前10,倒序)

例子

show statistics requests current day

show statistics ip current week top 20

log

表格展示访问日志,用作日志可视化审计

current <hour | day| week | month | year>

给出统计的日志时间范围:当前小时、天、周、月、年

例子

show log current hour

show log current week

show log of ip 8.8.8.8

analysis

对日志进行恶意分析,做出分析报告

current <hour|day|week|month|year>

给出分析的日志时间范围:当前小时、天、周、月、年

例子

show analysis current week

show analysis current month

train | retrain

开始训练模型

locate

用IP库定位某个具体IP

ip <query_ip>

固定字段ip, your_ip为查询ip

例子

locate ip 8.8.8.8

set

设置变量

<day | month | year | date>

设置当前日期(注:date格式如2020/2/10, day | month | year 格式则为纯数字)

offset

设置当前日志的偏移,用于日志审计模式

get
<hour | day | month | year | date>

显示当前设置的日期

offset

显示当前偏移

progress

获取模型训练进度

基本语法可以在通过analog控制台中输入 help 获取帮助:

analog> help
Usage:
    show  <statistics|analysis|log>  <IP|requests|UA|url>  <current|last>  <day|week|month|year|all>  (top N)

Example:
    show statistics requests current day              Draw a chart to show statistics of website visit
    show statistics url last week top 10              Draw a chart to show statistics of requests
    show analysis current day                         Display log analysis using abnormal detection model.
    show log current day                              Display the log in a table.

More:
    train|retrain                                     Train your model
    get progress                                      Get progress of training model
    get time|date|offset                              Display values
    set date 2019/8/3                                 Set date
    set day|month|year|offset N                       Set values
    get <values>                                      Get values

More information:
    <https://www.testzero-wz.com>
    <https://github.com/Testzero-wz>

接下来将以各个功能为例子逐个介绍应该如何使用analog。


4.2. 各功能示例详解

4.2.1. 统计

4.2.1.1. 访问量柱状图

统计站点当前时间段的请求数量并作出访问次数柱状图,直观地查看站点访问情况。
其中时间段的最大区间为year,最小区间为hour。可供选择时间区间为:
year, month, week, day, hour

示例命令:

analog> show statistics requests current month
analog> show statistics requests current day
_images/21-10-22.jpg
默认统计的时间节点为当前时间,若当前时间无统计日志,可设置统计时间点为适当的日期。
log 目录下的日志为2020年2月3日到2月8日的,则可以输入一下命令改变统计时间节点:
analog> set date 2020/2/3
# 或者逐级设置
analog> set year 2020
analog> set month 2
analog> set day 3

更详细的时间设置请参照 日期设置

4.2.1.2. 访问统计

当然,我们的统计也可以基于一些主要的变量,如来访者的IP,请求的Url,甚至是User-Agent。
如:统计当前年份各IP的访问次数(降序),默认给出top 10。
analog> show statistics IP current year
_images/21-10-23.jpg

可以通过在命令后增加top <N>字段修改展示的统计量

analog> show statistics IP current year top 30
_images/21-10-24.jpg

统计当前年份请求路径url的访问次数(降序)。

analog> show statistics IP current year
_images/21-10-25.jpg

统计当天User-Agent的访问次数(降序)。

analog> show statistics IP current year
_images/21-10-25.jpg

统计UA的访问次数可以更好的了解当前时间段内最多次数访问者的UA情况(假设UA不变的话,如搜索引擎的爬虫),这里仅提供一种分析角度。

Tip

统计模式支持的最小时间范围为小时,即我们可以轻松地统计某个小时内的访问。

4.2.2. 日志审查

由于笔者也有平时看看访问日志的习惯,而直接cat或者tail日志文件 access.log 又着实不优雅,遇到gz压缩后的文件则更加让人没有想查看的“欲望”。于是乎,analog提供了更直观的日志审查方式。
如:输入以下命令审查当天的访问日志:
analog> show log current day
_images/21-10-26.jpg
输出的表格是一个复合信息表,整合了日志里面的内容,有IP地址的归属地判断,也有实时地对当前日志记录进行的正常、恶意判断。
若是出现"No more logs"的提示则说明当前日期和日志的记录日期不符,命令中的" current day "是基于当前设置的时间来敲定读取范围的
我们可以键入"get"命令获得当前设置的时间
analog> get time
[*] time => 2020/03/30 21:00:00
那么假设我们导入的日志是3月16号到3月28号的,那么根据当前设置的日期确定的时间范围内(例子中是"current day",则时间范围为2020/03/30全天)是不会有记录的,那么我们需要改变当前日期到3月16号到3月28号的任意一天:
analog> set day 20
[*] time was set to 2020/03/20 21:00:00
这样才能审计得到对应的日志。更详细的时间设置请参照 日期设置

Note

值得注意的是,当我们输入日志审查命令后,analog就已经进入了 日志审查模式
在该模式下,使用上、下方向键进行历史命令回溯功能将被暂时禁用,取而代之的是使用上、下方向键进行日志翻页。

PS: 我们可以随时按ESC键退出审计模式回到 正常模式

我们也注意到了,单次默认展示的记录条数都是6条,虽然有上下键快速地翻动功能,但是对于较大的日志,这种方式还是不够方便。
可以看到,每一条查询出来的日志记录都有一个序号,在 Ord 字段予以展示,我们可以设置偏移以达到快速定位的目的。
analog> set offset 100
键入该命令之后我们将从第101条日志记录开始审查
_images/12-32-21.jpg

Warning

为了查询性能,analog单次仅查询5000条日志,当翻页达到5000,或者说偏移到达5000时,analog会自动查询下一5000条数据,以此类推。 若你的性能足够,可以通过配置config.ini中的 [log] 的字段 logs_per_query ,将默认值5000换成可以接受的数值。

其实analog在日志审计的功能下,还有一个使用的小功能:针对特定IP进行筛选其访问日志。
analog> show log of ip 18.27.197.252
_images/10-17-26.jpg

4.2.3. 恶意请求分析

对于训练好模型的我们,需要关注某个特定时段内出现的异常报告。
如:我们想要获取本月的异常报告,可以输入以下命令:
analog> show analysis current month
_images/10-19-59.jpg
报告中包含以下几部分:
  • 异常访问IP的统计(IP视角)

  • 异常访问的请求URL的统计(URL视角)

  • 异常访问IP的物理地区的归并统计(IP地区视角)

  • 该时间段内的恶意请求和正常请求的百分比(恶意请求百分比视角)

总而言之,我们可以通过 analysis 命令轻松地得到一个该时间段从多个视角归并的访问情况的概述。

4.2.4. 参数设置

analog 内置了一些可设置的参数,我们可以根据具体情况进行设置。

4.2.4.1. 日期设置

基本上 analog 的命令都是要基于一个时间节点然后选取范围的,而 analog 默认的时间取的是当前的系统时间,那么当我们需要读取几个月前的日志数据就会显得很不方便。

analog 提供了设置时间命令,可以供使用者自由地设置当前时间。
设置年月日命令( N 为纯数字):
analog> set <hour | day | month | year> N

直接设置当前日期命令(注:date格式如2020/2/10):

analog> set date 2020/2/10

4.2.4.2. 日志偏移设置

根据我们的需求设置当前日志读取的偏移,其中 N 为纯数字:

analog> set offset N

Tip

当再次启动 日志模式 时,offset 将会自动地重新设置为0。

4.2.5. 定位IP

使用 locate 命令,我们可以调用IP库定位某个具体的IP。
analog> locate ip  <query_ip>

locate 命令有一个固定格式,即 locate 后面需要加上固定搭配 ip , 而 your_ip 为想要查询的ip,如:

analog> locate ip 106.11.159.21
[*] 106.11.159.21 => 中国-浙江-杭州

4.2.6. 重新加载日志文件

如果我们需要重新加载日志文件,我们可以键入以下命令重新加载日志文件。

analog> reload
需要注意的是,reload 命令将询问你是否清空原有的数据表。如果选择不清空,则之前加载过的日志将继续存留在数据库中
在确认是否清空数据表之后,analog 将自动退出,并在下一次启动时自动加载新的日志文件。
此时配置文件 config.iniinitial 字段将被程序自动设置为0。
analog> reload
[!] Reload option will duplicate your logs if you don't erase DB table first.
[!] Would you like to erase table?[Y/n]
y
[!] Erased table `weblog`.
[*] Please start analog once again.

4.2.7. 检测模型相关

4.2.7.1. 训练模型

analog> train

或者

analog> retrain
_images/01-16-52.jpg

4.2.7.2. 获取训练进度

analog> get progress
_images/01-18-41.jpg

4.2.7.3. 获取当前模型参数

analog> get model
_images/01-21-27.jpg

4.2.8. 清屏

analog> clear

4.3. 实时更新日志文件

实时更新功能默认开启,无需特殊配置。
主要思路是将配置文件里面设置的log_path路径建立一个文件监视线程,每过5秒进行一次文件改动比较,然后将更改以及创建的文件路径写进队列中。
另一个插入线程作为消费者,以更小的时间间隔读取共享队列,从后往前读取日志,只读取日志时间比当前数据库的最新时间大的记录。
很明显当我们在加载完数据库之后再次放入一些比较旧的日志,即时间戳小于当前数据库的最新时间的日志文件,虽然文件监视改动会将其放入更新队列,但是因为时间范围的问题,该文件的记录不会插入到数据库中。

Note

目前只是很简单地支持了实时文件更新的功能,可能会存在一些BUG。

Tip

文件实时更新主要是为了符合服务器的动态更新日志行为,其新插入的时间戳必然大于等于已存入的日志。很明显,当同一时间服务器写入日志数过大时,是会出现丢日志的情况的。
这是一个已知的问题,可以用诸如记录文件偏移等手段解决,但需要考虑的情况也会相应的多起来,比如文件名更换,文件移动等等。

还是那句话,欢迎动手,Geek : )