用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 终端。功能如下:

  • 通用统计: 此面板展示了几个主要指标,比如:有效和无效请求的数量,分析这些数据所花费的时间,独立访客的情况,请求的文件,静态文件(CSS, ICO, JPG 等)的完整URL,404错误,被解析的日志文件的大小以及消耗的带宽。
  • 独立访客: 此面板按照日期展示了访问次数,独立访客数,以及累计消耗的带宽等指标。具有相同IP,相同访问时间,相同的 UserAgent 的 HTTP 请求将会被识别为独立访客。默认情况下包含了网络爬虫。
    您也可以选择使用 --date-spec=hr 参数将按照日期分析修改为按照小时,例如:05/Jun/2016:16 。这对于希望在小时级别去跟踪每日流量非常有帮助。
  • 请求的文件: 此面板展示您服务器上被请求次数最多的文件。包含访问次数,独立访客数,百分比,累计消耗带宽,使用的协议,请求方式。
  • 请求的静态文件: 列出请求频率最高的静态文件类型,例如: JPG, CSS, SWF, JS, GIF, 和 PNG , 以及和上一个面板一样的其他指标。 另外静态文件可以被添加到配置文件中。
  • 404 或者文件未找到: 展示内容与之前的面板类似,但是其数据包含了所有未找到的页面,以及俗称的 404 状态码。
  • 主机: 此面板展示主机自身的详细信息。能够很好的发现不怀好意的爬虫以及识别出是谁吃掉了你的带宽。
    扩展面板将向您展示更多信息,比如主机的反向DNS解析结果,主机所在国家和城市。如果开启了 参数,选择想查看的 IP 地址并按回车,将会显示 UserAgent 列表。
  • 操作系统: 此面板将显示主机使用的操作系统的信息。GoAccess 将尽可能尝试为每一款操作系统提供详细的信息。
  • 浏览器: 此面板将显示来访主机使用的浏览器信息。GoAccess 将尽可能尝试为每一款浏览器提供详细的信息。
  • 访问次数: 此面板按小时报告。因此将显示24个数据点,每一个均对应每一天的某一个小时。
    使用 --hour-spec=min 参数可以设定为按每十分钟报告,并将以 16:4 的格式显示时间。这对发现服务器的峰值访问时段很有帮助。
  • 虚拟主机: 此面板将显示从访问日志中解析出来的不同的虚拟主机的情况。此面板仅在日志格式中启用了 %v 参数时显示。
  • 来路URL: 如果问题主机通过其他的资源访问了你的站点,以及通过从其他主机上的链接或者跳转到你的站点,则这些来路URL将会被显示在此面板。可以在配置文件中通过 --ignore-panel 开启此功能。(默认关闭)
  • 来路站点: 此面板将仅显示主机的部分,而不是完整的URL。
  • 关键字: 报告支持用在谷歌搜索,谷歌缓存,谷歌翻译上使用关键字。目前仅支持通过 HTTP 使用谷歌搜索。 可以在配置文件中通过 --ignore-panel 开启此功能。(默认关闭)
  • 地理位置: 根据 IP 地址判断地理位置。统计数据按照大洲和国家分组。需要地理位置模块的支持。
  • HTTP 状态码: 以数字表示的 HTTP 请求的状态编码。
  • 远程用户(HTTP验证) 通过 HTTP 验证来确定访问文档的权限。如果文档没有被密码保护起来,这部分将会显示为 “-”。此面板默认为开启,除非在日志格式变量中设置了参数 %e

2、存储方式

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

  • 默认哈希表

内存哈希表可以提供较好的性能,缺点是数据集的大小受限于物理内存的大小。GoAccess 默认使用内存哈希表。如果你的内存可以装下你的数据集,那么这种模式的表现非常棒。此模式具有非常好的内存利用率和性能表现。

  • Tokyo Cabinet 磁盘 B+ 树

使用这种模式来处理巨大的数据集,大到不可能在内存中完成任务。当数据提交到磁盘以后,B+树数据库比任何一种哈希数据库都要慢。但是,使用 SSD 可以极大的提高性能。往后您可能需要快速载入保存的数据,那么这种方式就可以被使用。

  • Tokyo Cabinet 内存哈希表

作为默认哈希表的替换方案。因为使用通用类型在内存表现以及速度方面都很平均。

3、配置选项

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

  • --enable-debug

    使用调试标志编译且关闭编译器优化。

  • --enable-utf8

    宽字符支持。依赖 Ncursesw 模块。

  • --enable-geoip=<legacy|mmdb>

    地理位置支持。依赖 MaxMind GeoIP 模块。 legacy 将使用原始 GeoIP 数据库。 mmdb 将使用增强版 GeoIP2 数据库。

  • --enable-tcb=<memhash|btree>

    Tokyo Cabinet 存储支持。 memhash 将使用 Tokyo Cabinet 的内存哈希数据库。btree 将使用 Tokyo Cabinet 的磁盘 B+Tree 数据库。

  • --disable-zlib

    禁止在 B+Tree 数据库上使用 zlib 压缩。

  • --disable-bzip

    禁止在 B+Tree 数据库上使用 bzip2 压缩。

  • --with-getline

    使用动态扩展行缓冲区用来解析完整的行请求,否则将使用固定大小(4096)的缓冲区。

  • --with-openssl

    使 GoAccess 与其 WebSocket 服务器之间的通信能够支持 OpenSSL。

