ToB企服应用市场:ToB评测及商务社交产业平台

标题: 用Goaccess对Web及雷池WAF日志实现可视化分析 [打印本页]

作者: 种地    时间: 2024-9-18 13:35
标题: 用Goaccess对Web及雷池WAF日志实现可视化分析
本文目的: 研究可视化日志方便进行分析及审计,例如对Nginx的访问日志、雷池WAF的访问日志等等。在使用开源goaccess来进行安装设置分析,便于对WAF未拦截的无攻击特征爬虫等攻击方式的审计。
   本文会介绍雷池WAF的访问日志开启方法,及goaccess的安装设置,使用控制台或者HTML查看可视化后的日志,Nginx使用awk等下令的日志分析,以上内容。懂得goaccess的功能,可跳过直接看安装设置。
  

一、项目环境介绍

首先,对于环境的测试以及模拟安装,我这边在假造机环境下摆设了Nginx以及雷池WAF来进行测试一些设置,这样一来,假如设置出现问题,那么我们可以使用快照很快捷的还原假造机的设置。

可以看到,这里是VMware,当地化摆设了一台CentOS假造机,同时,这里版本与我在腾讯云上摆设的镜像都是CentOS7.6版本的镜像。所以这里可以包管设置的同等性,之后我们对于设置的不同以及流程都是非常清楚的。
我这里已经在CentOS摆设了goaccess,所以之后我将在腾讯云服务器上进行摆设,下面我们进行查看goaccess的功能,之后介绍goaccess的使用方式。

可以看到这里已经安装了goaccess1.9.3版本,也就是目前的最新版。可以对一些Web日志使用正则进行匹配然后输出,两种输出方式,控制台输出以及HTML界面输出。

二、Goaccess

1、Goaccess介绍

GoAccess - 可视化 Web 日志分析工具。
GoAccess 是一款开源(MIT允许证)的且具有交互视图界面的实时 Web 日志分析工具,通过你的 Web 浏览器或者 *nix 体系下的终端程序即可访问。
能为体系管理员提供快速且有价值的 HTTP 统计,并以在线可视化服务器的方式呈现。 GoAccess 剖析指定的 Web 日志文件并将统计结果输出到 X 终端。功能如下:

2、存储方式

GoAccess 支持三种类型的存储方式。请根据你的需要和体系环境进行选择。

   内存哈希表可以提供较好的性能,缺点是数据集的大小受限于物理内存的大小。GoAccess 默认使用内存哈希表。假如你的内存可以装下你的数据集,那么这种模式的表现非常棒。此模式具有非常好的内存使用率和性能表现。
  
   使用这种模式来处理巨大的数据集,大到不可能在内存中完成使命。当数据提交到磁盘以后,B+树数据库比任何一种哈希数据库都要慢。但是,使用 SSD 可以极大的提高性能。往后您可能需要快速载入保存的数据,那么这种方式就可以被使用。
  
   作为默认哈希表的替换方案。由于使用通用类型在内存表现以及速率方面都很均匀。
  3、设置选项

GoAccess 拥有多个设置选项。获取完整的最新设置选项列表,请运行:./configure --help

4、自界说日志/日期格式

GoAccess 可以剖析假造的恣意 Web 日志格式。
预界说的选项包括: 通用日志格式,联合日志格式,包含假造主机,W3C 格式以及亚马逊 CloudFront(分布式下载)。
GoAccess 答应恣意的自界说格式字符串。有两种方法设置日志格式。最简朴的方式是运行 GoAccess 时使用 -c 显示一个设置窗口。但是这种方式不是永世有效的,因此你需要在设置文件中设定格式。
设置文件位于:%sysconfdir%/goaccess.conf 或者 ~/.goaccessrc
留意: %sysconfdir% 可能是 /etc/, /usr/etc/ 或者 /usr/local/etc/

另外可以指定原始 日志/日期/时间 格式,简朴来说,下表中的预界说日志格式名称可以用作 日志/日期/时间 格式的变量。GoAccess 可以处理在一个变量中处理一个预界说名称,而在另一变量中处理另外一个预界说名称。
   COMBINED | 联合日志格式
VCOMBINED | 支持假造主机的联合日志格式
COMMON | 通用日志格式
VCOMMON | 支持假造主机的通用日志格式
W3C | W3C 扩展日志格式
SQUID | Native Squid 日志格式
CLOUDFRONT | 亚马逊 CloudFront Web 分布式体系
CLOUDSTORAGE | 谷歌云存储
AWSELB | 亚马逊弹性负载平衡
AWSS3 | 亚马逊简朴存储服务 (S3)
  留意: 一般来说,需要在包含空格、逗号、管道符、引号、/、括号的值的四周引用引号。内部引号必须进行转义处理。
