================================== 使用指南 ================================== **analog** 是一款命令行下的Web日志审计工具,旨在帮助使用者能够在终端上快速得进行Web日志审计和排查,包含了日志审计、统计的终端图形化和机器学习识别恶意请求的功能 经过安装以及配置文件,现在已经可以使用 **analog** 进行日志审计了,但要使用机器学习识别恶意请求的功能则还需要进行一定量的训练数据筛选和黑白测试样本的选择 :ref:`详细步骤点击这里 <训练样本与测试样本的筛选>` 语法 ================================== | 在设计analog之初,考虑到要展示统计、分析、审计,训练等功能、还要兼顾变量设置、其他功能的调用,于是设计了如下的analog的基本语法。 | 可能使用者第一次看到会觉得比较复杂难记,但是analog实现了较为完整的命令行提示,可以通过简单地输入键获得当前可用选项,进而调用完整的功能,具体效果请看动图。其实现基于开源的命令行工具 `prompt-toolkit `_ .. image:: /_img/analog_prompt.gif 让我们来看一下语法的整体架构和具体功能: show 展示各类功能 statistics 统计功能。当统计量为requests时,将统计时间范围内的访问请求数量,给出统计柱状图。其他则为统计表。 current 给出统计的日志时间范围:当前小时、天、周、月、年 top 给出统计结果的前多少个(默认前10,倒序) 例子 ``show statistics requests current day`` ``show statistics ip current week top 20`` log 表格展示访问日志,用作日志可视化审计 current 给出统计的日志时间范围:当前小时、天、周、月、年 例子 ``show log current hour`` ``show log current week`` ``show log of ip 8.8.8.8`` analysis 对日志进行恶意分析,做出分析报告 current 给出分析的日志时间范围:当前小时、天、周、月、年 例子 ``show analysis current week`` ``show analysis current month`` train | retrain 开始训练模型 locate 用IP库定位某个具体IP ip 固定字段ip, your_ip为查询ip 例子 ``locate ip 8.8.8.8`` set 设置变量 设置当前日期(注:date格式如2020/2/10, day | month | year 格式则为纯数字) offset 设置当前日志的偏移,用于日志审计模式 get 显示当前设置的日期 offset 显示当前偏移 progress 获取模型训练进度 基本语法可以在通过analog控制台中输入 **help** 获取帮助:: analog> help Usage: show (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 Get values More information: 接下来将以各个功能为例子逐个介绍应该如何使用analog。 ---------------------------------------------------------- 各功能示例详解 ===================== 统计 --------------------------------------- 访问量柱状图 ``````````````````````````````````````` | 统计站点当前时间段的请求数量并作出访问次数柱状图,直观地查看站点访问情况。 | 其中时间段的最大区间为year,最小区间为hour。可供选择时间区间为: .. code-block:: year, month, week, day, hour **示例命令:** .. code-block:: bash analog> show statistics requests current month analog> show statistics requests current day .. image:: /_img/21-10-22.jpg | 默认统计的时间节点为当前时间,若当前时间无统计日志,可设置统计时间点为适当的日期。 | 如 :file:`log` 目录下的日志为2020年2月3日到2月8日的,则可以输入一下命令改变统计时间节点: .. code-block:: analog> set date 2020/2/3 # 或者逐级设置 analog> set year 2020 analog> set month 2 analog> set day 3 更详细的时间设置请参照 :ref:`日期设置 <日期设置>` 。 访问统计 ``````````````````````````````````````` | 当然,我们的统计也可以基于一些主要的变量,如来访者的IP,请求的Url,甚至是User-Agent。 | 如:统计当前年份各IP的访问次数(降序),默认给出top 10。 .. code-block:: bash analog> show statistics IP current year .. image:: /_img/21-10-23.jpg 可以通过在命令后增加top 字段修改展示的统计量 .. code-block:: bash analog> show statistics IP current year top 30 .. image:: /_img/21-10-24.jpg 统计当前年份请求路径url的访问次数(降序)。 .. code-block:: bash analog> show statistics IP current year .. image:: /_img/21-10-25.jpg 统计当天User-Agent的访问次数(降序)。 .. code-block:: bash analog> show statistics IP current year .. image:: /_img/21-10-25.jpg 统计UA的访问次数可以更好的了解当前时间段内最多次数访问者的UA情况(假设UA不变的话,如搜索引擎的爬虫),这里仅提供一种分析角度。 .. tip:: 统计模式支持的最小时间范围为小时,即我们可以轻松地统计某个小时内的访问。 日志审查 --------------------------------------- | 由于笔者也有平时看看访问日志的习惯,而直接cat或者tail日志文件 :file:`access.log` 又着实不优雅,遇到gz压缩后的文件则更加让人没有想查看的“欲望”。于是乎,analog提供了更直观的日志审查方式。 | 如:输入以下命令审查当天的访问日志: .. code-block:: bash analog> show log current day .. image:: /_img/21-10-26.jpg | 输出的表格是一个复合信息表,整合了日志里面的内容,有IP地址的归属地判断,也有实时地对当前日志记录进行的正常、恶意判断。 | 若是出现"No more logs"的提示则说明当前日期和日志的记录日期不符,命令中的" **current day** "是基于当前设置的时间来敲定读取范围的 | 我们可以键入"get"命令获得当前设置的时间 .. code-block:: analog> get time [*] time => 2020/03/30 21:00:00 | 那么假设我们导入的日志是3月16号到3月28号的,那么根据当前设置的日期确定的时间范围内(例子中是"current day",则时间范围为2020/03/30全天)是不会有记录的,那么我们需要改变当前日期到3月16号到3月28号的任意一天: .. code-block:: analog> set day 20 [*] time was set to 2020/03/20 21:00:00 | 这样才能审计得到对应的日志。更详细的时间设置请参照 :ref:`日期设置 <日期设置>` 。 .. note:: | 值得注意的是,当我们输入日志审查命令后,analog就已经进入了 **日志审查模式** 。 | 在该模式下,使用上、下方向键进行历史命令回溯功能将被暂时禁用,取而代之的是使用上、下方向键进行日志翻页。 PS: 我们可以随时按ESC键退出审计模式回到 **正常模式**。 | 我们也注意到了,单次默认展示的记录条数都是6条,虽然有上下键快速地翻动功能,但是对于较大的日志,这种方式还是不够方便。 | 可以看到,每一条查询出来的日志记录都有一个序号,在 `Ord` 字段予以展示,我们可以设置偏移以达到快速定位的目的。 .. code-block:: bash analog> set offset 100 | 键入该命令之后我们将从第101条日志记录开始审查 .. image:: /_img/12-32-21.jpg .. warning:: 为了查询性能,analog单次仅查询5000条日志,当翻页达到5000,或者说偏移到达5000时,analog会自动查询下一5000条数据,以此类推。 若你的性能足够,可以通过配置config.ini中的 **[log]** 的字段 **logs_per_query** ,将默认值5000换成可以接受的数值。 | 其实analog在日志审计的功能下,还有一个使用的小功能:针对特定IP进行筛选其访问日志。 .. code-block:: bash analog> show log of ip 18.27.197.252 .. image:: /_img/10-17-26.jpg 恶意请求分析 --------------------------------------- | 对于训练好模型的我们,需要关注某个特定时段内出现的异常报告。 | 如:我们想要获取本月的异常报告,可以输入以下命令: .. code-block:: bash analog> show analysis current month .. image:: /_img/10-19-59.jpg | 报告中包含以下几部分: * 异常访问IP的统计(IP视角) * 异常访问的请求URL的统计(URL视角) * 异常访问IP的物理地区的归并统计(IP地区视角) * 该时间段内的恶意请求和正常请求的百分比(恶意请求百分比视角) 总而言之,我们可以通过 **analysis** 命令轻松地得到一个该时间段从多个视角归并的访问情况的概述。 参数设置 --------------------------------------- **analog** 内置了一些可设置的参数,我们可以根据具体情况进行设置。 .. _日期设置: 日期设置 ````````````````````````````````````````` 基本上 **analog** 的命令都是要基于一个时间节点然后选取范围的,而 **analog** 默认的时间取的是当前的系统时间,那么当我们需要读取几个月前的日志数据就会显得很不方便。 | **analog** 提供了设置时间命令,可以供使用者自由地设置当前时间。 | 设置年月日命令( **N** 为纯数字): .. code-block:: bash analog> set N 直接设置当前日期命令(注:date格式如2020/2/10): .. code-block:: bash analog> set date 2020/2/10 日志偏移设置 ````````````````````````````````````````` 根据我们的需求设置当前日志读取的偏移,其中 **N** 为纯数字: .. code-block:: bash analog> set offset N .. tip:: 当再次启动 **日志模式** 时,offset 将会自动地重新设置为0。 定位IP --------------------------------------- | 使用 **locate** 命令,我们可以调用IP库定位某个具体的IP。 .. code-block:: bash analog> locate ip **locate** 命令有一个固定格式,即 **locate** 后面需要加上固定搭配 **ip** , 而 **your_ip** 为想要查询的ip,如: .. code-block:: bash analog> locate ip 106.11.159.21 [*] 106.11.159.21 => 中国-浙江-杭州 重新加载日志文件 --------------------------------------- 如果我们需要重新加载日志文件,我们可以键入以下命令重新加载日志文件。 .. code-block:: bash analog> reload | 需要注意的是,**reload** 命令将询问你是否清空原有的数据表。如果选择不清空,则之前加载过的日志将继续存留在数据库中 | 在确认是否清空数据表之后,**analog** 将自动退出,并在下一次启动时自动加载新的日志文件。 | 此时配置文件 :file:`config.ini` 的 **initial** 字段将被程序自动设置为0。 .. code-block:: 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. 检测模型相关 --------------------------------------- 训练模型 `````````````````````````````````````` .. code-block:: bash analog> train 或者 .. code-block:: bash analog> retrain .. image:: /_img/01-16-52.jpg 获取训练进度 `````````````````````````````````````` .. code-block:: bash analog> get progress .. image:: /_img/01-18-41.jpg 获取当前模型参数 `````````````````````````````````````` .. code-block:: bash analog> get model .. image:: /_img/01-21-27.jpg 清屏 --------------------------------------- .. code-block:: bash analog> clear 实时更新日志文件 ============================================== | 实时更新功能默认开启,无需特殊配置。 | 主要思路是将配置文件里面设置的log_path路径建立一个文件监视线程,每过5秒进行一次文件改动比较,然后将更改以及创建的文件路径写进队列中。 | 另一个插入线程作为消费者,以更小的时间间隔读取共享队列,从后往前读取日志,只读取日志时间比当前数据库的最新时间大的记录。 | 很明显当我们在加载完数据库之后再次放入一些比较旧的日志,即时间戳小于当前数据库的最新时间的日志文件,虽然文件监视改动会将其放入更新队列,但是因为时间范围的问题,该文件的记录不会插入到数据库中。 .. note:: 目前只是很简单地支持了实时文件更新的功能,可能会存在一些BUG。 .. tip:: | 文件实时更新主要是为了符合服务器的动态更新日志行为,其新插入的时间戳必然大于等于已存入的日志。很明显,当同一时间服务器写入日志数过大时,是会出现丢日志的情况的。 | 这是一个已知的问题,可以用诸如记录文件偏移等手段解决,但需要考虑的情况也会相应的多起来,比如文件名更换,文件移动等等。 还是那句话,欢迎动手,Geek **: )**