起因
我有一个项目是公众号购物平台的,一天上午,有部分客户反应微信公众号打不开首页,我赶紧拿出手机试了一下,这不能进去嘛!!!起初听到一个用户反应,我第一反应是手机网络问题,多刷新几次,或者关掉卡爆的WiFi,换成NB的5G试试,然后我就若无其事的恰饭去了。吃饭过程中,突然很多用户反应都进不去了,虽然我的手机此时还能进去,但我意识到问题的严重性,赶紧吃两口饭就回去排查问题去了
序幕
我连上服务器,输入df -lh,发现内存已经到99%,输入top,查看进程动态情况。此时我赶紧查看日志,果然rabbitmq报异常,这在我意料之中,因为我们服务器该扩容了,由于一直在忙没来得及扩,基本都是每隔7天清理推手分享海报,空出10几个G来,此时我立即清理之后,本想能恢复正常,没想到还是有那么几个用户进不去服务,而大部分用户依然可以进去,我还发现那几个异常用户根本没到请求服务器接口这一步,就卡住了,也就是连前端静态资源都没获得到。诡异!!!!
措施
由于没找到明确的事故原因不好对症下药,一个小时过去了,不仅没什么进展,而且发现又多了不少用户和那几个异常用户一样,进不去公众号了,mmp的!其实我一直心里清楚服务器安全做的不太到位,我想到了修改服务器实例密码,顺便重启mq和其它一众服务之后,再看看效果,如此照做
噩梦开始,原因更加清晰
修改完登录密码,重启服务之后,仅仅开心了十分钟之后,所有人都进不去了,我赶快查看日志,rabbitmq挂掉了,这次是挂掉了!!!后来无论我怎么启动,为了防止mq被无故杀掉进程,我特意nohup启动以及后来的./rabbitmq-server -detached,仅仅维持几分钟就又挂了,后来我初始化了mq,排除了管道数据冲突的问题,重启之后不一会儿又挂掉了。不知所措的我也就只能进阿里云控制台看一看了,是我一个朋友告诉我的,他说他之前碰到过类似的问题,他的原因是自己的程序问题导致项目把CPU跑满了导致mq挂掉了。果不其然,我进去控制台之后,查看了性能监控,发现CPU每隔半小时一小时就跑到100%,维持几分钟,然后又稍微降下来,莫名其妙,为什么会这样,心想难道中毒了?不敢想,我还是点进了安全中心看了下,好家伙,果然被攻击了,植入了木马脚本,和挖矿程序,我根据路径尝试删除木马文件,竟然删不掉,原来黑客把我操作此文件的权限改掉了。我看了下自动任务执行的时间正好是半小时一次,事故的罪魁祸首终于找到了
杀毒?
行了,也发现病毒了,我紧急关闭了所有端口,屏蔽了对方的一个IP,这才醒过来,原来我不该开放的端口竟然开放了,包括6379,5672,22。我赶紧找了阿里云的人员让他帮我杀毒,就这一会会的功夫,高危报警尽然多了十几个,还移动了我的系统文件,病毒做起了伪装,阿里云人员告诉我,恢复磁盘吧!!!中毒太深,即使杀毒也有可能死灰复燃,最好的方式就是重装系统,但我前面没留快照啊 怎么办,我好傻,重装意味着我要重架环境,还有一点之前的环境不是我搭的,这台服务器已经跑了三年了。没办法,凭借我使用了一年多的经验,我只能提头上路了(重新搭环境)
重搭环境之旅
话说老板已经催我快两天了,我也着急的很。心里有太多惋惜,惋惜没重视服务器的维护和加固,也没有备用服务器,哎!说这个已没用了!快速搭建吧,阿里云的工程师告诉我,可以生成快照之后再挂载到新服务器上,慢慢cp你想要的数据,那样省的下载和上传了,毕竟几十个G的东西,下载上传很耗时的。我说,那样岂不是新服务器有带病毒了吗,阿里程序猿说没影响的,挂载之后只是以文件的形式存在,只要不手动启动文件,有毒程序是不会启动的,病毒运行是需要特定环境的(貌似有些道理)。我心里嘀咕了半晌,最终还是放弃了阿里工程师的办法,而是选择将有用的数据先下载到本地再上传到新服务器,虽然慢些但总归万无一失(担心病毒会自己启动,那样不就又白搞了吗,还是稳妥一点吧)
准备工作
- 将当前带毒的云盘创建快照
- 新购一台按量付费的服务器A,性价比高的
- 将1中快照创建云盘并挂载到服务器A上
挂载方法
mount /dev/vdb1 /mnt
注: 其中/mnt 是挂载点(即挂在哪个文件目录下)
注:
以上三步,是将旧服务器隔离出来跑起来,供下载数据到本地
重搭环境
- 云盘初始化
- 搭建环境,jdk、nginx、redis、rabbitmq、Jenkins、gitlab
请见我另一篇博文https://blog.csdn.net/weixin_39648534/article/details/115839531 - 将服务器A上面的静态文件,逐一全部找出,搞到新服务器相同的绝对路径
- 重启各个服务,项目跑起来,完成测试
总结
- 定位问题是一种能力,切记不要凭着主观臆断去找问题,那样既耽误时间又打击信心,而是要根据线索去找问题,把客观和理性放在第一位(慢慢培养这种这种思维模式)
- 不要放过任何一个细小的bug或问题,能立即解决最好,即使不立即解决也要列出来,标记一下轻重缓急,给自己个时间节点,将bug或问题修复
- 安全意识不能没有,除了80,443,全开以外,其它业务接口应该都做限制,等等此类权限设置。做到从外围将邪恶分子隔离开,避免麻烦
- 云服务器各种漏洞该修复修复,告警该处理处理,从小处就重视服务器安全问题
- 记得做备份(快照),当服务器环境刚搭建好时创建一份快照,项目完好跑起来后,告一段落时,再创建一份快照,方便后期回滚,省去从新搭环境这等繁琐之事。毕竟快照保存没多少钱,只要服务器不出事故,就算省钱了
- 最后就是提前熟悉容灾方案,做好服务器主从备份等等,这个是长期活,需要慢慢学习和完善