服务器被攻击了如何应急处理
学完这篇,你能在发现服务器被入侵后的 30 分钟内完成「保现场、断外网、清后门、恢复业务」这一整套应急动作,把损失和停机时间压到最低。
第一步:先判断攻击类型,别急着关机
这一步要弄清服务器正被挖矿、被当跳板还是数据被拖走,得到的结果是你能决定先断哪条路。登录服务器后立刻执行 top -c、ss -antp | head -30、df -h,看 CPU 是否被 kdevtmpfsi、xmrig 之类进程占满,看是否有大量 445/6379/22 端口的异常外连,看磁盘是否被日志或临时文件写满。同时用 last -n 20、lastb -n 20 看有没有陌生 IP 登录成功过。
注意:不要在这时候
reboot。内存里的恶意进程、/tmp下的样本文件一重启就没了,后面根本查不出入侵点。
第二步:把服务器从公网摘下来
这一步要让攻击者立刻失去访问通道,得到的结果是止血——不管他留了后门还是正在传数据,链路先断掉。
云服务器优先用控制台操作,以阿里云 ECS 为例:登录阿里云控制台 → 左侧「实例与镜像」→「实例」→ 找到目标实例 → 点实例 ID 进入详情 → 上方「安全组」→「配置规则」→「入方向」→ 把 0.0.0.0/0 的 22、80、443 规则改成只放行你的办公 IP,或直接删除该条规则 → 点「保存」。腾讯云 CVM 对应路径是「云服务器」→「安全组」→「修改规则」。宝塔面板用户可进「面板设置」→「面板端口」→ 把「授权 IP」改成自己的固定 IP。
服务器本机再补一层(CentOS 7.9 示例):
iptables -I INPUT -s 你的办公IP -j ACCEPT
iptables -A INPUT -j DROP
service iptables save
Ubuntu 22.04 LTS 用 ufw allow from 你的IP to any port 22 后再 ufw default deny incoming。
第三步:固定证据,再动手清
这一步要留下可供报案和复盘的原始数据,得到的结果是你删文件、重装系统时不会把证据一起删掉。
先做云盘快照:阿里云控制台 → 实例详情 →「云盘」→ 找到系统盘 →「创建快照」,备注写清时间。如果是自建机房,直接在服务器上打包:
tar -czf /root/evidence_$(date +%F).tar.gz /var/log /etc/passwd /etc/shadow /etc/cron* /var/spool/cron 2>/dev/null
再记录进程与网络现场:ps auxf > /root/ps.txt、ss -antp > /root/net.txt、crontab -l > /root/cron.txt。
注意:
history里的命令可能被攻击者执行过history -c清空,别把 history 当唯一线索,重点看/root/.bash_history文件本身和/var/log/secure(CentOS)、/var/log/auth.log(Ubuntu)。
第四步:定位入侵点
这一步要找出攻击者从哪个洞进来的,得到的结果是你知道该补哪里,而不是反复被同一招打进来。按顺序查这几处:
awk -F: '($3==0){print $1}' /etc/passwd # 有没有多出来的 UID 0 账号
cat /root/.ssh/authorized_keys # 有没有陌生的公钥
ls -la /etc/cron.d/ /var/spool/cron/ # 定时任务里有没有下载脚本
find /tmp /dev/shm /var/tmp -type f -executable # 临时目录里的可执行文件
find /var/www -name "*.php" -mtime -7 # 近 7 天被改过的网页文件
systemctl list-unit-files --state=enabled # 有没有陌生的开机自启服务
常见入口就三类:SSH 弱口令爆破(看 /var/log/secure 里大量 Failed password)、Web 应用漏洞(看 Nginx access.log 里的 POST 上传路径)、Redis 6379 / Docker 2375 等未授权端口暴露。
第五步:清除后门并加固
这一步把恶意账号、进程、文件清掉,并把入口堵死,得到的结果是服务器能重新对外提供服务且不易被二次入侵。执行 userdel -r 可疑用户名 删账号,编辑 /root/.ssh/authorized_keys 删陌生公钥,kill -9 可疑PID,再删除 /tmp、/dev/shm 下的样本文件。
加固三件事:编辑 /etc/ssh/sshd_config,把 PermitRootLogin 改成 no、PasswordAuthentication 改成 no,然后 systemctl restart sshd;安装 fail2ban(apt install fail2ban 或 yum install fail2ban);把 Nginx、Redis、WordPress 等升级到当前稳定版,例如 Nginx 升到 1.24 以上、WordPress 升到 6.4 以上。
注意:如果查出 rootkit 或者你无法确认是否清干净,直接重装系统、只从备份恢复数据,比"手工清洗"安全得多。
第六步:恢复业务并持续观察
这一步把服务拉起来,得到的结果是业务可用且你能确认攻击没有复发。从快照或备份恢复数据后依次启动 systemctl start nginx、systemctl start mysql,再打开安全组按最小范围放行端口。
之后 24 到 48 小时内每天看一次 ss -antp、top、lastb,以及阿里云控制台「云安全中心」→「安全告警」页面。确认异常后再正式对外。
小结
- 先取证再动手,云盘快照是最省事的证据保全方式。
- 断网优先走云控制台安全组,改完立刻生效,不用重启。
- 排查锁定四处:UID 0 账号、authorized_keys、cron 任务、临时目录可执行文件。
- SSH 关掉密码登录、装 fail2ban、升级 Web 组件,是性价比最高的加固。
- 确认不了是否清干净,就重装系统 + 从备份恢复,不要赌。
原文链接:https://www.gj0.com/thread-164.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。