ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

服务器异常与安全加固:从可疑进程排查到系统防护

服务器异常与安全加固:从可疑进程排查到系统防护 半夜手机连着震了好几下监控平台推送告警CPU 使用率 98%磁盘 IO 接近打满。登录服务器后top里出现一个名字像系统进程、但路径和启动时间都非常可疑的进程crontab -l里多了一条从未见过的定时任务网络连接里还有一个不认识的外部 IP 在频繁通信。这就是很多后端开发者都遇到过的“服务器恶势力”不是病毒库里的老木马而是一类悄悄寄生在生产服务器上的异常进程、定时任务和后门入口。服务器本身不会无缘无故变慢绝大多数异常背后都有一条清晰的入侵或误操作链路。与其焦虑不如建立一套标准的排查和加固流程。这篇文章会从一次典型的服务器异常排查出发完整拆解如何定位可疑进程、如何审查网络连接、如何发现定时任务和 SSH 后门、如何安全清理恢复以及最后如何做系统安全加固。无论你的服务器是阿里云服务器、其他云服务器还是自建机房里的 Linux 服务器这套思路都适用。1. 服务器里的异常现场到底长什么样先给“服务器恶势力”做一个定义所有未经授权的进程、定时任务、用户、文件和网络连接以及由此引发的 CPU 飙高、磁盘耗尽、带宽异常、登录异常等行为。从实际运维经验看最常见的异常现场集中在以下几类异常类型典型表现常见原因异常进程CPU 或内存占用异常高进程名伪装成系统进程挖矿程序、恶意脚本、被注入的业务进程异常网络连接服务器主动连接未知 IP监听额外端口木马回连、反弹 shell、后门服务异常用户与登录/etc/passwd出现新 UID 0 用户SSH 登录记录异常弱口令爆破、账号被植入异常定时任务crontab里出现curl、wget下载命令下载木马或挖矿程序异常文件与二进制系统命令被替换/tmp目录出现随机命名文件入侵者留下的工具和后门文件很多开发者发现服务器变慢后第一反应是重启服务器。这其实不是一个好选择重启会丢失当前进程、网络连接、临时文件等现场信息而且如果攻击者设置了开机自启动或定时任务重启后问题依然会复现。更稳妥的做法是先记录现场再分析问题最后清理加固。下面每一轮排查都围绕这个原则展开。2. 动手之前先确认状态与现场2.1 远程登录与工具准备排查服务器异常时建议优先使用 SSH 登录。如果你平时使用 VSCode 连接 SSH 远程服务器可以直接在 VSCode 中打开远程终端方便一边查进程、一边查看日志文件。Windows 用户可以搭配 Windows Terminal 或 PowerShell 使用ssh命令。排查过程中建议保留当前所有输出至少记录到本地文件避免排查到一半丢失证据。可以先把终端输出重定向到一个临时文件mkdir -p ~/incident_recovery top -bn1 ~/incident_recovery/top_$(date %Y%m%d_%H%M%S).log ss -tnp ~/incident_recovery/ss_$(date %Y%m%d_%H%M%S).log2.2 确认系统时间与运行时长很多恶意行为会篡改文件时间戳日志分析也需要时间对齐所以排查前必须先确认服务器时区是否正确。date timedatectl status uname -a uptime如果发现服务器时区和业务所在地区不一致可以在确认不影响业务的前提下将时区设置为国内的时间服务器同步的区域并启用 NTP# 查看当前时区 timedatectl list-timezones | grep Shanghai # 如果服务器在业务所在地通常设置为上海时区 sudo timedatectl set-timezone Asia/Shanghai # 启用 NTP 时间同步 sudo timedatectl set-ntp true这里有一个容易忽略的细节服务器时区错误会导致日志时间与真实时间偏差数小时在追踪攻击行为和判断告警时间点时会非常痛苦。排查的第一步就把时间校准后面的步骤会轻松很多。2.3 云服务器先打快照如果你使用的是云服务器无论是阿里云服务器、腾讯云还是其他云厂商在开始排查前建议先做一个磁盘快照或镜像备份。清理恶意文件是有风险的操作一旦误删关键配置快照就是你的回滚保障。对于自建机房服务器可以提前用tar打包关键配置目录例如/etc、/opt中的业务配置。3. 第一轮排查追踪进程与资源消耗3.1 用 top 和 ps 快速定位可疑进程登录服务器后先用top看整体负载和 CPU 占用最高的进程。CPU 飙高是最常见的告警现象但要注意高 CPU 不一定代表被入侵也可能是业务流量增长、慢 SQL、死循环代码或日志刷屏。不能一看到高 CPU 就杀进程需要先确认进程归属。# 动态查看进程按 CPU 排序 top -c # 静态输出当前进程快照按 CPU 降序 top -bn1 -o %CPU | head -n 30 # 使用 ps 查看完整进程信息 ps aux --sort-%cpu | head -n 30关键观察点有三个PID、启动命令、CPU/MEM 占比。正常情况下数据库、Java 应用、Web 服务等进程的启动命令都对应实际部署路径如果看到/tmp目录下的进程、随机字符串命名的进程、或者kworker、systemd名字但执行路径异常就需要进一步核实。3.2 深入查看进程的真实路径只看ps输出的进程名并不够很多恶意程序会伪装成常见名称。更可靠的方式是查看/proc/PID目录下的真实信息# 查看进程的可执行文件真实路径 sudo ls -l /proc/PID/exe # 查看进程的启动命令和参数 sudo cat /proc/PID/cmdline | tr \0 # 查看进程的当前工作目录 sudo ls -l /proc/PID/cwd # 查看进程打开的端口和文件 sudo ls -l /proc/PID/fd这里有个非常实用的经验进程名可以伪造但/proc/PID/exe指向的文件路径很难完全伪装。如果发现进程执行文件在/tmp、/var/tmp、/dev/shm等非正常目录基本可以判定为恶意或异常程序。3.3 检查进程打开的文件和端口确定可疑 PID 后用lsof查看该进程打开了哪些文件、监听了哪些端口。这是判断恶意程序是否会对外通信的重要一步。# 查看进程打开的所有文件 sudo lsof -p PID # 查看进程的网络连接 sudo lsof -i -p PID # 或者直接查看所有 LISTEN 与 ESTABLISHED 状态连接对应的进程 sudo lsof -i -nP | grep -E LISTEN|ESTABLISHED如果lsof未安装可以用ss和netstat替代CentOS 等系统使用yum install lsofUbuntu 使用apt install lsof。第一轮排查的结论输出明确所有高占用进程的 PID、可执行文件路径、启动时间、启动用户、打开的网络端口。如果发现进程执行文件位于/tmp或/dev/shm或者路径与业务部署完全不相关基本可以进入清除阶段但先不要动手。4. 第二轮排查审查网络连接与可疑通信4.1 查看所有 TCP 连接恶意程序往往需要与外部通信无论是下载恶意负载、回传数据还是接收指令。检查网络连接是识别“恶势力”最直接的手段。# 查看所有 TCP 连接显示进程信息 sudo ss -tnp # 只查看 ESTABLISHED 状态的对外连接 sudo ss -tnp state established # 查看所有监听端口 sudo netstat -lntp重点关注两类连接对外主动连接服务器主动发起的连接。如果本机是 Web 服务器理论上对外连接很少如果存在大量 ESTABLISHED 连接到陌生 IP需要逐一确认。额外监听端口业务明明没有用该端口却出现监听状态很可能是后门服务。4.2 使用 lsof 按端口追溯进程当发现某个陌生端口正在监听时用下面的命令找到对应的进程# 查看 4444 端口被哪个进程占用 sudo lsof -i :4444 # 或者使用 ss sudo ss -lntp | grep 4444拿到 PID 后再回到/proc/PID/exe查看可执行文件路径。很多木马监听高位随机端口等待攻击者连接这类端口通常具备特征出现时间点不明、没有对应业务配置、连接源来自异常 IP。4.3 结合 Web 访问日志判断入侵入口如果服务器上部署了 Nginx、Apache 或 Tomcat排查网络连接时还要结合 Web 日志分析。常见情况是 Web 服务被扫描或利用漏洞随后攻击者上传恶意脚本。# 查看 Nginx 访问日志中可疑的 POST 请求 sudo grep -iE POST|upload|shell|cmd|eval /var/log/nginx/access.log | tail -n 100 # 查看最近 24 小时访问量最高的来源 IP sudo awk {print $1} /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -n 20Web 服务器安全是整个服务器安全的重要环节如果业务代码存在文件上传漏洞、SQL 注入或反序列化漏洞攻击者可能直接通过 Web 应用拿到服务器权限再植入恶意程序。日志排查要和进程排查配合起来才能还原完整攻击链。第二轮排查的结论输出整理出所有可疑的外部 IP、本地监听端口、对应进程 PID。此时已经具备清理的条件但在清除前还有一轮重要的检查定时任务与后门用户。5. 第三轮排查定时任务、启动项与 SSH 后门5.1 检查定时任务恶意程序为了在重启后复活通常会写入 crontab。攻击者很擅长把定时任务隐藏到系统目录中因此排查不能只看当前用户的crontab -l。# 查看当前用户定时任务 crontab -l # 查看 root 用户定时任务 sudo crontab -l -u root # 查看系统级定时任务 sudo cat /etc/crontab sudo ls -la /etc/cron.d/ sudo cat /etc/cron.d/* # 查看周期执行目录 sudo ls -la /etc/cron.hourly/ /etc/cron.daily/ /etc/cron.weekly/ /etc/cron.monthly/排查要点是否出现curl、wget、base64、bash -c下载并执行脚本的任务路径是否指向/tmp、/var/tmp、/dev/shm执行时间是否每隔几分钟或每半小时运行一次。这类任务往往就是恶意程序“续命”的手段。以下命令可以快速列出 crontab 中所有包含下载和执行命令的任务sudo grep -rE curl|wget|base64|nc |/dev/tcp|/tmp/ /var/spool/cron/ /etc/cron* 2/dev/null这里要补充一个重要提醒清理定时任务必须放在杀进程之后或者至少同时进行。如果先删除恶意文件而保留定时任务几分钟后任务会重新下载恶意程序同样如果先杀进程但没删掉定时任务进程也会被再次拉起。建议的操作顺序是先记录所有可疑任务再统一清理。5.2 检查 systemd 服务现代 Linux 发行版中很多持久化后门会注册成 systemd 服务。查看正在运行的、近期新增的服务# 列出所有正在运行的服务 sudo systemctl list-units --typeservice --staterunning # 查看服务单元的加载路径和启动命令 sudo systemctl cat service-name # 查看最近新增的 service 文件 sudo ls -lt /etc/systemd/system/ | head -n 20如果发现某个服务对应的ExecStart指向/tmp或异常脚本或者服务名与正常软件完全无关基本可以确认是恶意服务。清除方式sudo systemctl stop service-name sudo systemctl disable service-name sudo rm -f /etc/systemd/system/service-name.service sudo systemctl daemon-reload5.3 检查启动脚本与 Shell 配置除 systemd 外还要检查传统启动脚本和用户 Shell 配置文件。恶意程序可能写入以下文件/etc/rc.local/etc/profile.d/*.sh/root/.bashrc/root/.bash_profile/root/.ssh/authorized_keys# 检查 rc.local sudo cat /etc/rc.local # 检查 profile.d 脚本 sudo grep -rE curl|wget|base64|/tmp/ /etc/profile.d/ /root/.bashrc /root/.bash_profile 2/dev/null5.4 检查 SSH 后门与异常用户SSH 是服务器最常用的远程管理入口也是最容易被攻击者利用的通道。重点检查两处authorized_keys和/etc/passwd。# 查看 root 用户是否被添加了未知公钥 sudo cat /root/.ssh/authorized_keys # 查看所有用户的 authorized_keys sudo find /home -name authorized_keys -exec cat {} \; # 查看 UID 为 0 的用户正常情况只有 root sudo awk -F: $30{print $1:$3:$7} /etc/passwd # 查看最近登录成功的历史记录 sudo last -n 30 # 查看最近登录失败的记录 sudo lastb -n 30 2/dev/null如果发现authorized_keys里多了不认识的公钥要立即删除。如果/etc/passwd中除了 root 之外还有 UID 为 0 的账号说明攻击者可能已经创建了高权限用户。此时需要记录账号名然后使用userdel删除并同步检查/etc/shadow中的相关用户。第三轮排查的结论输出列出所有可疑定时任务、systemd 服务、启动脚本、异常用户和未授权公钥。这个阶段的排查结果决定了清理清单。6. 安全清理与恢复把服务器拿回来清理恶意程序需要胆大心细。我不建议直接对可疑进程执行kill -9更不建议盲目删除/tmp下所有文件。推荐的顺序是先隔离再终止最后修复入口。6.1 隔离恶意文件而不是直接删除在确认恶意文件路径后先把文件移动到隔离目录而不是直接删除。这样既能中断执行又保留后续分析样本。# 创建隔离目录 sudo mkdir -p /opt/quarantine # 移动可疑文件到隔离目录保留权限和时间戳 sudo mv /tmp/.X11-unix /opt/quarantine/ sudo mv /usr/lib/tmpfile /opt/quarantine/移动文件时尽量保留原始时间戳和权限。如果文件正在被进程占用可以先终止进程再移动或者使用chattr i临时锁定文件防止恶意程序继续执行。6.2 终止可疑进程终止进程时先用普通终止信号SIGTERM让程序有机会释放资源如果无效再使用SIGKILL。# 先发送 SIGTERM sudo kill PID # 5 秒后未退出再强制终止 sudo kill -9 PID # 终止所有名称匹配的进程谨慎使用先确认进程列表 sudo pkill -f /tmp/xxx注意pkill -f会匹配完整命令行误杀风险较高。生产服务器上建议先用pgrep -af确认要匹配的进程再执行终止操作。6.3 清理定时任务与启动项删除异常定时任务时建议使用crontab -e编辑并注释掉可疑行而不是直接删除文件。对于/etc/cron.d/下的可疑文件可以先用mv移动到隔离目录观察一段时间再决定是否删除。6.4 修复 SSH 配置与账号状态清理完进程和文件后需要修复可能被攻击者修改过的 SSH 配置# 检查 SSH 配置中有无异常项 sudo grep -nE PermitRootLogin|PasswordAuthentication|Port|AuthorizedKeysFile|Match /etc/ssh/sshd_config如果发现PasswordAuthentication yes且服务器没有配置密钥登录建议尽快改为no。但要注意修改 SSH 配置前要确认自己已经配置了公钥登录否则可能把自己锁在服务器外。同时修改受影响账号的密码撤销可能泄露的 SSH 密钥清理/root/.ssh/authorized_keys中未授权的公钥。6.5 修复业务应用的入口漏洞这是整个清理流程中最关键、也最容易被忽略的一步找不到入侵入口清理就只是暂时的。如果服务器是通过 Redis 未授权访问、Nacos 配置中心漏洞、Web 应用文件上传漏洞、Tomcat 弱口令等入口被攻破那么只清理木马而不修复入口木马很快会重新出现。常见的入口检查包括Redis 是否绑定内网地址并开启 protected-mode是否设置了强密码Nginx 配置中的敏感路径是否被访问过Web 应用是否有文件上传接口上传目录是否限制执行权限数据库、消息队列等中间件是否使用默认弱口令服务器是否有未在安全组中登记的多余开放端口。对于 Web 服务器安全最有效的手段是暂停对外服务、对比最近发布的代码版本与服务器上实际运行的代码、检查是否被插入恶意脚本、重新部署后限制上传目录执行权限。这个环节不要急着恢复业务先确认入口已经封住。6.6 清理后的验证清理完成后等待一段时间再观察服务器状态# 查看负载是否回归正常 uptime # 再次查看进程确认可疑进程消失 ps aux --sort-%cpu | head -n 20 # 再次查看网络连接 sudo ss -tnp # 再次检查定时任务 crontab -l sudo cat /etc/crontab如果清理后仍然出现相同进程、相同连接或相同定时任务说明入口没有被堵住需要回到第 7 节继续排查而不是反复杀进程。7. 系统安全加固让服务器不再被盯上清理只是治标加固才是治本。下面这些步骤是服务器上线前就应该完成的基础安全配置也是对“服务器运维”和“服务器部署”的基本要求。7.1 SSH 加固推荐配置# 文件路径/etc/ssh/sshd_config # 禁止 root 远程登录使用普通用户 sudo PermitRootLogin no # 禁止密码登录只允许密钥登录 PasswordAuthentication no # 修改 SSH 监听端口可选 Port 22022 # 限制可登录用户 AllowUsers deploy修改后执行sudo systemctl restart sshd前建议另开一个 SSH 会话测试能否正常登录确认无误后再重启避免配置错误导致无法登录。7.2 安装并配置 fail2ban即使启用了密钥登录服务器仍可能被扫描。fail2ban 可以监控 SSH 登录日志自动封禁多次失败的来源 IP。sudo apt install fail2ban -y配置文件示例/etc/fail2ban/jail.local[DEFAULT] bantime 3600 findtime 600 maxretry 5 [sshd] enabled true port ssh logpath /var/log/auth.log如果是 CentOS/RHEL 系统日志路径通常是/var/log/secure。配置完成后执行sudo systemctl restart fail2ban。7.3 配置防火墙与云安全组服务器自身防火墙和云服务商安全组需要同时配置两者是不同层面的防线。安全组相当于云服务器最外层的门禁防火墙是服务器内部的第二道门。以 Ubuntu 的 UFW 为例sudo ufw allow OpenSSH sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw enable sudo ufw status原则是默认拒绝按需放行。不要向公网开放大量端口只开放业务必需的端口并严格限制 SSH 管理口的来源 IP。7.4 配置时间同步与系统更新很多攻击利用的是已公开的漏洞保持系统更新能有效减少漏洞暴露面。Ubuntu 系统可以启用无人值守安全更新sudo apt update sudo apt install -y unattended-upgrades sudo dpkg-reconfigure --prioritylow unattended-upgrades同时确认 NTP 时间同步已经开启sudo timedatectl set-ntp true7.5 最小权限与账号管理生产环境不建议直接使用 root 运行业务服务。创建专用账号赋予最小权限# 创建部署用户 sudo useradd -m -s /bin/bash deploy # 添加 sudo 权限仅限部分命令 sudo usermod -aG sudo deploy对于 Web 目录建议文件属主为部署用户运行用户为www-data或专用低权限账号目录权限控制在 755、文件权限控制在 644上传目录单独设置为 755 并禁止执行权限。7.6 针对 Web 服务器安全的专项加固关闭目录浏览Nginx 配置中不使用autoindex on隐藏敏感路径禁止访问.git、.svn、.env、*.sql等文件上传目录设置禁止解析 PHP在 Nginx conf 中配置location ~ ^/upload/.*\.(php|php5)$ { deny all; }限制后台管理入口通过 IP 白名单或关键路径访问控制。8. 常见问题与排查方法把排查过程中最常见的现象整理成下表方便直接对照问题现象可能原因排查方式解决方案CPU 飙高出现陌生进程挖矿木马或恶意脚本top、ps aux、lsof -p PID、查看/proc/PID/exe隔离文件、终止进程、清理定时任务、修复入口crontab出现curl/wget下载任务定时任务后门crontab -l、grep -r curl /var/spool/cron删除任务、清理落盘文件、封堵入口SSH 登录失败日志暴增密码暴力破解sudo lastb、查看/var/log/auth.log关闭密码登录、启用 fail2ban、改端口authorized_keys里多出公钥账号被植入后门cat /root/.ssh/authorized_keys、find /home -name authorized_keys删除公钥、修改密码、更换密钥服务器监听端口多出不认识的服务后门驻留服务ss -lntp、systemctl list-units停止服务、禁用开机启动、删除 service 文件日志时间与告警时间对不上服务器时区或 NTP 异常date、timedatectl status设置正确时区启用 NTP 时间同步清理后问题重复出现入侵入口未封堵检查 Redis、Nacos、Web 漏洞、弱口令修复入口、重部署代码、限制网络访问这张表的核心价值在于不同现象要对应到排查路径而不是头痛医头。CPU 飙高只是结果原因可能是挖矿、业务异常、日志刷屏SSH 爆破只是门口敲门声关键是门后面有没有已经不安全的账号。9. 最佳实践把应急响应变成日常运维习惯9.1 上线前建立安全基线每次服务器部署前建议按下面清单过一遍系统更新到最新补丁关闭密码登录仅保留密钥登录建立非 root 管理账号配置防火墙默认拒绝策略云服务器安全组只开放业务端口修改所有中间件默认口令配置 NTP 时间同步与日志集中上报。如果服务器数量较多尤其是服务器集群场景建议用 Ansible 等配置管理工具批量下发安全基线保持所有服务器配置一致避免个别服务器成为短板。9.2 建立日常巡检清单不需要每天人工登录服务器但以下指标一定要有监控和告警CPU、内存、磁盘使用率带宽流量和连接数SSH 登录成功与失败次数定时任务文件是否发生变化Web 访问错误日志中的异常状态码。云服务器通常自带云监控直接在控制台配置阈值即可。自建服务器可以使用 Prometheus Alertmanager或者简单的 Shell 脚本加定时任务发送告警。9.3 数据备份与恢复演练恶意攻击可能导致文件被加密、被删库。重要数据一定要每日备份备份文件要存储在独立位置并且定期演练恢复流程。备份不只是“备份了就行”恢复不了等于没备份。9.4 提前写好应急响应文档团队维护的服务器越多越需要一份离线可查的应急响应文档包含标准排查命令、关键文件路径、备份与恢复流程、安全组和防火墙操作入口、云控制台操作说明。不要把紧急处理流程放在某个人的脑子里文档化之后团队每个人都能按步骤执行避免慌乱出错。9.5 临时服务器同样需要防护很多团队会申请免费云服务器或临时测试机做实验这类机器往往没有配置安全组甚至密码就是弱口令很容易被扫描后植入木马成为攻击跳板。即使是临时服务器也建议至少配置密钥登录、关闭密码登录、安全组只放行必要端口。回到最初的问题当服务器出现异常时比“杀一个进程”更重要的事情是还原攻击路径、堵住入侵入口、完善加固基线。希望下次你的服务器再遭遇“恶势力”时你已经有一套清晰的排查清单先记录现场再看进程与网络检查任务与后门清理后验证加固到日常运维中。这套流程多走几遍服务器运维的底气就会越来越足。
返回列表