【Redis扩展篇(二)】安全

Redis安全

1. 指令安全

Redis有一些非常危险的指令,这些指令会对Redis的稳定以及数据安全造成非常严重的影响。比如keys(获取匹配成功的所有Key)指令会导致Redis卡顿,flushdbfushall会让Redis的所有数据全部清空,如何避免人为操作失误导致这些灾难性的后果也是运维人员特别需要注意的风险之一。

Redis在配置文件中提供了rename-command指令用于将某些危险的指令修改为别的名称,用来避免人为误操作,比如配置文件的seurity块中增加内容

rename-command keys abdkeysabc

2. 端口安全

Redis默认会监听6379端口,如果当前的服务器主机有外网地址,Redis的服务将会直接暴漏在公网上,任何一个初级的黑客使用适当的工具对IP地址进行端口扫描就可以检测出来。

Redis服务地址一旦可以被外网直接访问,内部的数据就彻底丧失了安全性。高级一点的黑客们可以通过Redis执行Lua脚本拿到服务器权限,恶意的竞争对手们甚至会直接清空Redis数据库(好狠心)。

bind 10.100.20.13

所以,运维人员务必在Redis的配置文件中指定监听的IP地址,更进一步,还可以增加Redis的密码访问限制,客户端必须使用auth指令传入正确的密码才可以访问Redis。这样及时地址暴漏了,普通黑客也无法对Redis进行任何指令操作。

requirepass your password

密码控制也会影响从节点复制,从节点必须在配置文件中使用masterauth指令配置相应的密码才能进行复制操作

masterauth your password

3. Lua脚本安全

开发者必须禁止Lua脚本由用户输入的内容(UGC)生成,这可能会被黑客利用,通过植入恶意的攻击代码来得到Redis的主机权限。同时,我们应该让Redis以普通用户的身份启动,这样即时存在恶意代码,黑客也无法拿到root权限。

4. SSL代理 spiped

Redis并不支持SSL连接,意味着客户端和服务器之间交互的数据不应该直接暴漏在公网上传输,否则会有窃听的风险。如果必须要用在公网上,可以考虑使用SSL代理。

SSL代理比较常见的由ssh,不过Redis官方推荐使用spiped工具,可能时因为spiped的功能比较单一,使用也比较简单,易于理解。同样,SSL代理也可以用在主从复制上,如果Redis主从实列需要跨机房复制,spiped也可以派上用场。

5. 安全通信

如果有这样一个场景,因为一个紧急需求,需要跨机房读取Redis数据,应用部署在A机房,存储部署在B机房。如果使用普通tcp直接访问,因为跨机房所以传输数据会保留在公网上,这非常不安全,客户端和服务器交互的数据存在窃听的风险。

因为Redis本身并不支持SSL安全连接,不过有了SSL代理软件,我们可以让通信数据得到加密,Redis官方推荐spiped代理

spiped原理

spiped会在客户端和服务器各启动一个spiped进程。在Client端,spiped进程负责将发送的数据加密。在服务器端,spiped负责将接收到的数据解密。

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

spiped进程需要成对出现,相互之间需要使用相同的共享密钥来加密信息。

spiped安装

# Mac
> brew install spiped
# Linux
> apt-get install spiped
> yum install spiped

使用

(1) 使用docker启动redis-server, 注意要绑定本机的回环127.0.0.1

> docker run -d -p127.0.0.1:6379:6379 --name redis-server-6379 redis
> docker ps

(2) 生成随机的密钥文件

# 随机的32个字节
> dd if=/dev/urandom bs=32 count=1 of=spiped.key

(3) 使用密钥文件启动服务器spiped进程,172.16.128.81是本机的公网IP地址。

# -d 表示decrypt(对输入数据进行解密) -s为源监听地址, -t为转发目的地址
> spiped -d -s '[172.16.128.81]:6479' -t '[127.0.0.1]:6379' -k spiped.key

这个spiped进程监听公网IP的6479端口接收公网上的数据,将数据解密后转发到本机回环地址的6379端口,也就是redis-server监听端口。

(4)使用密钥文件启动客户端 spiped进程

# -e表示encrypt,对输入数据进行加密
> spiped -e -s '[127.0.0.1]:6579'  -t '[172.16.128.81]:6479' -k spiped.key

客户端spiped进程监听了本地回环地址6579端口,将该端口上收到的数据加密转发到服务器spiped进程。

(5)启动客户端连接,因为Docker里面的客户端不好访问宿主机的回环地址。所以使用python代码来启动Redis的客户端。

import redis

c = redis.StrictRedis(host='localhost', port=6579)
c.ping()
c.info('CPU')

如果尝试直接连接服务器spiped进程(加密的端口6379)

import redis

c = redis.StrictRedis(host='172.16.128.81', port=6479)
c.ping()

spiped可以同时支持多个客户端连接的数据转发工作,还可以通过参数参数来限定允许的最大客户端连接数,但是对于服务器spipe,他不能同时支持多个服务器之间的转发,也就意味着在集群环境下,需要为每一个server结点启动一个spiped进程来代收消息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

企鹅宝儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值