Redis主节点被强制降级为从节点的原因排查
故障原因
你的Redis实例被公网攻击者未授权入侵了,不存在Redis自动把主节点降级为从节点的内置逻辑:
- 日志里明确记录了触发主从切换的来源:
REPLICAOF 178.20.40.200:8886 enabled (user request from 'id=39 addr=95.182.123.66:36904 ... cmd=slaveof'),是公网IP95.182.123.66直接连上你的无密码Redis,执行了SLAVEOF命令,强行把你的实例设置为攻击者控制的恶意主节点178.20.40.200:8886的从节点。 - 你执行
SLAVEOF NO ONE后约5秒数据被清空,是因为攻击者的自动化扫描脚本会持续轮询被控制的Redis实例,发现实例脱离主从关系后会立刻重新建立复制关系,复制流程会自动清空本地数据加载恶意主节点的同步数据。日志里的Wrong signature trying to load DB from file报错,是因为攻击者的恶意主节点返回的同步文件不是合法RDB格式,导致数据加载失败,后续每秒一次的重连日志就是实例在不断尝试连接攻击者的恶意主节点。 - 这个问题和EC2环境、实例内存没有关系,只要是无密码且暴露在公网的Redis实例,通常会在上线后数分钟到数小时内被这类自动化攻击脚本扫描入侵。
修复方案
按以下顺序操作可以彻底解决问题:
- 立即收敛网络访问权限:调整容器端口映射规则和EC2安全组规则,禁止公网访问6379端口,仅允许信任的内网IP访问Redis端口。
- 配置强访问密码:在Redis配置文件中添加
requirepass 复杂度足够的强密码,启动容器时将自定义配置文件挂载到容器内生效,禁止使用无密码的默认配置。 - 清理恶意持久化残留:停止当前Redis容器,删除数据挂载目录下的
dump.rdb、appendonly.aof等持久化文件,避免攻击者写入的恶意数据(比如SSH公钥、定时任务脚本)在重启后被加载执行。 - 禁用高危命令:在Redis配置中重命名或直接禁用高风险命令,示例配置:
rename-command SLAVEOF "" rename-command CONFIG "" rename-command FLUSHALL "" rename-command FLUSHDB "" rename-command DEBUG "" - 降权运行:启动Redis容器时使用非root用户运行,避免容器被攻破后获得宿主机root权限。
内容的提问来源于stack exchange,提问作者rollrat
相关产品推荐
相关产品推荐

