兄弟,先别慌。这种事儿看着吓人,但如果你处理得当,不仅能止损,还能把这次危机变成提升安全等级的契机。既然你找到了我,我就不会给你整那些虚头巴脑的教科书定义,咱们直接上干货,像剥洋葱一样,一层层把问题看清楚,然后把墙砌厚。
第一步:止血与现状确认——别让黑客觉得你很好欺负
在动手查补丁之前,你得先知道“敌人”现在在哪,以及他们是不是还在干活。很多新手一上来就去打补丁,结果发现连进程都杀不死,因为后门程序可能已经驻留内存或者设置了定时任务重启。
1. 识别挖矿进程(如果你怀疑是挖矿)
挖矿木马通常喜欢伪装成系统进程,比如 kdevtmpfsi, kinsing, dockerd (如果不是Docker主机), systemd-journald 等。
打开终端,用 top 或 htop 看看 CPU 占用率。如果有个进程长期占据 100% 或接近 100% 的 CPU,且名字可疑,记下它的 PID。
更精准一点,用 ps 命令结合 grep 过滤异常资源占用:
# 查看CPU占用最高的前10个进程
ps aux --sort=-%cpu | head -n 11
# 查看内存占用最高的前10个进程
ps aux --sort=-%mem | head -n 11
2. 检查持久化机制
黑客最怕的是重启后失效,所以他们一定会搞“持久化”。你要检查的地方有几个:
crontab(计划任务):这是最常见的。
crontab -l # 检查所有用户的crontab,特别是root cat /etc/crontab ls -la /var/spool/cron/ ls -la /etc/cron.d/注意:有些高级木马会修改
/var/spool/cron/crontabs/root或者创建新的 cron 目录。init.d 和 systemd 服务:
# 查看最近创建的服务文件 ls -lt /etc/systemd/system/ | head -n 10 ls -lt /etc/init.d/ | head -n 10打开这些可疑的服务文件,看
ExecStart指向的可执行文件是否在你的系统路径下,或者是否在/tmp,/dev/shm这种临时目录下(这通常是恶意软件的藏身之处)。SSH 密钥:
cat ~/.ssh/authorized_keys cat /root/.ssh/authorized_keys看看有没有你不认识的公钥。如果有,立刻删掉!
3. 网络连接排查
看看服务器正在跟谁“眉来眼去”。挖矿木马通常会连接矿池,数据泄露则会连接外部的 C2(命令与控制)服务器。
# 使用 ss 或 netstat 查看活跃连接
ss -tunap | grep ESTABLISHED
netstat -tunap | grep ESTABLISHED
# 重点关注非标准端口,尤其是 80, 443 以外的长连接
如果看到大量连接到一个陌生的 IP 或域名,那就是铁证。你可以把这个 IP 丢到 VirusTotal 或者微步在线查一下信誉。
第二步:溯源与内核补丁——堵住那个该死的洞
你说提到了“远程代码执行漏洞”,这意味着攻击者利用了一个未修补的 CVE(通用漏洞披露)进入了系统。可能是 Linux 内核本身的漏洞(如 Dirty Pipe, Dirty Cow),也可能是某个依赖库(如 Log4j, OpenSSL)的漏洞。
1. 确定受影响的软件版本
首先,你得知道你的系统里到底装了啥,版本是多少。
# 查看内核版本
uname -r
# 查看操作系统版本
cat /etc/os-release
# 如果是 Ubuntu/Debian
dpkg -l | grep -E "(linux-image|openssl|log4j)"
# 如果是 CentOS/RHEL
rpm -qa | grep -E "(kernel|openssl|log4j)"
2. 检查是否存在已知高危漏洞
这一步很关键。你可以手动对比,也可以借助工具。
手动方式:去 NVD (National Vulnerability Database) 或者国内的 CNVD 搜索你刚才查到的软件版本。例如,如果你用的是 OpenSSL 1.1.1f,赶紧查一下,它曾有过严重漏洞。
自动化扫描(推荐): 如果你不想一个个查,可以用
lynis或者openvas这样的安全审计工具。# 安装 lynis (Ubuntu示例) sudo apt-get install lynis # 运行扫描 sudo lynis audit system扫描报告会列出所有已知的配置弱点和潜在漏洞。
3. 应用补丁
一旦确认了漏洞来源,赶紧打补丁!
更新内核:
# Ubuntu/Debian sudo apt-get update sudo apt-get upgrade linux-image-generic # CentOS/RHEL sudo yum update kernel注意:内核更新通常需要重启才能生效。如果业务不能停,考虑热补丁技术(如 Kpatch, Livepatch),但这需要额外配置。
更新其他组件:
# 全局更新所有包 sudo apt-get upgrade # Debian/Ubuntu sudo yum update # CentOS/RHEL
4. 验证补丁效果
重启后,再次检查版本号,确保补丁已应用。
uname -v # 查看内核构建时间,确认是新编译的
openssl version
第三步:防火墙加固——给服务器穿上防弹衣
补丁打了,后门清了,接下来就是要把门守好。很多服务器被黑,是因为开了不必要的端口,或者用了弱密码。
1. 最小化端口开放原则
只开你真正需要的端口。Web 服务器开 80/443,SSH 开 22(最好改端口),数据库如果不在本机访问,千万别开 3306⁄5432 到公网。
2. 使用 iptables 或 firewalld 进行精细控制
这里我以 firewalld(CentOS/RHEL 默认)和 ufw(Ubuntu 默认)为例。
方案 A:使用 UFW (Ubuntu)
UFW 简单直观,适合新手。
# 安装 UFW
sudo apt install ufw
# 默认拒绝所有入站,允许所有出站
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 允许 SSH (假设你改成了 2222 端口,以防被爆破)
sudo ufw allow 2222/tcp
# 允许 HTTP 和 HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 启用 UFW
sudo ufw enable
# 查看状态
sudo ufw status verbose
方案 B:使用 Firewalld (CentOS/RHEL)
Firewalld 基于区域(Zone)概念,更灵活。
# 确保 firewalld 正在运行
sudo systemctl start firewalld
sudo systemctl enable firewalld
# 设置默认区域为 public,并丢弃所有入站连接
sudo firewall-cmd --set-default-zone=public
# 只允许特定 IP 通过 SSH 连接 (假设你的管理IP是 192.168.1.100)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="2222" accept'
# 允许 Web 流量
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
# 重新加载配置
sudo firewall-cmd --reload
# 查看规则
sudo firewall-cmd --list-all
3. 进阶:使用 Fail2ban 防爆破
即使改了 SSH 端口,还是有人扫。Fail2ban 可以监控日志,发现多次失败登录就封禁 IP。
# 安装 fail2ban
sudo apt install fail2ban # Ubuntu
sudo yum install fail2ban # CentOS
# 复制配置文件
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# 编辑配置,针对 SSH 进行保护
sudo nano /etc/fail2ban/jail.local
在文件中添加或修改:
[sshd]
enabled = true
port = 2222 # 你改过的SSH端口
filter = sshd
logpath = /var/log/auth.log # Ubuntu
# logpath = /var/log/secure # CentOS
maxretry = 3 # 重试3次就封禁
bantime = 3600 # 封禁1小时
重启 fail2ban:
sudo systemctl restart fail2ban
第四步:深度清理与监控——确保没有漏网之鱼
有时候,病毒会留下多个副本,或者修改了系统二进制文件。你需要做最后的检查。
1. 检查系统完整性
使用 rkhunter 或 chkrootkit 扫描 Rootkit。
# 安装 rkhunter
sudo apt install rkhunter
# 更新数据库
sudo rkhunter --update
# 扫描
sudo rkhunter --check
如果提示 /usr/bin/find 被篡改,那就要小心了,可能需要从备份中恢复系统文件。
2. 文件完整性监控
部署一个简单的监控脚本,或者使用 AIDE (Advanced Intrusion Detection Environment)。
# 安装 AIDE
sudo apt install aide
# 初始化数据库
sudo aideinit
# 以后定期运行检查
sudo aide --check
它会告诉你哪些文件被修改了。如果 /bin/ls 或者 /usr/sbin/sshd 被修改,那就是大事了。
3. 日志审计
开启详细的日志记录,并发送到远程日志服务器(防止黑客删除本地日志)。
- rsyslog 配置:确保
/etc/rsyslog.conf中配置了远程日志转发。 - Auditd:启用 Linux 审计守护进程,监控敏感文件访问。
sudo apt install auditd
sudo systemctl enable auditd
sudo systemctl start auditd
# 监控 /etc/passwd 的修改
sudo auditctl -w /etc/passwd -p wa -k identity_changes
第五步:给小朋友也能听懂的总结(核心理念)
好了,技术层面讲完了。为了让你能跟团队里的新人或者非技术背景的老板解释清楚,我用个简单的比喻:
想象你的房子(服务器)被小偷(黑客)闯进来了。
- 止血:你发现小偷还在客厅偷东西(挖矿进程)。你首先得把他赶出去,还要检查他有没有在墙上打洞(持久化后门),以及是不是留了备用钥匙(SSH 密钥)。
- 修锁:小偷是通过哪扇窗户进来的?哦,原来是他发现了窗户没关严(未修补的内核漏洞)。你赶紧把窗户焊死,换一把更高级的锁(打补丁)。
- 装监控和围栏:为了防止下次再有陌生人随便翻墙进来,你在院子里围了一圈高墙(防火墙策略),只留了一个正门,而且只有你能进去(限制 SSH 访问)。你还雇了一个保安(Fail2ban),看到有人在门口鬼鬼祟祟试门锁,就直接把他扔出去。
- 日常巡查:你不能一劳永逸。你得定期检查门窗有没有坏,看看有没有新的小脚印(日志审计),确保小偷没再偷偷溜回来。
最后的话
安全不是一次性的工作,而是一个持续的过程。这次事件虽然惊险,但它暴露了你系统中的薄弱环节。趁这个机会,把上面提到的每一步都落实下去。
记住:默认拒绝,最小权限,及时更新,持续监控。 只要做到这四点,绝大多数攻击都能被你挡在门外。
如果还有哪里不清楚,或者需要具体的配置代码片段,随时问我。祝你服务器从此风平浪静!