4、自定义日志/日期格式

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

  • –time-format

    参数 time-format 后跟随一个空格符,指定日志的时间格式,包含普通字符与特殊格式说明符的任意组合。他们都由百分号 (%)开始。参考 man strftime。 %T 或者 %H:%M:%S.

  • –date-format

    参数 date-format 后跟随一个空格符,指定日志的日期格式,包含普通字符与特殊格式说明符的任意组合。他们都由百分号 (%)开始。参考 man strftime

  • –log-format

    参数 log-format 后跟随一个空格符或者制表分隔符(\t),用于指定日志字符串格式。

另外可以指定原始 日志/日期/时间 格式,简单来说,下表中的预定义日志格式名称可以用作 日志/日期/时间 格式的变量。GoAccess 可以处理在一个变量中处理一个预定义名称,而在另一变量中处理另外一个预定义名称。

COMBINED | 联合日志格式
VCOMBINED | 支持虚拟主机的联合日志格式
COMMON | 通用日志格式
VCOMMON | 支持虚拟主机的通用日志格式
W3C | W3C 扩展日志格式
SQUID | Native Squid 日志格式
CLOUDFRONT | 亚马逊 CloudFront Web 分布式系统
CLOUDSTORAGE | 谷歌云存储
AWSELB | 亚马逊弹性负载均衡
AWSS3 | 亚马逊简单存储服务 (S3)

注意: 一般来说,需要在包含空格、逗号、管道符、引号、/、括号的值的周围引用引号。内部引号必须进行转义处理。
注意: 使用管道传送数据给 GoAccess 时不会提示 日志/日期/时间 配置对话框,你需要在配置文件或者命令行中提前定义。

5、特殊格式说明符

  • %x 匹配 time-format 和 date-format 变量的日期和时间字段。用于使用时间戳来代替日期和时间两个独立变量的场景。
  • %t 匹配 time-format 变量的时间字段。
  • %d 匹配 date-format 变量的日期字段。
  • %v 根据 canonical 名称设定的服务器名称(服务区或者虚拟主机)。
  • %e 请求文档时由 HTTP 验证决定的用户 ID。
  • %h 主机(客户端IP地址,IPv4 或者 IPv6)。
  • %r客户端请求的行数。这些请求使用分隔符(单引号,双引号)引用的部分可以被解析。否则,需要使用由特殊格式说明符(例如:%m,%U,%q和%H)组合格式去解析独立的字段。
    • 注意: 既可以使用 %r 获取完整的请求,也可以使用 %m, %U, %q and %H 去组合你的请求,但是不能同时使用。
  • %m 请求的方法。
  • %U请求的 URL。
    • 注意: 如果查询字符串在 %U中,则无需使用 %q。但是,如果 URL 路径中没有包含任何查询字符串,则你可以使用 %q 查询字符串将附加在请求后面。
  • %q 查询字符串。
  • %H 请求协议。
  • %s 服务器回传客户端的状态码。
  • %b 回传客户端的对象的大小。
  • %R HTTP 请求的 “Referer” 值。
  • %u HTTP 请求的 “UserAgent” 值。
  • %D 处理请求的时间消耗,使用微秒计算。
  • %T 处理请求的时间消耗,使用带秒和毫秒计算。
  • %L 处理请求的时间消耗,使用十进制数表示的毫秒计算。
  • %^ 忽略此字段。
  • %~ 继续解析日志字符串直到找到一个非空字符(!isspace)。
  • ~h 在 X-Forwarded-For (XFF) 字段中的主机(客户端 IP 地址,IPv4 或者 IPv6)。

三、雷池访问日志