留意: 使用管道传送数据给 GoAccess 时不会提示 日志/日期/时间 设置对话框,你需要在设置文件或者下令行中提前界说。
5、特别格式说明符


三、雷池访问日志

首先,雷池是默认没有开启访问雷池监听的80端口的日志的,这里需要自己进行设置。同时,我们设置之后,与Apache或者Nginx的日志可以进行对比,我这里除了博客记载的设置,再没有做过多设置。所以Nginx的日志在设置了雷池之后,将8080端口只设置为了本机可以访问,剩余的80端口经过雷池WAF的检测然后转发过来,所以可以看到Nginx的日志的源IP地址全部都是本机的IP地址。

所以我们这种设置对于攻击IP的获取,比如一些多元低频的扫描攻击,不断去变更IP地址,共同脚本对整站进行扫描,这种雷池拦截率还是有点困难的,限频是肯定不行的。我们通过Nginx的access.log日志只可以看到这里有人进行了扫描,却不知道哪几个IP地址。假如我们将这几个扫描的网段封禁了,那么还是可以在一定环境下防护了源站。这里由于我是雷池WAF社区版,不是别的安全产品,对于浏览器的指纹等等这种方式对攻击进行分析判断是不是在扫描这种方式在我目前的环境下是做不到的。
所以,这里我对于这种多源低频类的攻击只能进行IP的封禁,需要进行设置雷池WAF的访问日志结合访问,从而也可观察是哪些payload完成了绕过以及其响应包是否完成了攻击以及封禁这种多源低频的攻击IP。
1、设置文件改变

雷池WAF的Nginx主设置文件默认路径在/data/safeline/resources/nginx/nginx.conf
这里我们需要在该文件中进行设置,从而使雷池记载访问的日志。
修改前:

修改后:

这里我们将访问日志记载开启,同时,日志将被记载在/var/log/nginx/access.log该目录下。
2、docker设置


  1. docker exec safeline-tengine nginx -t
复制代码

  1. docker exec safeline-tengine nginx -s reload
复制代码

如上图设置即为精确。
3、示例测试

首先,我们进入到该目录下:

  1. [root@zhongyan nginx]# cd /data/safeline/logs/nginx/
  2. [root@zhongyan nginx]# ll
  3. total 24
  4. -rw-r--r--. 1 root root 16494 Jul  5 23:25 access.log
  5. -rw-r--r--. 1 root root   908 Jul  5 22:20 error.log
  6. [root@zhongyan nginx]# vim access.log
复制代码

这里可以看到,我的访问源IP地址全部都是来自于主机,这里我假造机的网络模式强调下,我的是NAT模式的,

这里我们可以看到,该VMnet8是217网段下的。

所以,我们这里设置之后,记载的日志都是精确的。以及腾讯云下的雷池WAF访问日志:

可以看到这里有几个IP地址依旧在变更IP扫描,之后我们在雷池WAF控制台通用设置内里添加IP组,将其汇总到一块,然后在自界说规则中创建规则进行匹配,完成拦截。


四、Goaccess安装

1、安装依靠

我们需要下载依靠libmaxminddb:github下载地址

点击即可完成下载。
接着上传至/usr/local/etc目录下,解压编译完成安装。

  1. [root@VM-8-11-centos etc]# ll
  2. total 1520
  3. drwxr-xr-x 7 lighthouse  984   4096 Jul  6 10:46 goaccess
  4. -rw-r--r-- 1 root       root 821878 Jul  6 10:39 goaccess-1.9.3.tar.gz
  5. -rw-r--r-- 1 root       root 727713 Jul  6 10:55 libmaxminddb-1.10.0.tar.gz
  6. [root@VM-8-11-centos etc]# tar -xvzf libmaxminddb-1.10.0.tar.gz
复制代码

  1. [root@VM-8-11-centos etc]# mv  libmaxminddb-1.10.0 libmaxminddb
  2. [root@VM-8-11-centos etc]# ll
  3. total 1524
  4. drwxr-xr-x 7 lighthouse        984   4096 Jul  6 10:46 goaccess
  5. -rw-r--r-- 1 root       root       821878 Jul  6 10:39 goaccess-1.9.3.tar.gz
  6. drwxr-xr-x 8 lighthouse lighthouse   4096 Jun 11 01:18 libmaxminddb
  7. -rw-r--r-- 1 root       root       727713 Jul  6 10:55 libmaxminddb-1.10.0.tar.gz
  8. [root@VM-8-11-centos etc]# cd libmaxminddb/
  9. [root@VM-8-11-centos libmaxminddb]# ./configure
  10. [root@VM-8-11-centos libmaxminddb]# make
  11. [root@VM-8-11-centos libmaxminddb]# make install
