如何从Tomcat日志中捕捉到恶意访问的具体蛛丝马迹?
- 内容介绍
- 文章标签
- 相关问答
说到使用者痛点,从Tomcat日志定位恶意访问的难点
在实际运维过程中。往往会遇到以下困扰:
- 看不见攻击痕迹:默认不开启访问日志,导致无法追踪来源IP、请求方法和异常状态码。
- 日志量爆炸:开启后日志文件快速膨胀,手工查找异常记录耗时且易漏掉关键线索。
- 缺少关键字段:不知道哪些字段能够帮助判断SQL注入、爬虫暴力、方法遍历等攻击手法。
- 缺乏自动化过滤:没有合适的正则或工具,对海量日志进行恶意模式匹配几乎不可能。不过,
- 误报与漏报并存:安全团队难以快速定位真实威胁。导致响应迟缓,
Tomcat默认日志设置的安全盲区
Tomcat 在默认安装时仅记录错误日志,而不记录每一次 HTTP 请求的细节。从这代表着来看,
- 攻击者可以频繁扫描或尝试登录而不留下可审计记录。
- 运维人员失去对流量异常的实时感知。不过,
- 后期取证时只能依赖程序层面的审计。而无法还原完整业务请求链路。
一步步打开并定制 Tomcat AccessLogValve
1️⃣ 基础开启方式
在 $CATALINA_BASE/conf/server.xml 中的对应 节点下添加:
关键字段解释:
-
%h: 客户端 IP -
%t: 请求时间戳 -
%r: 完整请求行 -
%s: HTTP 状态码 -
%D: 请求耗时 -
%a: 客户端 IP:端口 -
%{User-Agent}i: 浏览器标识
2️⃣ 定制化模式抓取“恶意线索”
针对常见攻击。可在 pattern 中加入以下占位符,以便后续正则筛选:
%{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。将上述线索自动化检测落地方案
- ECK / ELK 堆栈:
- Kibana 自定义 Dashboard,实时展示 “IP‑异常状态码”“高频 URI”“慢请求 TopN”。
- LUA 脚本 + Nginx/Apache 前置代理:
- LUA 在获取流量的地方即刻匹配上述正则。一旦命中即写入 Redis 黑名单,实现 “即时阻断”。
- SOC 自动化 Playbook :
- Create a detection rule: EventType = “AccessLog” Condition = Action = Generate ticket + Block IP via firewall API.
至于实战案例。从 Tomcat 日志发现并阻止一次 SQL 注入攻击
背景:
CVE 利用细节:192.168.12.45) 的请求,发现其针对
"
# 找出所有包含典型 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
...
/search.jsp?query=,&type=product` 参数拼接了大量 UNION SELECT 子句,导致后台 MySQL 响应延迟至数秒。通过对该 IP 实施防火墙封禁,并在 Tomcat 中加入输入校验过滤器后程序恢复正常。
常用方法清单的观点是,让 Tomcat 日志真正成为安全利器
说到使用者痛点,从Tomcat日志定位恶意访问的难点
在实际运维过程中。往往会遇到以下困扰:
- 看不见攻击痕迹:默认不开启访问日志,导致无法追踪来源IP、请求方法和异常状态码。
- 日志量爆炸:开启后日志文件快速膨胀,手工查找异常记录耗时且易漏掉关键线索。
- 缺少关键字段:不知道哪些字段能够帮助判断SQL注入、爬虫暴力、方法遍历等攻击手法。
- 缺乏自动化过滤:没有合适的正则或工具,对海量日志进行恶意模式匹配几乎不可能。不过,
- 误报与漏报并存:安全团队难以快速定位真实威胁。导致响应迟缓,
Tomcat默认日志设置的安全盲区
Tomcat 在默认安装时仅记录错误日志,而不记录每一次 HTTP 请求的细节。从这代表着来看,
- 攻击者可以频繁扫描或尝试登录而不留下可审计记录。
- 运维人员失去对流量异常的实时感知。不过,
- 后期取证时只能依赖程序层面的审计。而无法还原完整业务请求链路。
一步步打开并定制 Tomcat AccessLogValve
1️⃣ 基础开启方式
在 $CATALINA_BASE/conf/server.xml 中的对应 节点下添加:
关键字段解释:
-
%h: 客户端 IP -
%t: 请求时间戳 -
%r: 完整请求行 -
%s: HTTP 状态码 -
%D: 请求耗时 -
%a: 客户端 IP:端口 -
%{User-Agent}i: 浏览器标识
2️⃣ 定制化模式抓取“恶意线索”
针对常见攻击。可在 pattern 中加入以下占位符,以便后续正则筛选:
%{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。将上述线索自动化检测落地方案
- ECK / ELK 堆栈:
- Kibana 自定义 Dashboard,实时展示 “IP‑异常状态码”“高频 URI”“慢请求 TopN”。
- LUA 脚本 + Nginx/Apache 前置代理:
- LUA 在获取流量的地方即刻匹配上述正则。一旦命中即写入 Redis 黑名单,实现 “即时阻断”。
- SOC 自动化 Playbook :
- Create a detection rule: EventType = “AccessLog” Condition = Action = Generate ticket + Block IP via firewall API.
至于实战案例。从 Tomcat 日志发现并阻止一次 SQL 注入攻击
背景:
CVE 利用细节:192.168.12.45) 的请求,发现其针对
"
# 找出所有包含典型 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
...
/search.jsp?query=,&type=product` 参数拼接了大量 UNION SELECT 子句,导致后台 MySQL 响应延迟至数秒。通过对该 IP 实施防火墙封禁,并在 Tomcat 中加入输入校验过滤器后程序恢复正常。
常用方法清单的观点是,让 Tomcat 日志真正成为安全利器

