CentOS 7 磁盘清理与木马排查实战
一次从 91% 到 66% 的救盘经历,顺带揪出一个潜伏近 3 个月的 root 权限木马,并建立每日自动巡检。
背景
一台京东云的 CentOS 7 服务器,40G 系统盘,某天发现磁盘使用率飙到 91%,只剩 3.7G。登录排查后,不仅清出了 9G 空间,还发现了一个潜伏两个多月的恶意程序。
本文完整记录整个过程:定位空间 → 清日志 → 发现木马 → 清除 → 全面排查后门 → 二次清理 → 建立自动巡检。
一、定位空间占用
1.1 看分区使用率
df -h
输出:
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 40G 34G 3.7G 91% /
overlay 40G 34G 3.7G 91% /var/lib/docker/overlay2/.../merged
有 overlay 挂载,说明装了 Docker,可能是个隐藏大头。
1.2 逐层钻取
du -h --max-depth=1 / 2>/dev/null | sort -rh | head -20
结果:
| 目录 | 占用 |
|---|---|
/usr | 16G |
/tmp | 5.1G |
/var | 4.4G |
/root | 4.1G |
/www | 1.4G |
/opt | 1.2G |
/home | 1.2G |
/.Recycle_bin | 635M |
/tmp 5.1G 很反常,继续查:
du -h --max-depth=1 /tmp 2>/dev/null | sort -rh | head -10
发现 /tmp/logs 独占 5.1G,里面只有一个文件:
-rw-r--r-- 1 root root 5.1G Sep 12 20:09 remote-client.log
二、清空日志(第一波回收 5.1G)
因为文件正在被写入,不能直接 rm,要用 truncate 保留文件句柄:
truncate -s 0 /tmp/logs/remote-client.log
执行后:
/dev/vda1 40G 29G 8.8G 77% /
回收 5.1G,从 91% 降到 77%。
三、意外发现:一个 root 权限木马
清空日志后,顺手查了一下是谁在写这个文件:
lsof /tmp/logs/remote-client.log
输出:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
lcsys 924 root 3w REG 253,1 0 1580792 /tmp/logs/remote-client.log
一个叫 lcsys 的进程,可执行文件在 /tmp/lcsys,以 root 权限运行。继续查:
ps -fp 924
# root 924 1 0 Jun15 ? 00:12:05 /tmp/lcsys
- PPID = 1:由 systemd 拉起
- STIME = Jun15:已经跑了将近 3 个月
- 路径 = /tmp:正常系统服务不可能放临时目录
查 systemd 服务:
systemctl status remote-client.service
● remote-client.service - Remote Client Service
Loaded: loaded (/etc/systemd/system/remote-client.service; enabled)
Active: active (running) since Mon 2026-06-15 12:48:27 CST; 2 months 28 days ago
Main PID: 924 (lcsys)
CGroup: /system.slice/remote-client.service
└─924 /tmp/lcsys
结论:/tmp/lcsys 是恶意程序,已通过 systemd 服务 remote-client.service 实现持久化。
lcsys 这个名字与安全圈记录的 Linuxsys 挖矿木马高度相关,通常通过非官方渠道的宝塔面板安装包捆绑传播,会定时对外攻击并上传服务器信息。
四、清除木马
4.1 先断外连(防止数据外泄)
iptables -A OUTPUT -m state --state NEW -j DROP
4.2 停用并删除恶意服务
systemctl stop remote-client.service
systemctl disable remote-client.service
rm -f /etc/systemd/system/remote-client.service
systemctl daemon-reload
systemctl reset-failed
输出确认:
Removed symlink /etc/systemd/system/multi-user.target.wants/remote-client.service.
4.3 删除恶意文件
rm -f /tmp/lcsys
ls -lh /tmp/lcsys
# ls: cannot access /tmp/lcsys: No such file or directory
4.4 恢复网络
之前加的 DROP 规则会拦截所有出站新连接,排查完要删掉:
# 先看行号
iptables -L OUTPUT -n --line-numbers
# 按行号删除 DROP 规则(注意行号会变,以实际为准)
iptables -D OUTPUT 4
# 确认网络恢复
ping -c 2 download.bt.cn
五、全面排查后门
木马清掉了,但它以 root 权限跑了近 3 个月,必须排查有没有其他持久化后门。
5.1 检查动态链接库预加载
cat /etc/ld.so.preload
# No such file or directory ✅
5.2 检查 shell 启动脚本
cat /root/.rc /root/._profile /root/.profile
cat /etc/profile /etc/rc /etc/rc.local
均为标准内容,只有自己加的 PATH 和别名 ✅
5.3 检查计划任务
crontab -l
cat /etc/crontab
ls -la /etc/cron.* /var/spool/cron/
均为自己的任务和系统自带任务 ✅
5.4 检查 systemd 服务
systemctl list-units --type=service --all | grep -vE "systemd|dbus|network|ssh|chrony|crond|firewalld|auditd|tuned|postfix|rsyslog"
ls -la /etc/systemd/system/
确认了所有自定义服务都是自己装的(music、filebrowser、frps、nps、giftbook 等),京东云 agent(ifritd、jdog_service)也正常 ✅
5.5 检查临时目录
ls -la /tmp/ /dev/shm/ /var/tmp/
只有 systemd 私有目录,无陌生文件 ✅
5.6 检查陌生外连
ss -antp | grep ESTABLISHED
# 无输出 ✅
木马已彻底断掉。
5.7 检查系统命令完整性
rpm -Va --nomtime --nosize --nolinkto 2>/dev/null | grep -E "^..5|missing" | head -30
输出全是 .conf 配置文件(正常,改过配置就会有标记)和自装软件,ls、ps、ss、netstat 等核心命令未被替换 ✅
5.8 检查 SSH 公钥
cat /root/.ssh/authorized_keys
ssh-keygen -lf /root/.ssh/authorized_keys
发现两条公钥,需确认是否都是自己的:
SHA256:mVFPq49gJxn3yJWeNsFrgciHoETdIKGmoCs root@lavm-yrho5n20fc (ED25519)
SHA256:lAu+ZvIKU+0yi2BHnKzdLVnrwwTBSVJ4 root@lavm-yrho5n20fc (ED25519)
5.9 检查可疑用户
cat /etc/passwd | grep -v nologin
确认所有用户都是自己的(root、tkyu、redis)✅
六、第二波清理:继续挖空间
木马清完,继续挖磁盘。逐层分析后找到这些可清项:
# 1. 日志(/var/log 1.7G)
journalctl --vacuum-size=200M
find /var/log -type f -name "*.gz" -delete
find /var/log -type f -name "*.1" -delete
# 2. yum 缓存(/var/cache 1004M)
yum clean all
rm -rf /var/cache/yum/*
# 3. pip/npm 缓存(/root/.cache 875M)
rm -rf /root/.cache/pip/* /root/.cache/npm/*
# 4. 回收站
rm -rf /.Recycle_bin/*
# 5. 源码包(装完就没用,约 1.2G)
rm -rf /root/Python-3.12.9 /root/Python-3.10.8
rm -rf /root/git-2.34.0 /root/redis-7.2.4
rm -rf /root/sqlite-autoconf-3450200 /root/nginx-1.21.4
# 6. 宝塔残留备份(已不用宝塔)
rm -rf /www/backup/panel /www/backup/oldData
# 7. 反复重启的 Docker 容器
docker stop flare && docker rm flare && docker rmi soulteary/flare
大文件分布(清理前)
| 路径 | 大小 | 判断 |
|---|---|---|
/usr/local/music_player/music | 9.2G | 音乐库,核心数据,保留 |
/root/data_analyst_rag | 1.1G | 自己的项目 |
/opt/files/图书馆 | 701M | 自己的资料 |
/home/git/blog.git | 688M | Git 仓库 |
/www/backup | 375M | 含宝塔残留,可清 |
最终结果:
/dev/vda1 40G 25G 14G 66% /
从 91% 到 66%,总共回收约 9G。
七、防止再次涨满:整理 crontab
清理完后,配置定时任务防止日志再次涨满,并加入每日安全巡检。
7.1 最终版 crontab
# filebrowser 数据库备份
0 3 * * * cp /etc/filebrowser/filebrowser.db /backup/filebrowser_$(date +\%Y\%m\%d).db
# 音乐同步
0 2 * * * /usr/local/music_player/music_sync.sh >> /var/log/music_sync_cron.log 2>&1
# 清空 /tmp/logs 日志(防止涨满)
30 3 * * * [ -d /tmp/logs ] && find /tmp/logs -name "*.log" -exec truncate -s 0 {} \; 2>/dev/null
# 每日安全巡检
0 8 * * * /root/check.sh >> /var/log/daily_check.log 2>&1
7.2 巡检脚本 /root/check.sh
#!/bin/
echo "===== $(date) ====="
echo -n "lcsys: "; ls /tmp/lcsys 2>/dev/null || echo "OK: not found"
echo -n "外连: "; /usr/sbin/ss -antp | grep ESTABLISHED || echo "OK: none"
echo -n "磁盘: "; df -h / | tail -1
echo "高CPU:"
ps aux --sort=-%cpu | head -5
7.3 关键坑:crontab 的 PATH 问题
第一次自动执行时报错:
/root/check.sh: line 6: ss: command not found
原因:crontab 执行时 PATH 与登录 shell 不同,默认只有 /usr/bin:/bin,而 ss 在 /usr/sbin/。
解决:脚本里用绝对路径 /usr/sbin/ss。
7.4 首次巡检结果
===== Sat Sep 12 20:43:42 CST 2026 =====
lcsys: OK: not found
外连: OK: none
磁盘: /dev/vda1 40G 25G 14G 66% /
高CPU:
root 1313 ... /usr/local/share/jcloud/jdog-monitor/.../jdog-kunlunmirror
mysql 1491 ... /usr/sbin/mysqld
root 19168 ... sshd: root [priv]
7.5 查看巡检记录
grep -E "lcsys|外连|磁盘" /var/log/daily_check.log
八、经验总结
磁盘清理要点
| 操作 | 风险 | 建议 |
|---|---|---|
rm 正在写入的日志 | 进程不释放空间 | 用 truncate -s 0 或 > |
rm -rf /tmp/* | 可能影响运行中的程序 | 先 ls 确认 |
| 删旧内核 | 可能删掉当前内核 | 至少保留 1 个 |
docker system prune -a | 会删未使用的镜像 | 先 docker images 确认 |
| 删源码包 | 可能误删运行版本 | 确认运行版本在 /usr/local/ 下 |
排查木马要点
- 看进程路径:正常服务不会放
/tmp、/dev/shm - 看启动时间:异常长时间运行的陌生进程要警惕
- 看持久化:
systemctl、crontab、rc.local、authorized_keys都要查 - 看命令完整性:
rpm -Va校验系统命令有没有被替换 - 看外连:
ss -antp | grep ESTABLISHED找陌生 IP - 看预加载:
/etc/ld.so.preload是隐藏进程的常用手段
crontab 踩坑
- PATH 不同:crontab 默认 PATH 只有
/usr/bin:/bin,用到/usr/sbin下的命令要写绝对路径 grep抓不到结果:脚本输出用echo -n "标题: "; 命令格式,让结果跟标题同一行
安全建议
- 软件从官方渠道下载,非官方安装包可能捆绑木马
- 一旦确认 root 级别入侵,最安全的做法是备份数据后重装系统
- 日常用巡检脚本监控关键指标,早发现早处理
九、最终状态
| 项目 | 状态 |
|---|---|
| 磁盘空间 | 91% → 66%,回收约 9G |
木马 lcsys / remote-client | 已彻底清除 |
| 后门排查 | 预加载、cron、systemd、rc.local、SSH、命令完整性 全部干净 |
| 自动清理 | 每天 3:30 清 /tmp/logs |
| 自动巡检 | 每天 8:00 记录到 /var/log/daily_check.log |
| 巡检脚本 | 已修复 PATH 问题 |
结语
这次排查从磁盘告警开始,最终清出 9G 空间,并清除一个潜伏近 3 个月的 root 权限木马,还顺手建立了每日自动巡检。
磁盘清理和入侵排查往往是连在一起的——异常的大日志、陌生的进程、莫名的外连,都可能是同一个问题的不同表现。
保持警惕,定期巡检,才能让服务器稳定运行。