复制代码



即可完成编译安装libmaxminddb。
之后由于我们编译安装需要用到--enable-utf8,所以,我们还需要安装一个依靠:ncurses
  1. yum -y install ncurses-devel
复制代码

即可安装完成。
2、编译安装




  1. [root@VM-8-11-centos ~]# cd /usr/local/etc/
  2. [root@VM-8-11-centos etc]# ll
  3. total 804
  4. -rw-r--r-- 1 root root 821878 Jul  6 10:39 goaccess-1.9.3.tar.gz
  5. [root@VM-8-11-centos etc]# tar -xzvf goaccess-1.9.3.tar.gz
复制代码


  1. [root@VM-8-11-centos etc]# ll
  2. total 808
  3. drwxr-xr-x 7 lighthouse  984   4096 Jun  1 08:40 goaccess-1.9.3
  4. -rw-r--r-- 1 root       root 821878 Jul  6 10:39 goaccess-1.9.3.tar.gz
  5. [root@VM-8-11-centos etc]# mv goaccess-1.9.3 goaccess
  6. [root@VM-8-11-centos etc]# ll
  7. total 808
  8. drwxr-xr-x 7 lighthouse  984   4096 Jun  1 08:40 goaccess
  9. -rw-r--r-- 1 root       root 821878 Jul  6 10:39 goaccess-1.9.3.tar.gz
  10. [root@VM-8-11-centos etc]# cd goaccess/
  11. [root@VM-8-11-centos goaccess]# ./configure --enable-utf8 --enable-geoip=mmdb
  12. [root@VM-8-11-centos goaccess]# make
  13. [root@VM-8-11-centos goaccess]# make install
复制代码

以上即可安装完成goaccess。

五、Goaccess对Nginx日志分析

1、常用下令参数

查看下令参数:
  1. goaccess -h
复制代码

常用下令参数:
  1. -a --agent-list 启用由主机用户代理的列表。为了更快的解析,不启用该项。
  2. -d --with-output-resolver 在 HTML/JSON 输出中开启 IP 解析,会使用 GeoIP 来进行 IP 解析。
  3. -f --log-file 需要分析的日志文件路径。
  4. -p --config-file 配置文件路径。
  5. -o --output 输出格式,支持。html、json、csv。
  6. -m --with-mouse 控制面板支持鼠标点击。
  7. -q --no-query-string 忽略请求的参数部分。
  8. --real-time-html 实时生成 HTML 报告。
  9. --daemonize 守护进程模式,--real-time-html 时使用。
复制代码
常用匹配规则:
  1. %t 匹配 time-format 格式的时间字段
  2. %d 匹配 date-format 格式的日期字段
  3. %h host(客户端 ip 地址,包括 ipv4 和 ipv6)
  4. %r 来自客户端的请求行
  5. %m 请求的方法
  6. %U URL 路径
  7. %H 请求协议
  8. %s 服务器响应的状态码
  9. %b 服务器返回的内容大小
  10. %R HTTP 请求头的 referer字段
  11. %u 用户代理的 HTTP 请求报头
  12. %D 请求所花费的时间,单位微秒
  13. %T 请求所花费的时间,单位秒
  14. %^ 忽略这一字段
复制代码
2、终端模式运行

控制台操纵方式:
  1. F1   主帮助页面
  2. F5   重绘主窗口
  3. q    退出
  4. 1-15 跳转到对应编号的模块位置
  5. o    打开当前模块的详细视图
  6. j    当前模块向下滚动
  7. k    当前模块向上滚动
  8. s    对模块排序
  9. /    在所有模块中搜索匹配
  10. n    查找下一个出现的位置
  11. g    移动到第一个模块顶部
  12. G    移动到最后一个模块底部
复制代码
下令如下:
  1. goaccess -a -d -f /usr/local/nginx/logs/access.log -p /usr/local/etc/goaccess/goaccess.conf
复制代码
  1. -a --agent-list 启用由主机用户代理的列表。为了更快的解析,不启用该项。
  2. -d --with-output-resolver 在 HTML/JSON 输出中开启 IP 解析,会使用 GeoIP 来进行 IP 解析。
  3. -f --log-file 需要分析的日志文件路径。
  4. -p --config-file 配置文件路径。
复制代码

