Redis之安全措施

指令安全

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

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

rename-command keys xxxnxxx

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

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

rename-command flushdb ''

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

端口安全

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

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

bind 192.168.1.199

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

requirepass you password

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

masterauth you password

Lua脚本安全

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

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

通信安全

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

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

Redis之安全措施

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

Redis之安全措施

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

Redis之安全措施

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

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

Redis之安全措施

spiped 使用

安装(mac):

// 安装 spiped

1. brew install spiped

// 生成随机密钥文件

2. dd if=/dev/urandom bs=32 count=1 of=spiped.key

// 使用密钥文件启动spiped进程,-d 解密输入数据 -s 源地址监听  -t 转发目标地址

3. spiped -d -s '[192.168.31.141]:6479' -t '[127.0.0.1]:6379' -k spiped.key

// 使用密钥文件启动spiped进程,-e 加密输入数据 -s 源地址监听  -t 转发目标地址

4. spiped -e -s '[127.0.0.1]:6579' -t '[192.168.31.141]:6479' -k spiped.key

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

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

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

Redis之安全措施

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

Redis之安全措施

关闭spiped


1. ps -ef | grep spiped

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

  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
  
 2. kill 42506 42616

注意

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

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

上一篇:Redis之HyperLogLog


下一篇:计算机网络体系结构