接手一台运行了几年的CentOS服务器,最怕的就是发现CPU莫名其妙跑满、陌生进程杀不掉、网络流量异常飙升。这种情况十有八九是中了挖矿木马或者病毒。别慌,按照下面这套实操流程走一遍,能解决90%以上的常见Linux服务器恶意软件问题。这套方法不依赖任何第三方商业杀毒软件,完全基于系统自带工具和开源方案。
第一步:隔离现场,保留证据发现异常的第一反应不是马上杀进程,而是先做快照或者备份关键日志。如果你用的是云服务器,立刻在控制台创建磁盘快照。如果是物理机,用dd命令把关键分区做个镜像。然后执行last -20查看最近登录记录,执行history查看最近的命令历史。把这些信息保存到本地,因为攻击者很可能会清理日志。特别注意/var/log/secure和/var/log/messages这两个文件,它们是追踪入侵路径的核心线索。
快速定位可疑进程的实用命令组合挖矿木马最明显的特征是CPU占用高。用top -c命令查看进程列表,注意COMMAND列显示完整路径。很多木马会伪装成系统进程名,比如叫sshd但路径在/tmp下。接着用ps aux --sort=-%cpu | head -20找出CPU占用前20的进程。如果看到进程名带随机字符串、路径在/tmp或/dev/shm下、启动用户是www或nobody,基本可以判定是恶意程序。再用lsof -p [PID]查看该进程打开了哪些文件,用netstat -antp | grep [PID]查看它连接了哪些IP。把这些IP记录下来,后面配置防火墙时要用。
systemd服务与crontab定时任务排查木马要持久化运行,必然会创建自启动机制。先检查系统服务:systemctl list-units --type=service --state=running,逐个排查不认识的服务。重点看/lib/systemd/system/和/etc/systemd/system/目录下最近修改的service文件。然后用cat /etc/crontab和crontab -l -u [每个用户]检查定时任务。特别注意包含wget、curl、bash -i、/dev/tcp等关键词的任务。还有一个常被忽略的地方是/etc/cron.d/目录和/etc/cron.hourly/、/etc/cron.daily/这些周期性任务目录,攻击者经常把恶意脚本藏在这里。
使用chkrootkit和rkhunter进行自动化扫描两个经典的开源Rootkit检测工具,虽然年岁已高但依然有效。安装很简单:yum install epel-release -y && yum install chkrootkit rkhunter -y。先运行chkrootkit,它会检查常见的rootkit特征、可疑的隐藏进程和被篡改的系统文件。注意它报告的INFECTED项要逐一核实,有些可能是误报。然后运行rkhunter --check,这个工具会做更全面的检查,包括系统命令的哈希值比对、端口监听异常、启动文件变更等。首次运行前先执行rkhunter --propupd建立基准数据库。扫描结果在/var/log/rkhunter.log,重点看Warning字样。
ClamAV病毒扫描实战ClamAV是Linux下最成熟的开源杀毒引擎。CentOS下安装:yum install clamav clamav-update -y。安装后先更新病毒库:freshclam。如果下载慢,可以手动下载daily.cvd、main.cvd、bytecode.cvd三个文件放到/var/lib/clamav/目录下。扫描命令:clamscan -r -i / --exclude-dir=/sys/ --exclude-dir=/proc/ --exclude-dir=/dev/ -l /var/log/clamav.log。全盘扫描很慢,建议先扫描高危目录:/tmp、/var/tmp、/dev/shm、/home、/var/www。扫描时加上--remove=yes可以自动删除病毒文件,但建议先用--move=/quarantine隔离,确认无误再删除。ClamAV对Linux平台的恶意脚本和Webshell检测效果不错,但对ELF文件的检出率一般。
手工分析恶意ELF文件的方法如果ClamAV没扫出来,但你高度怀疑某个二进制文件有问题,可以用以下方法分析。先用file [文件名]查看文件类型,用strings [文件名]提取可读字符串,搜索IP地址、域名、URL等特征。用md5sum计算哈希值,到Virustotal或微步在线云沙箱查询。如果怀疑是挖矿程序,用strace -f -p [PID]跟踪系统调用,看它是否在连接矿池的常见端口如3333、4444、14444。还可以用readelf -a [文件名]分析ELF结构,检查是否有异常的段或者动态链接库。
清理Webshell的专项操作如果服务器跑Web服务,Webshell是重灾区。用find命令搜索最近修改的php、jsp、asp、aspx文件:find /var/www -name "*.php" -mtime -7。然后用grep批量扫描常见后门特征:grep -r "eval(" /var/www --include="*.php"、grep -r "base64_decode" /var/www --include="*.php"、grep -r "system(" /var/www --include="*.php"。注意这些函数正常代码也会用,需要人工判断。更有效的方法是查找包含超长字符串的文件,Webshell通常会把代码编码成一行:find /var/www -name "*.php" -exec wc -l {} \; | sort -n | head -20,行数极少但文件大小不小的,重点检查。如果用的是Nginx或Apache,检查访问日志中是否有异常的POST请求,特别是针对非公开URL的请求。
内核级Rootkit检测与处理高级木马会以内核模块形式隐藏进程、文件和网络连接。用lsmod查看已加载的内核模块,注意陌生的模块名。用dmesg | grep -i rootkit查看内核日志中的异常记录。如果怀疑有内核级rootkit,可以用unhide工具检测:yum install unhide -y,然后运行unhide proc、unhide sys、unhide brute三个子工具。它通过多种方式交叉比对进程列表,能发现被隐藏的进程。如果确认有内核rootkit,最稳妥的处理方式是重装系统,因为内核级的清理极其复杂且不可靠。但在重装前,务必用dd把整个磁盘做成镜像用于后续分析。
加固防火墙阻断恶意连接清理完恶意程序后,立刻加固防火墙。用iptables或firewalld封禁之前记录的可疑IP。更推荐的做法是配置白名单策略,只开放必要的端口。以firewalld为例:
systemctl start firewalld systemctl enable firewalld firewall-cmd --permanent --add-service=ssh firewall-cmd --permanent --add-service=http firewall-cmd --permanent --add-service=https firewall-cmd --reload
然后用firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="可疑IP" reject'逐个封禁攻击源。如果是生产环境,建议在云控制台的安全组层面再做一层限制,只放行必要的入站端口。
修改所有凭证并检查SSH配置服务器被入侵后,所有密码、密钥、证书都可能已经泄露。立即修改root密码和所有用户密码,重新生成SSH密钥对。检查/root/.ssh/authorized_keys和每个用户的~/.ssh/authorized_keys文件,删除不认识的公钥。然后加固SSH配置,编辑/etc/ssh/sshd_config:
PermitRootLogin no PasswordAuthentication no PubkeyAuthentication yes Port 2222 # 改成非标准端口 AllowUsers yourusername
改完后执行systemctl restart sshd。注意先在防火墙上放行新端口,测试新端口能登录后再关闭22端口,避免把自己锁在外面。
系统漏洞修复与内核升级很多入侵是通过已知漏洞进来的。执行yum update --security只安装安全更新,或者直接yum update全面更新。重点关注内核版本,用uname -r查看当前内核,用yum list kernel查看可用版本。如果内核版本过旧,存在脏牛、Dirty Pipe等提权漏洞,必须升级。升级内核后需要重启服务器才能生效,这在生产环境需要协调时间窗口。对于无法立即重启的服务器,至少要用grubby --set-default指定新内核为默认启动项,等下次维护窗口重启。
部署Auditd审计关键文件变更为了防止再次被入侵后无法溯源,部署Auditd监控关键文件和目录的变更。安装:yum install audit -y。配置监控规则,编辑/etc/audit/rules.d/audit.rules:
-w /etc/passwd -p wa -k identity -w /etc/shadow -p wa -k identity -w /etc/group -p wa -k identity -w /etc/sudoers -p wa -k sudoers -w /etc/crontab -p wa -k cron -w /var/spool/cron/ -p wa -k cron -w /etc/systemd/ -p wa -k systemd -w /tmp -p wxa -k tmp -w /var/tmp -p wxa -k vartmp
然后重启auditd服务:systemctl restart auditd && systemctl enable auditd。用ausearch -k cron查看cron相关的审计记录。这样任何对关键文件的修改都会被记录下来,包括修改时间、执行用户、进程信息等。
建立日常巡检机制安全不是一次性工作。建议每天执行以下检查:用uptime和top看负载是否异常;用netstat -antp看是否有陌生外联IP;用lastb看是否有大量失败登录尝试;用df -h看磁盘使用率是否突然增长;用find /tmp -type f -mtime -1查找/tmp下当天新建的文件。把这些命令写成脚本,加到crontab里每天自动执行并把结果发到你的邮箱。如果条件允许,部署一套开源的HIDS如Wazuh或Osquery,实现更全面的主机入侵检测。
最后的兜底方案:重装系统如果经过以上所有步骤后仍然不放心,或者服务器被破坏得过于严重,重装系统是最彻底的办法。但在重装前务必做好数据备份,而且备份数据本身也要经过病毒扫描,避免把恶意文件又带回来。重装时选择最小化安装,只装必要的软件包。业务数据单独挂载数据盘,系统盘和数据盘分离。重装后按照前面的加固步骤配置好防火墙、SSH、审计系统,再把业务恢复上线。整个过程虽然耗时,但能确保得到一个干净的环境。
