[转帖]Redis之安全措施

redis,安全措施 · 浏览次数 : 0

小编点评

**指令安全对Redis服务的影响** **keys指令** * 在数据量大的情况下,keys指令会导致Redis卡顿。 **flushdb和flushall指令** * 这些指令会导致Redis的数据被清空,需要谨慎使用。 **rename-command指令** * 该指令可用于修改一些危险的指令,例如: * rename-command keys xxxnxxx 将 keys 指令修改为 xxxnxxx 指令。 * rename-command flushdb '' 将 flushdb 指令修改为空字符串。 **config指令** * 该指令可以获取redis的配置信息并直接在线修改密码。 **端口安全** * redis默认监听 6379 端口,如果该端口对公网暴露,可能会被一些黑客扫描到,从而使用一些指令、lua脚本对服务器注入一些木马,可以通过redis的bind配置指定客户端的ip地址来限制可访问服务端的ip地址。 **通信安全** * 由于Redis本身不支持SSL连接,所以使用spiped作为代理可以让数据得到加密。 **spiped工具** * spiped是一种用于加密redis数据的数据传输工具。 * 使用spiped作为代理可以让数据得到加密,并支持跨机房复制。 **结论** 指令安全对Redis服务的影响很大,需要谨慎使用。建议尽量使用安全指令,如使用spiped工具进行加密传输。

正文

指令安全

Redis的一些指令会对Redis服务的稳定性及安全性各方面造成影响,例如keys指令在数据量大的情况下会导致Redis卡顿,flushdb和flushall会导致Redis的数据被清空。

Redis在配置文件中提供了 rename-command 指令用于将一些危险的指令修改成其他指令,例如:

  1. rename-command keys xxxnxxx
  2. 复制代码

将 keys 指令修改为 xxxnxxx 指令,这样需要执行 keys 指令的时候,输入 xxxnxxx 才是对的效果,以此可以禁止客户端使用keys。

如果想完全禁用某个指令,可以将其设置成空字符串,这条指令将无法通过任何字符串来执行:

  1. rename-command flushdb ''
  2. 复制代码

更为重要的一个指令是config,该指令不仅可以获取redis的配置信息,还可以直接在线修改密码,十分危险,可以通过rename的方式进行屏蔽禁用。

端口安全

redis默认监听 6379 端口,如果该端口对公网暴露,可能会被一些黑客扫描到,从而使用一些指令、lua脚本对服务器注入一些木马

可以通过redis的bind配置指定客户端的ip来限制可访问服务端的ip地址,

  1. bind 192.168.1.199
  2. 复制代码

但更建议对redis设置密码,这样即使端口暴露了,没有正确的密码也无法访问,

  1. requirepass you password
  2. 复制代码

密码也会影响到从节点的复制,从节点也需要在配置文件里配置相应的密码进行同步操作。

  1. masterauth you password
  2. 复制代码

Lua脚本安全

使用redis执行lua脚本时,切记不可使用用户输入的内容来动态生成lua脚本,这可能会导致恶意代码植入,影响服务器的稳定性,

同时Redis在服务单运行也应当使用普通用户的权限,这样即使有恶意代码,也无法使用root权限对服务器做攻击。

通信安全

Redis本身不支持SSL连接,如果客户端和服务端的通信是在公网上进行的,那么就有数据被窃听的风险,需要考虑使用SSL代理。

SSL代理常见的有SSH,Redis官方更推荐使用 spiped 工具,其功能单一,使用简单,便于理解,下图是使用 spiped 对ssh通道(ssh通道本身也可能存在风险)进行二次加密。

image.png

SSL代理也可以用在跨机房复制上,用来保证通信安全,例如公司有两个机房,突然有个需求需要从A机房访问B机房读取数据,如果使用普通tcp直接访问,就会导致传输的数据暴露在公网上,很不安全,可能会被窃听。

image.png

redis本身不支持SSL连接,不过使用spiped作为代理,就可以让数据得到加密。

image.png

spiped会在客户端和服务端各启动一个进程,客户端的spiped负责接收到客户端的请求数据,然后加密,在发送给服务端的spiped进程,其收到后进行解密,在传给redis server,反之也是,

每个 spiped 进程都会监听一个端口,用来接收数据,同时还会作为一个客户端将数据转发到目标地址。

image.png

spiped 使用

安装(mac):

  1. // 安装 spiped
  2. 1. brew install spiped
  3. // 生成随机密钥文件
  4. 2. dd if=/dev/urandom bs=32 count=1 of=spiped.key
  5. // 使用密钥文件启动spiped进程,-d 解密输入数据 -s 源地址监听 -t 转发目标地址
  6. 3. spiped -d -s '[192.168.31.141]:6479' -t '[127.0.0.1]:6379' -k spiped.key
  7. // 使用密钥文件启动spiped进程,-e 加密输入数据 -s 源地址监听 -t 转发目标地址
  8. 4. spiped -e -s '[127.0.0.1]:6579' -t '[192.168.31.141]:6479' -k spiped.key
  9. 复制代码

6579就是本机客户端的spiped进程,可以使用redis客户端对其进行连接然后向它发送指令,6579收到指令后进行加密,转发给 ip为141的6479端口上,

6479接收到数据后进行解密,解密后转发给redis 6379端口上,达到了加密传送的效果。

