指令安全
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通道本身也可能存在风险)进行二次加密。
SSL代理也可以用在跨机房复制上,用来保证通信安全,例如公司有两个机房,突然有个需求需要从A机房访问B机房读取数据,如果使用普通tcp直接访问,就会导致传输的数据暴露在公网上,很不安全,可能会被窃听。
redis本身不支持SSL连接,不过使用spiped作为代理,就可以让数据得到加密。
spiped会在客户端和服务端各启动一个进程,客户端的spiped负责接收到客户端的请求数据,然后加密,在发送给服务端的spiped进程,其收到后进行解密,在传给redis server,反之也是,
每个 spiped 进程都会监听一个端口,用来接收数据,同时还会作为一个客户端将数据转发到目标地址。
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起到了代理的作用。
如果使用jedis直接连接服务端的spiped进程,收到了错误的提示,说明我们的数据没有加密直接发送过去,对方无法识别处理,必须走spiped本地进程加密发送过去才可以。
关闭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,这增加了运维成本。
觉得有帮助请帮忙点下,谢谢:https://developer.aliyun.com/article/852005