———–
好吧,我也做了回题目党,像我这么仔细的同学,怎么可能让服务器被入侵呢?
其实是这样的,昨天我和一个敌人聊天,他说他本人有一台云服务器运行了 Redis 数据库,有一天忽然发现数据库里的 数据全没了,只剩下一个奇奇怪怪的键值对,其中值看起来像一个 RSA 公钥的字符串,他认为是误操作删库了,幸好本人的服务器里没啥重要的数据,也就没在意。
通过一番攀谈交心理解到,他跑了一个比拟古老曾经进行保护的开源我的项目,装置的旧版本的 Redis,而且他对 Linux 的应用不是很纯熟。我就晓得,他的服务器曾经被攻陷了,想到兴许还会有不少像我这位敌人的人,不器重操作系统的权限、防火墙的设置和数据库的爱护,我就写一篇文章简略看看这种状况呈现的起因,以及如何防备。
PS:这种手法当初曾经行不通了,因为新版本 Redis 都减少了 protect mode,减少了安全性,咱们只能在本地简略模仿一下,就别乱试了。
事件通过
其实这种攻打手法都是 2015 年的事了,那时候 Redis 的平安爱护机制比拟差,只能靠运维人员来合理配置以保障数据库的平安。有段时间,寰球几万个 Redis 节点受到了攻打,呈现了上述奇怪的景象,所有数据被清空,只剩一个键叫 crackit
,它的值形似 RSA 公钥的字符串。
起初查证,攻击者利用 Redis 动静设置配置和数据长久化的性能,把本人的 RSA 公钥写入到了被攻打服务器的 /root/.ssh/authored_keys
这个文件,从而能够用私钥间接登录对方的 root 用户,侵入对方零碎。
失陷的服务器平安防护做的很不好,具体如下:
1、Redis 的端口是默认端口,而且能够从公网拜访。
2、Redis 还没设明码。
3、Redis 过程是由 root 用户启动的。
以上每个点都是比拟危险的,合在一起,那真是很致命了。且不说他人把公钥写到你的零碎里,就说连上你的数据库而后删库,那损失都够大了。那么具体的流程是什么呢,上面我在本地回环地址上简略演示一下。
本地演示
Redis 监听的默认端口是 6379,咱们设置它接管网卡 127.0.0.1 的连贯,这样我从本地必定能够连贯 Redis,以此模仿「从公网能够拜访 Redis」这一条件。
当初我是名叫 fdl 的普通用户,我想用 ssh 登录我零碎上的 root 用户,要输出 root 的明码,我不晓得,所以没方法登录。
除了明码登录之外,还能够应用 RSA 密钥对登录,然而必须要把我的公钥存到 root 的家目录中 /root/.ssh/authored_keys
。咱们晓得 /root
目录的权限设置是不容许任何其余用户闯入读写的:
然而,我发现自己居然能够间接拜访 Redis:
如果 Redis 是以 root 的身份运行的,那么我就能够通过操作 Redis,让它把我的公钥写到 root 的家目录中。Redis 有一种长久化形式是生成 RDB 文件,其中会蕴含原始数据。
我露出了邪恶的微笑,先把 Redis 中的数据全副清空,而后把我的 RSA 公钥写到数据库里,这里在结尾和结尾加换行符目标是防止 RDB 文件生成过程中损坏到公钥字符串:
命令 Redis 把生成的数据文件保留到 /root/.ssh/
中的 authored_keys
文件中:
当初,root 的家目录中曾经蕴含了咱们的 RSA 公钥,咱们当初能够通过密钥对登录进 root 了:
看一下方才写入 root 家的公钥:
乱码是 GDB 文件的某种编码吧,然而两头的公钥被残缺保留了,而且 ssh 登录程序居然也辨认了这段被乱码突围的公钥!
至此,领有了 root 权限,就能够随心所欲了。。。
吸取教训
尽管当初根本不会受到这种攻打(新版本的 Redis 没有明码时默认不对外网凋谢),然而对于零碎的安全性是每个人都应该器重的。
咱们本人折腾货色,用个低配云服务器,为了省事儿个别也不认真配置防火墙,数据库不设明码或者设成 admin、root 这样简略的明码,反正也没啥数据。这样必定不是个好习惯。
当初咱们的计算机系统越来越欠缺,每个成熟的我的项目都由最优良的一帮人保护,从技术上说应该算是无懈可击了,那么惟一可能出问题的中央就在于应用它们的人。
就像常常看到有人的 QQ 被盗,我置信盗号的人必定不是跑到腾讯的数据库里盗号,必定是 QQ 号主平安防备意识差,在哪个钓鱼网站输出了本人的账号密码,导致被盗。我根本没见过微信被盗的,可能是微信弱化明码登录,改用二维码扫描登录的起因。这应该也算是一种平安方面的考量吧,毕竟微信是有领取性能的。
下面这种骗局对于技术人来说,看看 url,浏览器剖析一下网络包就很容易辨认进去,然而你还别不信,个别人真的搞不明确怎么辨认钓鱼网站和官方网站。就像我真没想到都 2020 年了,还有人在找 Redis 的这个破绽,而且还有人中招。。。
那么说回 Redis 数据库的应用,在官网上明确写出了平安防护的倡议,我简略总结一下吧:
1、不要用 root 用户启动 Redis Server,而且肯定要设置明码,而且明码不要太短,否则容易被暴力破解。
2、配置服务器防火墙和 Redis 的 config 文件,尽量不要让 Redis 与外界接触。
3、利用 rename 性能假装 flushall 这种危险命令,以防被删库,失落数据。