多源日志时间线重建
时间线重建是把来自不同来源的记录统一格式、统一时间基准后按时间排序,拼出「攻击者做了什么」的主线。常用来源包括登录日志、Web 访问日志、内核审计、命令历史与系统日志。关键在于两点:一是所有记录统一换算到同一时区,二是每条记录保留原始行或原始位置,便于结论回溯到证据。缺了这两点,时间线就只是看起来整齐的表格。
基本信息
| 常见数据源 | auth.log 或 secure、nginx access.log、audit.log、命令历史、journal |
|---|---|
| 时间规范 | 统一时区并转成 ISO8601 前缀,便于字符串排序 |
| 字段设计 | 时间、来源类型、主机、主体、动作、原始行 |
| 产物 | 事件表文件(可用制表符分隔),可回溯到原始证据行 |
| 常用方法 | awk 提取关键字段后排序;大量数据可借助专业时间线工具 |
| 注意 | 不同来源字段顺序不同,提取前先取几行核对 |
典型使用场景
- 还原入侵过程:从初始访问到持久化与横向的完整顺序
- 验证某个结论是否有时间上的矛盾(例如进程启动早于文件落地)
- 为报告提供可排序、可复核的事实基础
- 评估清理动作与攻击行为在时间上的先后关系
- 把多个团队的结论对齐到同一时间基准上讨论
生成规范化事件表
生成规范化事件表
grep -hE 'Accepted|Failed password' /var/log/auth.log 2>/dev/null | sed 's/^/AUTH /' >> /evidence/events.tsv
awk '{print "NGINX "$4" "$5" "$7" "$9}' /var/log/nginx/access.log >> /evidence/events.tsv 2>/dev/null
sudo ausearch -ts recent --format text 2>/dev/null | head -n 40 >> /evidence/events.tsv
cat /root/.bash_history >> /evidence/events.tsv 2>/dev/null
sort /evidence/events.tsv | head -n 40 # 按字符串排序合并
wc -l /evidence/events.tsv # 事件条数
sha256sum /evidence/events.tsv | tee /evidence/events.tsv.sha256来源与时间字段位置
| 来源 | 时间位置 | 注意点 |
|---|---|---|
| auth.log 或 secure | 行首月 日 时:分:秒 | 无年份,跨年事件需按文件时间推断 |
| nginx access.log | 第 4 个字段,形如 [日/月/年:时:分:秒 +时区] | 自带时区偏移,与其他来源换算时要处理 |
| audit.log | type=PROCTITLE 等记录的 timestamp 字段 | epoch 秒数,需换算成本地或 UTC 时间 |
| 命令历史 | 默认没有时间戳 | 存在时间戳行时按 # 开头的行对下一条命令生效 |
| journal | 自带完整时间戳与微秒 | 输出为本地时区,需统一换算 |
时间线要显式标注证据缺口:某个来源在某个时段没有记录,就留空标记并注明原因,不要用推测填补。把「没有记录」和「记录显示没发生」混为一谈,是报告里最常见的错误。
字段化比单纯合并重要得多:把主体与动作拆成独立列之后,才能按账号、按主机、按动作筛选,进而回答「这个账号在这台机器上做过几件事」这类问题。