使用redis时,需要注意安全风险以及进行必要的防范措施,避免数据泄露和丢失、避免主机权限遭到黑客窃取,以及避免人为操作的失误。
指令安全
Redis有一些非常危险的指令,这些指令会对Redis的稳定和数据安全造成非常严重的影响。比如keys指令会导致Redis卡顿,flushdb和fulshall会清空Redis的所有数据。
Redis配置文件中提供了rename-command指令用来将指令修改成别的名称,用来避免人为操作。
可以在配置文件的security块中增加
rename-command keys abckeysabc
再想要执行keys命令时,如果直接输入keys命令,就不会启效果了。需要键入abckeysabc。
如果想要完全封锁某条指令,可以将该指令rename成空字符串,这样就无法通过任何字符串指令来执行这条命令了。
如:将flushall 封锁掉
rename-command flushall ""
端口安全
Redis默认会监听6379端口,如果当前服务器主机有外网地址,那么Redis的服务就会直接暴露在公网上,通过一些工具对IP地址进行端口扫描就可以探测出来。
因此,在Redis的配置文件中务必制定监听的IP地址,更进一步,还可以增加Redis的密码访问限制,客户端必须使用auth指令,传入正确的密码才能访问Redis,这样即使地址暴露出去黑客也无法对Redis进行操作
requirepass password
密码控制也会影响从节点复制,从节点必须在配置文件中使用masterauth指令配置相应的密码才可以进行复制操作。
masterauth password
Lua脚本安全
开发者必须禁止Lua脚本有用户输入的内容生成,这可能 会被黑客利用,通过植入恶意的攻击代码来得到Redis的主机权限。
同时,我们应该让Redis以普通用户的身份启动,这样即使存在恶意代码,黑客也无法拿到root权限。
SSL代理
Redis并不支持SSL链接,意味着客户端和服务器之间交互的数据不应该直接暴露在公网上传输,否则会有被窃听的风险。如果必须要用在公网上,可以考虑使用SSL代理。
SSL代理比较常见的有ssh,不过redis官方推荐的是spiped工具。spiped功能相对比较单一,使用也比较简单,易于理解。
同样SSL代理也可以用在主从复制上,如果Redis主从实例需要跨机房复制,spiped也可以排上用场。
spiped实现原理:
spiped会在客户端和服务器各启动一个spiped进程。
左边的spiped进程负责接受来自Redis Client发送过来的请求数据,加密后传送到右边的spiped进程。右边的spiped进程将接收到的数据解密后传递到Redis Server。然后Redis Server早走一个反向的流程将相应回复给Redis Client。
每一个spiped进程都会有一个监听端口(server socket)用来接收数据,同时还会作为一个客户端(socket client)将数据转发到目标地址。
spiped进程需要成对出现,相互之间需要使用相同的共享米要来加密消息。