首页 > 技术文章 > 【Redis之轨迹】记录一次 Linux 服务器惨遭挖矿的经历 [kdevtmpfs](Redis 安全问题)

iceclean 2021-09-30 22:39 原文

状况:

显示 Redis 持续间歇性掉线,后是服务器突然宕机
在阿里云上发现 CPU 持续 100%,使用 top 发现有个进程持续霸占 CPU,还杀不掉

首先附上与挖矿病毒的生死决斗

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

挖矿病毒开始于 2021-8-5 号进入服务器,直到 2021-8-19 号才被我察觉(原因为服务器宕机 —_—)
嘛,由于种种原因,现在才想起来把这篇博客写好

在苦恼了很久之后,终于在次日正午的时候,成功搞掉了
病毒的根源,就是可能大家都见过的:[kdevtmpfs][pnscan][ext4][scan]

其实到最后发现,这个病毒难缠只是在于杀掉进程他会自动重启而已,所以只要找到那个会让它重启的文件,干掉,就完事了
最后通过不断的定位,发现它就藏在系统目录 system 或者 systemd 下,该目录可能在 /etc /usr 下,通过寻找这几个系统文件,不断 ll -a (大多数是隐藏的),揪出所有的病毒文件

有的文件可能直接删删不掉(删除后,又自己出来了),这时候,我想到的是该文件的生成方式,它肯定是指定了某个文件夹,然后再生成文件,那如果该文件夹不存在呢,所以我将 system 文件夹整个备份了一下,然后将整个原文件夹删除,这时再打开 top 查看进程,发现病毒 —— 再起不能!!
最后再将文件夹恢复,就完事了

由于当时没来得及记录,又过了这么久,只能大致记得解决流程,并没有很细致的步骤,大家就依照自己的情况解决吧
最后,解决完记得亡羊补牢下,把 Redis 安全措施做好,避免再次被挖矿,才是最重要的!如下


Redis 漏洞说明

Redis 默认情况下,会绑定在 0.0.0.0:6379,在没有利用防火墙进行屏蔽的情况下,将会将 Redis 服务暴露到公网上,如果在没有开启认证的情况下,将导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。
攻击者在未授权访问 Redis 的情况下利用 Redis 的相关方法,可以成功将自己的公钥写入目标服务器的 ~/.ssh 文件夹的 authotrized_keys 文件中,进而可以直接登录目标服务器。如果Redis服务是以root权限启动,还可以利用该问题直接获得服务器 root 权限。

Redis 安全加固

① 为 Redis 设置白名单
② 建议修改默认的 6379 端口,被入侵的 Redis 通常是因为被黑客的 6379 端口全网扫描扫到了,修改默认端口可以避免这一问题
③ 为 Redis 添加密码
④ 在可能的情况下,不要以 root 身份启动 Redis 服务。因为在受到入侵时,如果 Redis 是通过 root 权限启动的,那么黑客入侵 Redis 后,就相当于有了 root 权限,可以通过 Redis 修改有 root 权限的文件

前置:每次修改完 redis.conf,不能直接再次启动服务
否则配置文件不生效,正确的做法应该是:先使用 ps -ef | grep redis 杀掉 redis 服务进程,然后再启动服务

① 为 Redis 设置连接的白名单

很多教程在解决远程连接无法连接到 Redis 数据库的问题上,第一步都是直接将 bind 127.0.0.1 注释掉,这将直接导致外网可以直接访问到 Redis 数据库(没有设置密码的话,更是可以直接连接上,非常危险)

事实上,bind 设置的正是 Redis 访问的白名单,默认只有本机才能访问,通过设置白名单可以最大程度地提高安全程度

一般情况下,我们都是将项目部署到自己的服务器上去,而对于项目中 Redis 的配置,经常地我们会直接以 服务器IP地址+端口号 的形式访问 Redis,这种情况下,由于有 bind 127.0.0.1 在,是无法访问到 Redis 的

但既然我们的项目是在服务器 本地 跑起来的,为什么不直接以 127.0.0.1 + 端口号 访问 Redis 呢,这样当项目在服务器上跑起来时,完全可以访问到 Redis
虽然这样会导致本地调试时稍微麻烦,但只要本地也有一台 Redis,那就完全不用在意啦

② 修改默认端口

Redis 默认是 6379 端口,很容易被黑客的 6379 全网扫描盯上,所以修改该端口很有必要
同样是在配置文件中,使用 /port 找到 port 6379,将其改成自定义的端口

然后如果修改后,每次再服务器使用 redis-cli 连接时,都提醒连接不上端口 6379 的错误的话,就在后边加上 -p xxx 手动指定自定义的端口进行连接

修改了默认端口,基本上安全指数也就上升了很多
如果希望被外网访问,记得配置阿里云安全组和服务器的防火墙

③ 设置密码

设置密码能最有效地防止 redis 被攻击,虽然每次使用客户端连接时,都需要一句 auth <password> 才能访问数据有点麻烦就是,但总体来说,设置密码还是很有必要的

依旧是修改配置文件,使用 /password 找到 requirepass 在其后边设置自己的密码,再使配置文件生效就 OK 了

④ 不以 root 身份启动 Redis

其实这个我的感触还不是很大,这只是再在最坏情况下做的工作
前边工作都做得好的话,这里就不用担心啦~


暮色黄昏,依旧守护迟到的星辰(IceClean)

推荐阅读