公网环境中使用redis一定要注意安全,否则很容易被攻击。自己的一台服务器安装了redis,由于没有安全意识(没有设置密码)导致被攻击,服务器的CPU和内存资源几乎被消耗殆尽,印象深刻,在此记录一下相关解决方法,希望对你有所帮助
现场展示
通过ssh操作服务器,机器非常卡,到控制台查看云主机,如下图:
赶快top查看机器资源使用情况,如下图
发现可疑进程pnscan,之所以可疑是因为通过top多次观察,该进程消耗资源总是排在前列。pnscan这是什么鬼?自己可以去科普,反正是个坏家伙!然后分析了下,感觉不妙,我的这台服务器前一天刚装了Redis,默认的端口也没有认证密码(之所以没有设置密码,是因为想到平时在公司用的Redis好像也有没设置密码的,也是Too Young,Too Simple,问题就出在这里,公司的人家是在内网!!有各种安全措施防护)
排查解决
查看Redis进程
ps -ef | grep redis
发现pnscan相关进程,全部kill,然后删除/usr/local/bin目录下的pnscan脚本。上图中会发现有进程在执行updata脚本,根据路径找到它
比较了其它正常服务器上etc目录下的相关内容,均没有此脚本,并且有问题的这台机器,etc目录下多了很多未知的脚本
好奇心驱使,打开updata脚本看了看,疑惑全部解开,不管三七二十一,识别了问题,然后开始全面kill相关进程以及清除相关脚本和其他文件;另外,updata.sh/sysupdata.sh等这些脚本直接rm无法清除掉,因为这些文件都包含了i属性,使用指令lsattr 文件名可查看文件属性,如下
[root@JD etc]# lsattr updata.sh
----i----------- updata.sh
知道原因后就好办了,执行指令chattr -i 文件名,更改文件i属性,如下
[root@JD etc]# chattr -i updata.sh
然后即可删除文件
[root@JD etc]# rm -rf updata.sh
另外,根据updata.sh脚本,我们可以从中发现其它操作的相关信息,然后就该删除的删除,该恢复的的恢复,如在/var/spool/cron目录下创建了很多定时任务,那我们就挨个儿删除它!如下(admin/apache/nginx/nobody/redis/root/tomcat/user/web/www/www-data全是有问题的,删!)
经过一通kill和rm操作,再次查看机器的CPU和内存使用情况,结果很舒服!控制台信息如下
top信息如下
Redis使用安全建议
- 安装之后更改默认端口
- 设置客户端连接密码
- bind如无需要可以设置白名单 多个IP空格隔开
关于pnscan的更深入的分析,请参考https://paper.seebug.org/605/