当前位置:首页 > 问答 > 正文

Redis 访问那些事儿,怎么弄才能更安全点,别让人轻易进来

说到Redis的安全问题,这确实是个大事儿,因为很多开发者,尤其是刚开始用的时候,会觉得Redis就是个简单的内存缓存,装上去能存能取就行了,常常忽略了安全设置,结果就是,网上有一大堆Redis服务器是“裸奔”的,谁都能连上去看两眼,甚至删库,这事儿在安全圈里不是秘密,绿盟科技在2021年的一份安全分析报告里就明确提到,因配置不当导致Redis可被未授权访问是最高发的安全问题之一(来源:绿盟科技《Redis未授权访问漏洞预警与分析》),咱们今天就来聊聊,怎么给Redis穿上“衣服”,别让人随便就进来了。

第一道防线:别让外人看见你——网络隔离与绑定

最简单也最有效的一招,就是别把你的Redis服务器直接暴露在公网上,这就好比你把家里的金银财宝放在卧室,总比放在大马路上安全,具体怎么做呢?

  1. 修改绑定地址:Redis默认的配置是监听所有网络接口(0.0.0),这意味着只要别人知道你的服务器IP,就能尝试连接,你应该在配置文件redis.conf里找到bind指令,把它改成只允许内网IP或者本地回环地址0.0.1,如果你的应用和Redis在同一台机器上,就直接改成bind 127.0.0.1,这样,只有本机才能访问Redis,外面的请求根本进不来,这是最根本的隔离。
  2. 使用防火墙:如果Redis必须被其他服务器访问,那就用防火墙(比如iptables、firewalld或者云服务商提供的安全组)设置白名单,只允许你信任的、特定的服务器IP地址和Redis的端口(默认6379)通信,其他一律拒绝,这就好比在小区门口设了保安,只让登记过的业主进门。

第二道防线:进门要口令——设置密码认证

Redis 访问那些事儿,怎么弄才能更安全点,别让人轻易进来

如果因为架构原因,你的Redis确实需要被一定范围内的机器访问,那么设置一个强密码就是必须的,Redis提供了一个简单的密码认证机制。

  1. 开启requirepass:在redis.conf文件里,找到requirepass这个配置项,把注释去掉,后面跟上你自己设定的一个足够复杂、足够长的密码,密码不要太简单,别用123456或者password这种,最好是大小写字母、数字、特殊符号混合的一长串。
  2. 客户端连接时验证:设置了密码之后,客户端在连接Redis时,必须先发送AUTH命令并提供正确的密码,才能执行其他操作,否则,Redis会拒绝一切指令,这就给闯入者增加了一个巨大的障碍,腾讯云在其官方文档中反复强调,为生产环境的Redis实例设置高复杂度的密码是基础且关键的安全实践(来源:腾讯云官方文档 - 云数据库 Redis 安全组配置)。

第三道防线:限制他的权力——最小权限原则

Redis 访问那些事儿,怎么弄才能更安全点,别让人轻易进来

就算有人通过某种方式进来了,我们也要限制他能干什么,不能让他为所欲为。

  1. 重命名或禁用危险命令:Redis有一些非常危险的命令,比如FLUSHALL可以清空整个数据库,CONFIG命令可以直接在线修改服务器配置,SHUTDOWN能直接让Redis关机,对于绝大多数应用场景来说,这些命令根本用不到,你可以在redis.conf里用rename-command指令给这些命令换个又长又难记的名字,或者直接重命名为空字符串来彻底禁用它们。rename-command FLUSHALL ""rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52,这样,即使攻击者进来了,他也很难搞破坏。
  2. 使用非root用户运行:千万不要用root权限去启动Redis服务,应该专门创建一个低权限的、只能操作Redis相关文件的系统用户(比如redis用户),然后用这个用户来运行Redis服务,这样即使Redis服务被攻破,攻击者获得的权限也是受限的,无法对整个系统造成太大影响。

第四道防线:不留后路——其他加固小技巧

除了上面这些,还有一些零碎但有用的点。

  • 修改默认端口:Redis默认使用6379端口,这是尽人皆知的,你可以把它改成一个不常用的高端口号,比如6380,这虽然不能从根本上防止攻击(因为端口扫描很容易发现),但能挡住一些漫无目的的自动化脚本扫描。
  • 及时更新版本:和所有软件一样,Redis也会不时爆出一些安全漏洞,保持你的Redis版本更新到稳定版,可以避免受到已知漏洞的攻击。
  • 启用保护模式:Redis从3.2版本开始引入了保护模式,当Redis没有设置密码,并且被配置为绑定所有接口(0.0.0)时,保护模式会自动开启,在这种模式下,Redis只会接受来自本地主机(127.0.0.1)的连接请求,来自外部的连接会被拒绝,这是一个很好的安全兜底机制,但你不能依赖它,主动配置才是王道。

让Redis更安全,核心思想就是“收缩”:收缩它的网络暴露面、收缩它的访问权限、收缩它的危险操作能力,别嫌麻烦,把这些步骤都做一遍,你的Redis就能从“裸奔”状态升级到“铜墙铁壁”,大大降低被不速之客闯入的风险,安全不是一个开关,而是一个过程,多一道锁,就多一分安心。