Redis默认配置下如果没有设置密码,并且监听在0.0.0.0,等于把数据库直接暴露在公网。攻击者用一条INFO命令就能拿到版本、内存、连接数、键数量,再用CONFIG SET dir /var/spool/cron配合SAVE写计划任务,服务器很快就会被控制。所以安全设置密码和限制访问网段不是可选项,而是Redis上线前必须完成的两步。
先确认Redis当前监听状态登录服务器后,先看Redis到底监听在哪些地址。执行netstat -tlnp | grep redis,如果输出0.0.0.0:6379或者:::6379,说明对所有网卡开放。再检查配置文件redis.conf中的bind参数。很多发行版默认bind 127.0.0.1,但容器镜像或一键脚本经常改成0.0.0.0方便远程连接,这就埋下隐患。确认监听范围是后续操作的前提,否则只设密码但监听全网段,暴力破解仍然会发生。
设置强密码的具体方法打开redis.conf,找到requirepass这一行。默认它是注释状态,取消注释并设置一个足够复杂的密码。密码长度建议20位以上,包含大小写字母、数字和特殊符号,避免使用redis、123456、password这类常见弱口令。修改后保存文件,重启Redis服务生效。如果不想重启,也可以连接Redis后执行CONFIG SET requirepass "你的强密码",但这种方式重启后会丢失,必须同步修改配置文件。
设置密码后,客户端连接需要携带密码。redis-cli连接时使用-a参数,例如redis-cli -h 127.0.0.1 -p 6379 -a "你的强密码"。如果不想让密码出现在shell历史记录里,可以先执行redis-cli,进入交互模式后再输入AUTH 你的强密码。应用程序连接时,需要在连接字符串中加上密码字段。以Java的Lettuce客户端为例,连接URI格式为redis://:密码@主机:端口/数据库编号。Python的redis库则在Redis()构造函数中传入password参数。
限制访问网段的配置方式限制网段最直接的办法是修改bind参数。bind用于指定Redis只监听哪些网络接口。如果只有本机应用访问,设置bind 127.0.0.1即可。如果有内网其他服务器需要访问,设置bind 127.0.0.1 10.0.0.5,其中10.0.0.5是Redis服务器在内网的IP。注意bind后面写多个IP时用空格分隔,不要写错成逗号。修改后重启Redis,netstat确认监听地址已经变成指定IP,而不是0.0.0.0。
如果Redis部署在云服务器上,除了bind,还应该在云安全组或防火墙层面做二次限制。只放行需要访问Redis的源IP或源网段,例如只允许10.0.0.0/24访问6379端口。这样即使Redis配置出现遗漏,防火墙也能挡住外部连接。对于使用Docker部署的Redis,容器内部的bind配置可能被端口映射覆盖,此时必须在宿主机防火墙层面限制6379端口的外部访问。
使用ACL实现更细粒度的权限控制Redis 6.0以后引入了ACL功能,比单纯的requirepass更灵活。可以创建不同用户,每个用户有独立密码和命令权限。例如只给应用用户授予读写数据的权限,不给CONFIG、SHUTDOWN、FLUSHALL等危险命令。创建用户的命令如下:
ACL SETUSER appuser on >强密码 ~* +@all -@admin -@dangerous ACL SETUSER readonly on >另一个密码 ~* +get +mget +hget +hgetall
第一条创建名为appuser的用户,允许所有key的访问,但禁止admin类和dangerous类命令。第二条创建只读用户,只允许执行get、mget等读取命令。启用ACL后,客户端连接时使用AUTH 用户名 密码的方式认证。对于旧版本Redis,无法使用ACL,只能通过rename-command把危险命令改名或禁用。例如在redis.conf中添加rename-command CONFIG ""可以彻底禁用CONFIG命令,添加rename-command FLUSHALL "自定义名称"可以降低误操作风险。
修改默认端口和禁用高危命令修改6379默认端口可以降低被扫描器批量发现的概率,但这不是核心安全措施,只能算增加一点攻击成本。在redis.conf中修改port参数即可,例如改成16379。改完后客户端连接、监控系统、备份脚本都要同步更新端口。高危命令的禁用比改端口更重要。除了CONFIG和FLUSHALL,还应该考虑禁用SHUTDOWN、DEBUG、KEYS等命令。KEYS在数据量大时会阻塞Redis,生产环境应改用SCAN。禁用方式是在redis.conf中设置rename-command KEYS ""。
配置保护模式与超时时间Redis默认开启了保护模式,当Redis没有设置密码且没有绑定指定地址时,保护模式会拒绝外部连接。但一旦设置了密码,保护模式自动失效,所以不能依赖保护模式。timeout参数控制空闲连接多久后自动断开,默认是0表示永不超时。建议设置timeout 300,即空闲5分钟自动断开,减少连接被长期占用的风险。同时设置tcp-keepalive 60,让Redis定期发送心跳包检测连接是否存活,及时清理死连接。
日志监控与入侵检测安全配置完成后,还需要开启日志记录。redis.conf中设置loglevel notice或warning,logfile指定日志文件路径。定期检查日志中是否有大量AUTH失败记录,这通常是暴力破解的迹象。如果发现某个IP频繁尝试认证失败,可以在防火墙层面直接封禁。对于关键业务,建议接入监控系统,对Redis的连接数、命令执行频率、内存使用率设置告警阈值。异常的命令执行模式,比如突然出现大量CONFIG或SAVE命令,可能是入侵行为。
验证配置是否生效的完整流程修改完所有配置后,按以下顺序验证:第一,重启Redis服务,确认没有报错。第二,执行redis-cli -h 127.0.0.1 -p 端口,不带密码连接,尝试执行INFO命令,应该返回NOAUTH Authentication required。第三,使用正确密码连接,执行CONFIG GET requirepass确认密码已设置。第四,从另一台非授权服务器尝试连接,应该无法建立TCP连接或连接超时。第五,从授权网段的服务器连接,确认可以正常读写数据。这五步全部通过,说明密码和网段限制已经生效。
Redis安全加固的核心逻辑是:密码负责身份认证,bind和防火墙负责网络层隔离,ACL负责权限最小化,日志监控负责事后追溯。四层防护叠加,才能把Redis被入侵的风险降到可接受范围。只做其中任何一项都存在明显短板,尤其是只设密码不限网段,等于把门锁上了但窗户全开着。
