Debian服务器在凌晨3点突然负载飙升,但5分钟后恢复正常,这种偶发性异常靠人工巡检几乎不可能抓到。sysstat早已默默记录了一切,问题在于大多数人只把它当作性能监控工具,没有意识到那些定时采集的样本数据里,藏着安全事件的第一手痕迹。我们要做的,就是把sysstat的性能指标当作入侵检测的传感器,建立一套可复现的关联分析方法。
sysstat到底采集了什么sysstat包默认安装后会启动sysstat服务,每10分钟通过cron执行一次数据采集,二进制数据存放在/var/log/sysstat/目录下,文件名格式为sa加上日期。sa文件是二进制格式,需要用sar命令读取。同目录下还有sar开头的文本文件,是每日自动转换的报表。很多人以为sysstat只记录CPU和内存,实际上它覆盖了块设备IO、网络接口流量、中断请求、上下文切换、进程创建速率、换页活动、大页使用情况、NUMA统计、电源管理等多个维度。这些指标单独看是性能数据,组合起来就是系统行为的完整画像。
关键命令包括:sar -u查看CPU使用率,sar -r查看内存和交换空间,sar -b查看IO传输速率,sar -n DEV查看网络接口流量,sar -n TCP查看TCP连接状态,sar -w查看上下文切换和进程创建,sar -q查看运行队列长度和负载。每个命令都可以通过-f参数指定历史sa文件,通过-s和-e参数限定时间范围。这意味着你可以精确回溯任意历史时刻的系统状态。
安全事件在性能数据中的指纹暴力破解SSH会在进程创建速率上留下明显痕迹。sar -w输出的proc/s列显示每秒创建的进程数,正常服务器这个值通常低于5,当出现连续多个采样点超过50甚至上百时,结合sar -n TCP中ESTABLISHED状态的连接数突增,基本可以判定有人在批量尝试登录。更隐蔽的线索在sar -b的IO统计中,暴力破解工具通常会产生大量的小块随机读取,因为它们在遍历密码字典文件或读取系统认证模块。
挖矿木马的特征完全不同。这类恶意软件会持续占用CPU,但不会产生大量进程创建,所以sar -u中%user或%nice列会长期维持在90%以上,而sar -w的proc/s保持正常。更关键的指标是sar -r中的kbmemused持续高位,但kbcached异常低,因为挖矿程序通常会把内存锁定在用户空间,导致内核无法回收用于缓存。如果同时发现sar -n DEV中某个网口的rxbyt/s和txbyt/s呈现稳定的小流量持续传输,这很可能是矿池通信的心跳包。
反弹Shell在sar -n TCP中表现为某个ESTABLISHED连接长时间保持,且rxbyt/txbyt比例严重失衡。正常SSH会话的收发字节比例大约在1:3到1:5之间,因为用户输入少量命令,服务器返回大量输出。反弹Shell则相反,攻击者发送大量指令,服务器返回的执行结果相对较少,收发比例会倒置为3:1甚至更高。结合sar -w中cswch/s(自愿上下文切换)的突增,说明进程频繁主动放弃CPU等待IO,这正是等待网络输入的特征。
数据泄露的指标更隐蔽但更有规律。sar -n DEV显示的出站流量会在非业务高峰期出现持续的大块传输,且传输模式与正常业务完全不同。正常Web服务的出站流量是间歇性的小包突发,数据泄露则表现为长时间的稳定大包传输,txbyt/s曲线会呈现平坦的高位平台。同时sar -b中的bread/s和bwrtn/s会出现不对称,读取量远大于写入量,说明程序在大量读取文件并通过网络发送。
建立自动化关联分析脚本手动用sar逐项检查效率太低,需要把关键指标提取出来做交叉比对。以下脚本读取指定日期的sa文件,同时输出多个维度的异常检测结果:
#!/bin/bash
# 关联分析脚本 - 需要指定sa文件路径和日期
SAFILE="/var/log/sysstat/sa$(date +%d -d '1 day ago')"
THRESHOLD_PROC=50
THRESHOLD_CPU=90
THRESHOLD_NET_MB=100
echo "=== 进程创建异常检测 ==="
sar -w -f $SAFILE | awk 'NR>3 && $4+0>'$THRESHOLD_PROC' {print $1,$2,"proc/s="$4}'
echo "=== CPU持续高占用检测 ==="
sar -u -f $SAFILE | awk 'NR>3 && $4+0>'$THRESHOLD_CPU' {print $1,$2,"%user="$4,"%system="$6}'
echo "=== 网络出站流量异常检测 ==="
sar -n DEV -f $SAFILE | grep -E "eth0|ens" | awk 'NR>3 && $6+0>'$THRESHOLD_NET_MB'00000 {print $1,$2,"txkB/s="$6/1024}'
echo "=== TCP连接状态快照 ==="
sar -n TCP -f $SAFILE | awk 'NR>3 && $4+0>100 {print $1,$2,"active="$4,"passive="$5}'
echo "=== IO读写不对称检测 ==="
sar -b -f $SAFILE | awk 'NR>3 {ratio=($5+0)/($6+0+1); if(ratio>5||ratio<0.2) print $1,$2,"bread/s="$5,"bwrtn/s="$6,"ratio="ratio}'
这个脚本只是基础框架,实际部署时需要根据业务基线调整阈值。关键是理解每个指标的业务含义,而不是死记硬背数值。一台API服务器的进程创建速率天然就比静态文件服务器高,阈值要分开设定。
构建长期基线实现偏差检测单点阈值告警的误报率太高,真正有效的关联分析需要建立在统计基线之上。sysstat的数据按天存储,天然适合做同比和环比分析。取过去30天同一时段的数据计算均值和标准差,当前值偏离超过3个标准差时触发告警,这种方法比固定阈值准确得多。
具体做法是用sadf命令把二进制sa文件转换为XML或CSV格式,方便程序化处理。sadf -d可以输出带时间戳的CSV数据,配合-d参数指定设备,配合--参数指定要提取的指标组。例如提取过去30天每天14:00到15:00的CPU数据:
for day in {1..30}; do
sadf -d /var/log/sysstat/sa$(date +%d -d "$day days ago") -- -u -s 14:00:00 -e 15:00:00
done > cpu_baseline.csv
拿到基线数据后,用Python或R计算每个时间点的均值和标准差,建立动态阈值区间。当实时数据或新采集的历史数据落入异常区间时,记录事件并关联其他指标做交叉验证。这种方法的优势在于能自动适应业务增长,服务器负载每月递增10%是正常的,固定阈值要么频繁误报要么逐渐失效。
多指标交叉验证降低误报单一指标异常不足以判定安全事件,必须建立多维度指标的因果链。CPU高占用加进程创建正常加网络出站流量平稳,大概率是某个合法批处理任务。CPU高占用加进程创建激增加网络出站流量突增,这才是需要立即响应的安全事件。交叉验证的逻辑可以编码为规则引擎:
# 伪代码示例
if cpu_user > baseline.cpu_user + 3*stddev:
if proc_per_sec > baseline.proc_per_sec + 3*stddev:
if net_tx_bytes > baseline.net_tx_bytes + 3*stddev:
alert("疑似挖矿或爆破攻击")
else:
alert("疑似CPU密集型异常进程")
elif net_tx_bytes > baseline.net_tx_bytes + 5*stddev:
alert("疑似数据泄露")
else:
alert("CPU异常占用,建议人工排查")
实际部署时还需要考虑指标之间的时间先后关系。暴力破解的进程创建激增会先于CPU升高出现,数据泄露的磁盘读取激增会先于网络出站流量升高出现。把时间差纳入分析模型,可以更准确地还原攻击链。sar采集间隔默认10分钟,对于快速攻击可能不够精细,可以通过修改/etc/cron.d/sysstat中的采集频率调整为1分钟或2分钟,代价是sa文件会增长更快。
持久化存储与可视化分析sa文件默认保留7天,这个周期对于安全分析远远不够。建议修改/etc/sysconfig/sysstat中的HISTORY参数,将保留期延长到90天甚至更长。同时用sadf定期导出文本数据存入时序数据库,方便长期趋势分析和可视化。InfluxDB或Prometheus都可以接收sadf输出的CSV数据,配合Grafana构建仪表盘,把性能基线、异常检测、安全告警整合到同一个视图里。
可视化时重点展示三个维度的叠加图:CPU使用率与进程创建速率的双Y轴图,网络流量与TCP连接数的叠加图,IO读写速率与上下文切换的关联图。正常状态下这些曲线各自独立波动,一旦出现安全事件,多条曲线会同时偏离基线,形成肉眼可见的异常模式。这种可视化不仅用于实时监控,对事后溯源同样价值巨大,可以快速定位攻击发生的精确时间窗口。
实际案例:通过sysstat发现隐蔽挖矿某次排查中注意到一台Debian服务器的sar -u数据显示%user长期维持在95%以上,但sar -w显示的进程创建速率完全正常,sar -q的运行队列长度也只有1到2。这排除了Web爬虫或爆破工具的可能,因为这类攻击会创建大量进程。进一步检查sar -r发现kbmemused很高但kbcached很低,sar -n DEV显示eth0每小时稳定外发约50MB数据,接收约5MB。这种收发比例和流量稳定性完全不符合正常业务特征。最终通过进程列表确认了一个伪装成内核线程的挖矿程序,它的进程名带有中括号,在ps输出中看起来像内核线程,但sar的性能数据暴露了它的真实行为。
这个案例说明sysstat的价值在于它从内核统计层面记录数据,不受用户空间进程隐藏技术的影响。无论恶意程序如何伪装进程名、隐藏文件、替换系统命令,它消耗的CPU时间片、产生的IO操作、发起的网络传输都会被内核准确计数,最终反映在sysstat的采样数据中。
与日志系统的互补定位sysstat解决的是“系统层面发生了什么”,日志系统解决的是“谁做了什么操作”。两者结合才能形成完整的安全感知能力。当sysstat检测到异常性能模式时,用时间戳去日志中检索对应时段的事件,可以大幅缩小排查范围。反之,当日志中发现可疑登录或命令执行时,用sysstat回溯当时的系统状态,可以评估攻击造成的影响范围。建议在SIEM或日志分析平台中建立关联规则,把sysstat异常指标作为安全事件的一个数据源接入,与认证日志、命令历史、文件完整性监控形成联动。
sysstat的另一个独特优势是数据量极小。一天的sa文件通常只有几十MB,保留一年的历史数据也不过几十GB,存储成本几乎可以忽略。相比全量审计日志动辄每天上百GB,sysstat用极低的代价保留了系统行为的长期记忆,这种性价比在安全分析领域非常难得。
