如何从Tomcat日志中捕捉到恶意访问的具体蛛丝马迹?

更新于
2026-09-13 05:01:16
16阅读来源:SEO基础
  • 内容介绍
  • 文章标签
  • 相关问答

说到使用者痛点,从Tomcat日志定位恶意访问的难点

在实际运维过程中。往往会遇到以下困扰:

  • 看不见攻击痕迹:默认不开启访问日志,导致无法追踪来源IP、请求方法和异常状态码。
  • 日志量爆炸:开启后日志文件快速膨胀,手工查找异常记录耗时且易漏掉关键线索。
  • 缺少关键字段:不知道哪些字段能够帮助判断SQL注入、爬虫暴力、方法遍历等攻击手法。
  • 缺乏自动化过滤:没有合适的正则或工具,对海量日志进行恶意模式匹配几乎不可能。不过,
  • 误报与漏报并存:安全团队难以快速定位真实威胁。导致响应迟缓,

Tomcat默认日志设置的安全盲区

Tomcat 在默认安装时仅记录错误日志,而不记录每一次 HTTP 请求的细节。从这代表着来看,

如何从Tomcat日志中捕捉到恶意访问的具体蛛丝马迹?
  • 攻击者可以频繁扫描或尝试登录而不留下可审计记录。
  • 运维人员失去对流量异常的实时感知。不过,
  • 后期取证时只能依赖程序层面的审计。而无法还原完整业务请求链路。

一步步打开并定制 Tomcat AccessLogValve

1️⃣ 基础开启方式

$CATALINA_BASE/conf/server.xml 中的对应 节点下添加:


关键字段解释:

  • %h: 客户端 IP
  • %t: 请求时间戳
  • %r: 完整请求行
  • %s: HTTP 状态码
  • %D: 请求耗时
  • %a: 客户端 IP:端口
  • %{User-Agent}i: 浏览器标识

2️⃣ 定制化模式抓取“恶意线索”

针对常见攻击。可在 pattern 中加入以下占位符,以便后续正则筛选:

如何从Tomcat日志中捕捉到恶意访问的具体蛛丝马迹?
%{X-Forwarded-For}i %{Referer}i %{Cookie}i %{Request-URI}i %{Query-String}i %I %O

3️⃣ 日志轮转与压缩防止“文件爆炸”

  • Scripting Scheduler:

*使用 .gz 自动压缩,每天生成一个新文件,可通过 cron 或 Windows Task Scheduler 定期删除超过保留天数的旧文件。

从日志中捕捉恶意访问的具体蛛丝马迹

1️⃣ 异常状态码聚焦

大量 404/403/401/500+ 往往预示扫描或暴力。示例查询的观点是,

# 查找 5 分钟内同一 IP 超过 20 次 404
awk '$9 == "404" {print $1}' access_log.* | sort | uniq -c | sort -nr | awk '$1> 20'

2️⃣ 高速请求频率

# 每秒请求次数统计
awk '{print $1" "$4}' access_log.* | cut -d'[' -f2 | cut -d':' -f1-3 | uniq -c | sort -nr | head

If a single IP> 100 requests per second → 可疑 DoS 行为。

3️⃣ 长耗时请求

# 耗时> 5 秒
awk '$10> 5000000 {print $0}' access_log.* | less

CVE 利用往往伴随极高响应时间,例如 SQL 注入导致数据库锁表。

4️⃣ 可疑 URI 与参数模式

  • /admin.jsp?cmd=,→ 命令执行尝试;
  • /login?error=,→ 暴力失败累计;
  • /phpmyadmin/ → 非 Java 环境下的扫描痕迹;
  • /../../etc/passwd → 方法遍历尝试。

Sed / grep 正则示例:

# 捕获包含 “cmd=” 的请求
grep -E "cmd=|exec=|select.+from|union.+select" access_log.* | less

5️⃣ 恶意 User-Agent 与 Referer

# 常见爬虫或自定义脚本标识
grep -E "" access_log.* | wc -l
# Referer 为外部站点且目标为敏感接口
grep "Referer: http://evil.com" access_log.* | grep "/admin"