如下图,可以看到我们使用jedis连接spiped本地进程发送指令,效果与直接连接redis一样,说明spiped起到了代理的作用。

image.png

如果使用jedis直接连接服务端的spiped进程,收到了错误的提示,说明我们的数据没有加密直接发送过去,对方无法识别处理,必须走spiped本地进程加密发送过去才可以。

image.png

关闭spiped

  1. 1. ps -ef | grep spiped
  2. 501 42506     1   0 11:07下午 ??         0:00.08 spiped -d -s [192.168.31.141]:6479 -t [127.0.0.1]:6379 -k spiped.key
  3.   501 42616     1   0 11:07下午 ??         0:00.08 spiped -e -s [127.0.0.1]:6579 -t [192.168.31.141]:6479 -k spiped.key
  4. 2. kill 42506 42616
  5. 复制代码

注意

spiped客户端进程可以支持多个客户端连接的数据转发工作,还可以通过参数限定允许的最大客户端连接数。

但是服务端spiped与redis server只能1对1工作,一个spiped无法转发到多个redis server上去,也就是说要为每个redis server准备一个spiped,这增加了运维成本。

觉得有帮助请帮忙点下,谢谢:https://developer.aliyun.com/article/852005

文章知识点与官方知识档案匹配,可进一步学习相关知识
MySQL入门技能树数据库组成39183 人正在系统学习中

与[转帖]Redis之安全措施相似的内容:

[转帖]Redis之安全措施

指令安全 Redis的一些指令会对Redis服务的稳定性及安全性各方面造成影响,例如keys指令在数据量大的情况下会导致Redis卡顿,flushdb和flushall会导致Redis的数据被清空。 Redis在配置文件中提供了 rename-command 指令用于将一些危险的指令修改成其他指令,

[转帖]Redis性能之内部阻塞式操作及应对方法

文章目录 Redis实例都有哪些阻塞点和客户端交互的阻塞点集合的全量查询和聚合操作bigkey删除操作清空数据库 磁盘交互的阻塞点主从节点交互时的阻塞点切片集群实例交互时的阻塞点可以异步执行的阻塞点异步的子线程总结 Redis的网络IO和键值对读写都是由主线程完成的。 Redis实例都有哪些阻塞点

[转帖]Redis进阶实践之十六 Redis大批量增加数据

Redis进阶实践之十六 Redis大批量增加数据 https://www.cnblogs.com/PatrickLiu/p/8548580.html 一、介绍 有时候,Redis实例需要在很短的时间内加载大量先前存在或用户生成的数据,以便尽可能快地创建数百万个键。这就是所谓的批量插入,本文档的目标

[转帖]Redis进阶实践之十 Redis哨兵集群模式

Redis进阶实践之十 Redis哨兵集群模式 一、引言 上一篇文章我们详细的讲解了Redis的主从集群模式,其实这个集群模式配置很简单,只需要在Slave的节点上进行配置,Master主节点的配置不需要做任何更改,但是有一点,Master和Slave两个节点的持久化配置尽量保持一致,否则会有奇怪的

[转帖]Redis进阶实践之十四 Redis-cli命令行工具使用详解第一部分

https://www.cnblogs.com/PatrickLiu/p/8508975.html 一、介绍 redis学了有一段时间了,以前都是看视频,看教程,很少看官方的东西。现在redis的东西要看的都差不多看完了。网上的东西也不多了。剩下来就看看官网的东西吧,一遍翻译,一遍测试。不错的使用体

[转帖]Redis进阶实践之十五 Redis-cli命令行工具使用详解第二部分(结束)

https://www.cnblogs.com/PatrickLiu/p/8527770.html 一、介绍 今天继续redis-cli使用的介绍,上一篇文章写了一部分,写到第9个小节,今天就来完成第二部分。话不多说,开始我们今天的讲解。如果要想看第一篇文章,地址如下:http://www.cnbl

[转帖]Redis进阶实践之七Redis和Lua初步整合使用

https://www.cnblogs.com/PatrickLiu/p/8391829.html 一、引言 Redis学了一段时间了,基本的东西都没问题了。从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运行在任何平台上,也可以嵌入到大多数语言当中,来扩展其功

[转帖]Redis进阶实践之六Redis Desktop Manager连接Windows和Linux系统上的Redis服务

https://www.cnblogs.com/PatrickLiu/p/8360057.html 一、引言 今天本来没有打算写这篇文章,但是,今天测试Redis的时候发现了两个问题,第一个问题是:Redis Desktop Manager无法连接虚拟机上Linux系统上的Redis服务,第二个问题

[转帖]Redis进阶实践之十八 使用管道模式提高Redis查询的速度

https://www.cnblogs.com/PatrickLiu/p/8580301.html 一、引言 学习redis 也有一段时间了,该接触的也差不多了。后来有一天,以前的同事问我,如何向redis中批量的增加数据,肯定是大批量的,为了这主题,我又重新找起了解决方案。目前的解决方案大都是从官

[转帖]Redis进阶实践之十七 Redis协议的规范

https://www.cnblogs.com/PatrickLiu/p/8567453.html 一、介绍 Redis客户端使用RESP(Redis的序列化协议)协议与Redis的服务器端进行通信。 虽然该协议是专门为Redis设计的,但是该协议也可以用于其他 客户端-服务器 (Client-Se