先说最优解: 服务器若是被挖矿了,建议备份数据且重装系统。
所谓的挖矿是什么,这里暂不做解释了,有需要者可以自行百度或者必应,本篇文章主要讲述被攻击后应当如何做。
如何发现问题首先,挖矿程序是非常耗费cpu的,若你发现近期某台服务器,cpu使用率接近于100%, 而正常情况下,机器cpu是没有用到这么多的,这个时候可能要注意了,可以使用如下命令,查询进程信息按照cpu排序。
命令:
ps aux | head -n 1 ; ps aux | sort -k 3 -rn | head
我们拆分一下命令来看是如何分析的
ps aux | head -n 1是打印ps aux的标题栏。
而ps aux | sort -k 3 -rn | head是查询ps aux将按照第三列(sort -k 3 -rn)进行降序排序, 而最后的head是提取前10个结果。
可以寻找哪些不知名的进程,且占用率很高的,找到其进程后,可以使用PID定位到程序位置,如果在/tmp下等,一般是这类程序没跑了,那么如何分析程序位置呢? 由于没有环境,所以我们这边拿mysqld举例。
例如我们查询到某个进程,觉得有问题,我们想查询下该进程的路径
我们先拿到pid值,当然这个命令,已经跟了绝对路径哈,假设没有绝对路径,我们可以使用lsof -p PID值查询,例如:
我们找到fd为txt,查看其值,就是程序的路径。
删除还是禁止启动
我们在拿到启动文件后,我们大概有2种做法,其一是删除文件,其二是禁止该文件启动,也就是取消该文件的执行权限,而二者有什么区别,分别在什么时候使用呢? 我们来逐一分析下。
一般而言,像这类挖矿病毒程序,一般是周期性质的,其启动项不是定义在cron中的,就是执行的命令,那么我们应该如何查找呢?
若是使用cron我们可以查看下/var/spool/cron/目录中的文件,若是有异常任务,我们可以将其停止掉,而后再杀掉挖矿进程,删除其源文件。
若是使用的命令,我们应当如何查看呢,我们可以使用ps axjf命令进行查看系统下所有的进程,若是进程以while、for等循环开头的,内部嵌套了curl等的命令,那多半是启动命令,也是将其停掉,而后杀掉挖矿进程,然后删除源文件即可。
ps ajxf是以树状结构来显示进程信息的。若是上述二者都没有找到,我们可以先将文件可执行权限给拿掉,而后将文件锁起来,这个可以参考chattr命令。
追根溯源
在上面的分析过程中,其实就可以开始追根溯源了,第一个点是看挖矿进程启动的用户,若是root,那就要请运维同学三思了,是不是启动某些服务是使用root启动的。
如果我们发现挖矿进程,是以每个用户来启动的,例如: redis、php用户,这反倒好办了,我们直接可以引发定位问题进程了,若是以root来启动的,相对麻烦些,要靠猜才行了,我们可以猜是redis引起的,而后逐步去推理这个问题,如果一路推下去毫无阻拦,那就是这个问题,若是有阻拦,那我们得换个角度继续猜,很多现实中的问题,就是考猜+反复验证解决的。
我们举个例子
我们发现系统被挖矿了,而启动该进程的用户是root,我们由此怀疑是通过redis进来的,我们可以思考如下几个点,redis端口是否对外redis是否是弱口令如果确定了如上2项,我们来看下一般是怎么通过redis进行攻击的呢?
一般情况下是暴力破解连上redis后,使用flushall清空命令,而后使用dir将其目录设置到cron文件处即: /var/spool/cron,再次修改filename的值为用户名称,再次flushall后,将命令(curl xxxxx | sh)写入redis使用save将其存储到磁盘中,至此,攻击结束。我们可以顺着这个思路,进行递推,比如,查询redis日志等。如何防止我们介绍了如上情况,那么我们如何防止类似的情况发生呢?
这里给大家列举了几条措施权限最小化例如,启动redis就没必要使用root权限,而是应该新建一个redis用户,专门用以启动redis服务器,这样就算被攻击了,还不至于破坏那么大,且被攻击后,很容易查询是哪个进程引起的。
合理利用防火墙3306、6379、27017等熟知的服务器端口,尽量给固定ip开放,而非0.0.0.0,这里提及一下密码复杂度,尽量设置的相对于复杂点。关闭不必要的插件这个主要是php服务,例如可以远程执行命令的插件等。
对php不是很熟悉,但是它是被攻击的重灾区。
总结我们这篇文章,可以大概分析一些小问题了,其实最重要的是还是防止被攻击,这个取决于运维做事的态度,若是为了怕麻烦,而滥用权限,会导致严重的后果,最重要的,最重要的,被攻击后,尽量将数据备份出来,然后重装系统,这个才是上上之策,我们发现问题,我们也要吸取教训。当然你也可以选择一些比较靠谱的云服务器比如3A云服务。