说到AIOps。将上述线索自动化检测落地方案

  1. ECK / ELK 堆栈:
  • Kibana 自定义 Dashboard,实时展示 “IP‑异常状态码”“高频 URI”“慢请求 TopN”。
  1. LUA 脚本 + Nginx/Apache 前置代理:
  • LUA 在获取流量的地方即刻匹配上述正则。一旦命中即写入 Redis 黑名单,实现 “即时阻断”。
  1. SOC 自动化 Playbook :
  • Create a detection rule: EventType = “AccessLog” Condition = Action = Generate ticket + Block IP via firewall API.

至于实战案例。从 Tomcat 日志发现并阻止一次 SQL 注入攻击

背景:

# 找出所有包含典型 SQL 注入关键词的请求
grep -Ei "" access_log.2024-07-31.txt> suspect.txt
# 按 IP 聚合次数
awk '{print $1}' suspect.txt | sort | uniq -c | sort -nr | head
# 输出:
57 192.168.12.45
32 10.23.45.78
...

CVE 利用细节:192.168.12.45) 的请求,发现其针对 /search.jsp?query=,​&type=product​` 参数拼接了大量 UNION SELECT 子句,导致后台 MySQL 响应延迟至数秒。通过对该 IP 实施防火墙封禁,并在 Tomcat 中加入输入校验过滤器后程序恢复正常。

常用方法清单的观点是,让 Tomcat 日志真正成为安全利器

  • #1 开启 AccessLogValve 并使用结构化格式+ gzip 压缩。
  • #2 按天轮转并设置保留天数,避免磁盘被填满。怎么说呢,
  • #3 在 ELK / Splunk 中创建基于「IP‑状态码‑耗时」的实时告警面板。
  • #4 编写正则库覆盖常见攻击向量:SQL 注入、XSS、方法遍历、命令执行、暴力登录等。按理说,
  • #5 将高危 IP 自动推送至 WAF / 防火墙黑名单。实现闭环防御,
  • #6 定期审计日志配置和权限,确保只有授权使用者可读取或修改 log 文件。

"

标签:ubuntu

说到使用者痛点,从Tomcat日志定位恶意访问的难点

在实际运维过程中。往往会遇到以下困扰:

  • 看不见攻击痕迹:默认不开启访问日志,导致无法追踪来源IP、请求方法和异常状态码。
  • 日志量爆炸:开启后日志文件快速膨胀,手工查找异常记录耗时且易漏掉关键线索。
  • 缺少关键字段:不知道哪些字段能够帮助判断SQL注入、爬虫暴力、方法遍历等攻击手法。
  • 缺乏自动化过滤:没有合适的正则或工具,对海量日志进行恶意模式匹配几乎不可能。不过,
  • 误报与漏报并存:安全团队难以快速定位真实威胁。导致响应迟缓,

Tomcat默认日志设置的安全盲区

Tomcat 在默认安装时仅记录错误日志,而不记录每一次 HTTP 请求的细节。从这代表着来看,

如何从Tomcat日志中捕捉到恶意访问的具体蛛丝马迹?
  • 攻击者可以频繁扫描或尝试登录而不留下可审计记录。
  • 运维人员失去对流量异常的实时感知。不过,
  • 后期取证时只能依赖程序层面的审计。而无法还原完整业务请求链路。

一步步打开并定制 Tomcat AccessLogValve

1️⃣ 基础开启方式

$CATALINA_BASE/conf/server.xml 中的对应 节点下添加:


关键字段解释:

  • %h: 客户端 IP
  • %t: 请求时间戳
  • %r: 完整请求行
  • %s: HTTP 状态码
  • %D: 请求耗时
  • %a: 客户端 IP:端口
  • %{User-Agent}i: 浏览器标识

2️⃣ 定制化模式抓取“恶意线索”

针对常见攻击。可在 pattern 中加入以下占位符,以便后续正则筛选:

如何从Tomcat日志中捕捉到恶意访问的具体蛛丝马迹?
%{X-Forwarded-For}i %{Referer}i %{Cookie}i %{Request-URI}i %{Query-String}i %I %O

3️⃣ 日志轮转与压缩防止“文件爆炸”

  • Scripting Scheduler:

*使用 .gz 自动压缩,每天生成一个新文件,可通过 cron 或 Windows Task Scheduler 定期删除超过保留天数的旧文件。

从日志中捕捉恶意访问的具体蛛丝马迹

1️⃣ 异常状态码聚焦

大量 404/403/401/500+ 往往预示扫描或暴力。示例查询的观点是,

# 查找 5 分钟内同一 IP 超过 20 次 404
awk '$9 == "404" {print $1}' access_log.* | sort | uniq -c | sort -nr | awk '$1> 20'

2️⃣ 高速请求频率

# 每秒请求次数统计
awk '{print $1" "$4}' access_log.* | cut -d'[' -f2 | cut -d':' -f1-3 | uniq -c | sort -nr | head

If a single IP> 100 requests per second → 可疑 DoS 行为。

3️⃣ 长耗时请求

# 耗时> 5 秒
awk '$10> 5000000 {print $0}' access_log.* | less

CVE 利用往往伴随极高响应时间,例如 SQL 注入导致数据库锁表。

4️⃣ 可疑 URI 与参数模式

  • /admin.jsp?cmd=,→ 命令执行尝试;
  • /login?error=,→ 暴力失败累计;
  • /phpmyadmin/ → 非 Java 环境下的扫描痕迹;
  • /../../etc/passwd → 方法遍历尝试。

Sed / grep 正则示例:

# 捕获包含 “cmd=” 的请求
grep -E "cmd=|exec=|select.+from|union.+select" access_log.* | less

5️⃣ 恶意 User-Agent 与 Referer

# 常见爬虫或自定义脚本标识
grep -E "" access_log.* | wc -l
# Referer 为外部站点且目标为敏感接口
grep "Referer: http://evil.com" access_log.* | grep "/admin"

说到AIOps。将上述线索自动化检测落地方案

  1. ECK / ELK 堆栈:
  • Kibana 自定义 Dashboard,实时展示 “IP‑异常状态码”“高频 URI”“慢请求 TopN”。
  1. LUA 脚本 + Nginx/Apache 前置代理:
  • LUA 在获取流量的地方即刻匹配上述正则。一旦命中即写入 Redis 黑名单,实现 “即时阻断”。
  1. SOC 自动化 Playbook :
  • Create a detection rule: EventType = “AccessLog” Condition = Action = Generate ticket + Block IP via firewall API.

至于实战案例。从 Tomcat 日志发现并阻止一次 SQL 注入攻击

背景:

# 找出所有包含典型 SQL 注入关键词的请求
grep -Ei "" access_log.2024-07-31.txt> suspect.txt
# 按 IP 聚合次数
awk '{print $1}' suspect.txt | sort | uniq -c | sort -nr | head
# 输出:
57 192.168.12.45
32 10.23.45.78
...

CVE 利用细节:192.168.12.45) 的请求,发现其针对 /search.jsp?query=,​&type=product​` 参数拼接了大量 UNION SELECT 子句,导致后台 MySQL 响应延迟至数秒。通过对该 IP 实施防火墙封禁,并在 Tomcat 中加入输入校验过滤器后程序恢复正常。

常用方法清单的观点是,让 Tomcat 日志真正成为安全利器

  • #1 开启 AccessLogValve 并使用结构化格式+ gzip 压缩。
  • #2 按天轮转并设置保留天数,避免磁盘被填满。怎么说呢,
  • #3 在 ELK / Splunk 中创建基于「IP‑状态码‑耗时」的实时告警面板。
  • #4 编写正则库覆盖常见攻击向量:SQL 注入、XSS、方法遍历、命令执行、暴力登录等。按理说,
  • #5 将高危 IP 自动推送至 WAF / 防火墙黑名单。实现闭环防御,
  • #6 定期审计日志配置和权限,确保只有授权使用者可读取或修改 log 文件。

"

标签:ubuntu