点击空格完成选择,要求设置 access.log 的时间和日志格式。 Nginx 默认的日志格式就是 NCSA,所以我们选择第一个,回车即可。
GoAccess 分析日志完成后会在终端上显示分析结果:

这里我们也可以让其使用中文显示:
  1. LANG="zh_CN.UTF-8" bash -c "goaccess /usr/local/nginx/logs/access.log"
复制代码



3、HTML模式运行

一般环境下,Goaccess运行在控制台下的,但是为了更方便的分析日志结果,我们也可以通过Goaccess的HTML模式将分析结果转换为HTML,通过浏览器也可以进行访问。这里我们需要设置Goaccess主设置文件。
默认NCSA设置:
  1. time-format %H:%M:%S
  2. date-format %d/%b/%Y
  3. log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u"
复制代码
在goaccess设置文件末了中添加以上几行即可。

这样我们设置了goaccess匹配的格式,从而在HTML匹配过程中使用以上匹配标准。接着我们使用HTML匹配下令:
  1. goaccess -a -d -f access.log -p /usr/local/goaccess/etc/goaccess/goaccess.conf -o /xss/logs/goaccess.html
复制代码
这里我们-f后面加上需要进行匹配分析的日志,-p加上之前我们更改后的主设置文件路径,同时,-o后面加上我们生成的HTML路径。这里路径我放在了已经可以访问的路径下。

下面我们直接访问该路径即可。

可以看到如上日志分析后的HTML,固然,我们也可以设置中文输出:
  1. LANG="zh_CN.UTF-8" bash -c "goaccess -p /usr/local/goaccess/etc/goaccess/goaccess.conf /usr/local/nginx/logs/access.log -o /xss/logs/go.html"
复制代码

紧接着我们访问即可:

六、Goaccess对雷池日志分析

1、控制台模式

首先我们需要知道设置后的雷池WAF访问日志的路径,这里可以在雷池WAF的nginx主设置文件中进行查看。
我的雷池WAF存储位置在:

找到路径之后我们需要进行查看其与Nginx的日志字段不同之处,从而使Goaccess能够根据字符匹配完整精确。

这里我们需要明白雷池WAF与Nginx每个字段的含义,同时两者有什么不同,经过我的分析,我发现雷池WAF的日志比Nginx多一个字段,那就是哀求的主机名,下面我分别说明下雷池WAF日志每个字段的含义。

  1. 192.168.217.1 - - [04/Jul/2024:15:16:39 +0800] "192.168.217.162" "GET / HTTP/1.1" 200 800 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36" "-"
  2. 请求来源IP-客户身份信息-远程用户名-请求时间戳-请求主机名-请求行包括方式、路径、版本-状态码-响应大小-refer-UA字段-其他信息
复制代码
所以,对比匹配规则,这个哀求多一个哀求主机名,这里我采取的操纵是进行了忽略。
  1. %t 匹配 time-format 格式的时间字段
  2. %d 匹配 date-format 格式的日期字段
  3. %h host(客户端 ip 地址,包括 ipv4 和 ipv6)
  4. %r 来自客户端的请求行
  5. %m 请求的方法
  6. %U URL 路径
  7. %H 请求协议
  8. %s 服务器响应的状态码
  9. %b 服务器返回的内容大小
  10. %R HTTP 请求头的 referer字段
  11. %u 用户代理的 HTTP 请求报头
  12. %D 请求所花费的时间,单位微秒
  13. %T 请求所花费的时间,单位秒
  14. %^ 忽略这一字段
复制代码
那么,对于雷池WAF的匹配规则将变为:
  1. time-format %H:%M:%S
  2. date-format %d/%b/%Y
  3. log-format %h %^[%d:%t %^] %^ "%r" %s %b "%R" "%u"
复制代码
下面我们在控制台对雷池WAF日志进行匹配分析(这里没有加-p设置文件,那么需要自己去设置):
  1. LANG="zh_CN.UTF-8" bash -c "goaccess /data/safeline/logs/nginx/access.log"
复制代码
更改前:

空格选择之后,按c键,对日志格式匹配规则进行更改;
更改后:

加上一个字段的匹配之后,回车:

可以看到这里已经匹配输出完毕。
2、HTML模式分析

同样的,我们修改设置文件:goaccess.conf
  1. time-format %H:%M:%S
  2. date-format %d/%b/%Y
  3. log-format %h %^[%d:%t %^] %^ "%r" %s %b "%R" "%u"
复制代码

尾部加上匹配规则并保存。

即可访问成功看到匹配分析之后的日志。固然,对于别的日志我们需要对字段的匹配进行改变,从而匹配到日志的各个字段完成对日志的分析。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4