首先,雷池是默认没有开启访问雷池监听的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、首先检查该配置文件是否正确:

                
<think>嗯,用户想了解如何用K-means聚类算法简单实现WAF日志分析。首先,我需要回忆一下K-means的基本原理和步骤。K-means是一种无监督学习算法,通过迭代将数据分成K个簇,每个簇的中心由簇内点的平均值确定。那应用到WAF日志上,应该怎么做呢? 接下来,用户可能对WAF日志的结构不太清楚,可能需要先解释一下日志的常见字段,比如时间戳、源IP、请求方法、URL、状态码、User-Agent等。这些信息中哪些对聚类有用呢?可能需要特征工程,把文本数据转化为数值向量。比如,使用TF-IDF处理URL中的路径参数,或者对HTTP方法进行编码。 然后,用户提到“简单实现”,所以步骤不能太复杂。可能需要分步骤说明:数据预处理、特征提取、应用K-means、结果分析。每个步骤需要具体说明怎么做。比如,预处理要清洗数据,处理缺失值,标准化或归一化。特征提取可能需要将文本转为数值,比如用词袋模型或者TF-IDF。 不过,WAF日志里可能有大量分类变量,比如状态码、HTTP方法,这些可能需要独热编码。而URL路径可能需要分词处理,提取关键部分。比如,把路径中的数字替换为占位符,或者分割成不同的部分。比如,/user/123/profile转为/user/num/profile,这样能减少维度,避免过高的稀疏性。 然后是应用K-means。需要确定K值,可能需要手肘法或者轮廓系数。不过用户要简单实现的话,可能直接指定一个K值,比如分成5类。然后需要解释如何训练模型,计算簇中心,分配样本。 结果分析部分,可能需要可视化,比如用PCA降维后画散点图,不同簇用不同颜色。然后分析每个簇的特征,比如哪些特征在簇中比较突出,可能对应攻击类型,比如SQL注入、XSS等。 不过用户可能没有提到具体工具,可能需要用Python的sklearn库,比如用KMeans类,以及TfidfVectorizer处理文本。可能需要给出示例代码的大致步骤,比如读取数据,处理特征,训练模型,评估。 还需要注意的问题:特征选择是否合适,高维稀疏数据可能影响K-means效果,可能需要降维处理,比如用TruncatedSVD。另外,K-means对初始中心敏感,可能需要多次初始化,或者用K-means++。 可能用户的实际需求是希望通过聚类发现潜在的攻击模式,所以需要解释如何根据聚类结果识别异常请求。比如,某个簇中的请求URL包含大量特殊字符或SQL关键词,可能是SQL注入尝试。 总结下来,回答的结构应该是步骤分解,每个步骤的关键点,注意事项,可能的代码示例(伪代码或库的使用),以及结果分析的方法。同时要提醒用户预处理的重要性,特征工程的方法,以及K-means的局限性,比如需要预先设定K,对噪声敏感等。</think>Kmeans聚类算法对WAF日志分析的简单实现可分为以下步骤: --- ### 一、数据预处理 1. **字段提取** 从WAF日志中提取关键字段,如: - 请求方法(GET/POST) - URL路径(如`/api/login`) - 状态码(200/403/500) - 请求参数(如`?id=1 UNION SELECT`) - User-Agent - 请求耗时 2. **文本向量化** - 对分类变量(如状态码)使用独热编码 示例:`403 -> [0,0,1]`(假设状态码分为200/500/403) - 对URL路径和参数使用TF-IDF向量化 示例:将`/api/login?id=1`转化为数值向量 3. **标准化处理** 使用`StandardScaler`对数值型特征(如请求耗时)归一化 --- ### 二、Kmeans算法应用 1. **核心公式** 目标是最小化簇内平方和: $$ J = \sum_{i=1}^k \sum_{x \in C_i} ||x - \mu_i||^2 $$ 其中$C_i$为第$i$个簇,$\mu_i$为簇中心 2. **代码示例(Python)** ```python from sklearn.cluster import KMeans from sklearn.feature_extraction.text import TfidfVectorizer # 假设logs是预处理后的文本列表 vectorizer = TfidfVectorizer(max_features=1000) X = vectorizer.fit_transform(logs) # 设置聚类数(需根据实际调整) kmeans = KMeans(n_clusters=5, random_state=42) kmeans.fit(X) labels = kmeans.labels_ ``` --- ### 三、结果分析 1. **手肘法选K值** 绘制不同K值的SSE曲线,选择拐点: ![手肘法示意图](https://miro.medium.com/v2/resize:fit:1400/1*9Alf8NrAzw2hJY2qhh0pEg.png) 2. **典型簇解读** - **正常请求簇**:短耗时、常见URL路径 - **异常请求簇**:高频非常规参数(如`UNION`、`<script>`) - **扫描攻击簇**:状态码集中为403,User-Agent异常 --- ### 四、优化方向 1. **特征增强** - 添加请求参数长度、特殊字符比例等衍生特征 - 对User-Agent做正则匹配分类(如`Scanner/Bot`标签) 2. **后处理** - 通过轮廓系数验证聚类质量 $$ s(i) = \frac{b(i) - a(i)}{\max(a(i), b(i))} $$ - 对异常簇进行人工复核标记 --- ### 五、注意事项 1. **局限性** - Kmeans对初始中心敏感,建议多次运行取最优解 - 高维稀疏数据(如TF-IDF矩阵)需配合降维(PCA/t-SNE) 2. **扩展方案** - 结合时序分析(如突发集群请求检测) - 与DBSCAN结合处理噪声点 通过上述流程,可快速定位WAF日志中的潜在攻击模式(如SQL注入、目录遍历),实际部署时建议配合规则引擎进行二次验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值