PostgreSQL CPU 使用率异常偏高?

| 后端 , PostgreSQL

 

内容概览

  • 前言
  • 查看 CPU 使用率
  • 确定木马入侵
  • 多种解决方案
  • 总结

 

前言

 

在买入一台腾讯云服务器不久后,我在这里部署了我的博客后台。紧接着,腾讯云就提示我,这台云服务器被黑客入侵了!!??

木马文件事件通知

当时我还不相信,天真地以为这是腾讯云误报。结果,当我连接到服务器终端的时候才发现,PostgreSQL CPU 使用率高达100%!!

所以,到底是什么情况?

 

查看 CPU 使用率

 

首先,在云服务器控制台查看监控面板:

监控面板

果然,很长一段时间内的 CPU 使用率都是极高的!!!

然后,在服务器的终端运行 top 命令,发现了一个进程的 %CPU 值非常高!如下所示:

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
28923 70        20   0  633580  19664    488 S 96.7  0.0   2408:51 Dp2N

如果想清晰地看到进程之间的层级关系,建议使用 htop

这时候,连接到 PostgreSQL 并执行 SELECT pid, datname, usename, query FROM pg_stat_activity,你可能会看到类似的奇怪请求:

pid   datname   username  query
19882 postgres  postgres  select Fun013301 ('./x3606027128 &')
19901 postgres  postgres  select Fun013301 ('./ps3597605779 &')

可能有人会认为这是死掉的事务导致的,但是执行以下命令在数据库中查询后,并没有发现相应的结果。

SELECT max(now() - xact_start) FROM pg_stat_activity WHERE state IN ('idle in transaction', 'active');

 

确定木马入侵

 

其实这是我第一次遇到这种情况,所以我有点手足无措。但是,我想先停掉这个 CPU 使用率非常高的进程。
而且,我往往会先确定是不是自己操作数据库的方式有问题,之后我才去排查导致问题的其他原因。

然而,我停掉这个进程还没超过一个小时,它就又自动启动了。不能忍,一定要干掉它!

经过一番仔细的搜索,终于知道这是什么情况了。原来,我的服务器已被黑客入侵,并被用于区块链数字货币挖矿

黑客入侵的方式非常简单,连接我的服务器中的 PostgreSQL 数据库,然后执行自定义的函数。所以,腾讯云报警的时候提供的信息和 PostgreSQL 相关。

 

那么,黑客是怎么成功闯入的呢?反思时刻到了~

原因分析:

  1. 我的服务器没有启用安全组,所有的端口都是可以从外部访问的;
  2. 我的服务器没有自定义配置 iptables,基本上所有的连接都是被允许的;
  3. 我的 PostgreSQL 数据库运行在 docker 中,黑客可以从外部连接到 docker 中的数据库
  4. 我的 PostgreSQL 数据库没有设置高强度的密码,而且竟然没有开启密码校验机制

 

多种解决方案

 

知道问题产生的原因之后,我们就比较容易解决这个问题了。

针对以上原因,这些是我想到的解决方案:

  1. 启用云服务器安全组,从根本上阻断黑客的连接;
  2. 使用 iptables 配置连接规则,如果有必要可以记录连接的来源并追查元凶;
  3. 禁止从 docker 外部访问 PostgreSQL 容器;
  4. 通过修改 pg_hba.conf 文件,配置数据库的身份验证机制;

 

以上方案中,我个人比较青睐第一种。简单省事,打开云服务器提供商的控制台面板即可完成操作。

你可以像这样,只关闭 PostgreSQL 数据库默认使用的 5432 端口:

关闭 5432 端口

也可以只启用常用的端口,其他的端口默认关闭:

只启用常用的端口

强烈推荐后一种方式,这样可以避免很多类似的问题。否则,某天黑客可能又会通过 Redis 或者其他应用入侵你的服务器。

至于其他几种方案,不能从根本上解决这类问题,我也没有亲自尝试。

 

在配置完安全组之后,我迅速终止了 CPU 使用率极高的进程,然而它没过多久就又启动了。
可以确定,黑客已经为木马配置了自动启动。这时候,唯一的解决办法就是删掉数据库重装,甚至重装操作系统

不过,由于我使用了 docker,我只需要删掉旧的 PostgreSQL 数据库容器,然后重新配置一个即可。

果然,如此一番操作之后,CPU 使用率再也没有达到非常高的水平。

CPU 使用率

 

总结

 

遇事不要慌,咱们把问题缕清楚之后,各个击破就好!💪

首先,感谢黑客没有删掉我的数据库里面的内容,非常感谢!🙏🙏🙏 即使我一边解决问题,一边在咒骂你,哈哈~

其次,我以后会更加重视安全问题,尤其是网络安全问题。感谢黑客给我上了一课,谢谢!

当然,也要感谢腾讯云提供的报警、监控、安全组等优质的服务,感谢!

最后,希望这篇文章可以帮助更多朋友去解放自己的“挖矿机”

 

参考资料:
CPU 100% usage caused by unknown postgres query
user postgres launches process that takes all CPUs 100% usage
Excessive Postgres Docker CPU Consumption
PostgreSQL: How to change PostgreSQL user password?

 

觉得不错?点个赞呗~

本文链接:PostgreSQL CPU 使用率异常偏高?

转载声明:本站文章如无特别说明,皆为原创。转载请注明:Ficow Shen's Blog

评论区(期待你的留言)