13 10 月 2026

Redis 未授权访问是互联网上最常见、危害最大的服务器入侵方式之一。攻击者扫到没设密码的 Redis(默认就是没密码),几分钟内就能拿到服务器 root 权限——写公钥、写定时任务、甚至直接反弹 shell。

这篇讲 Redis 未授权访问的原理、怎么自查、怎么彻底加固。现在、立刻、去检查你的 Redis。

需要云服务器可以看看财富云计算:NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上,一键开服面板,主流游戏快速部署。

一、未授权访问是怎么被利用的

攻击链路通常是这样的:

  1. 全网扫描 6379 端口(Redis 默认端口)
  2. 发现能连上(没密码),执行 info 确认版本和配置
  3. 利用 Redis 的写文件能力植入后门:
# 攻击者实际会执行的命令(在你服务器上)
redis-cli -h 目标IP
> config set dir /root/.ssh/
> config set dbfilename authorized_keys
> set x "\n\n公钥内容\n\n"
> save
# 完成:攻击者可以用私钥 SSH 登录你的服务器

还有更直接的:写 crontab 反弹 shell、写 webshell(如果机器上有 Web 目录)、装挖矿程序。

整个过程不到 1 分钟,不需要任何漏洞,用的全是 Redis 的正常功能。

二、自查:你的 Redis 安全吗

现在就去服务器上跑:

# 1. 看 Redis 监听地址(如果是 0.0.0.0 或 ::,全网可达!)
ss -tlnp | grep 6379

# 2. 尝试无密码连接(能连上就是没设密码)
redis-cli -h 127.0.0.1 ping
# 返回 PONG = 本地能连(正常)

# 3. 尝试从「外部」连接(用另一台机器,或公网 IP 测)
redis-cli -h 你的公网IP 6379
# 如果返回 PONG = 危险!全网都能连你的 Redis

再看配置文件:

# 查看关键配置
redis-cli config get requirepass       # 密码(空=没设)
redis-cli config get bind              # 绑定地址
redis-cli config get protected-mode    # 保护模式

危险信号:

  • requirepass 为空
  • bind 是 0.0.0.0 或没配
  • protected-mode 是 no
  • 防火墙没挡 6379 端口

三、加固:六步锁死 Redis

1. 设强密码

# 配置文件 /etc/redis/redis.conf
requirepass 你的超长随机密码

# 或命令行临时设(重启失效,要写进配置文件)
redis-cli config set requirepass 你的密码

密码生成:

# 生成 32 位随机密码
openssl rand -base64 24

设了密码后连接方式:

redis-cli -h 127.0.0.1 -a 你的密码
# 或在程序里: redis://:密码@127.0.0.1:6379

2. 只监听内网

# /etc/redis/redis.conf
bind 127.0.0.1 -::1
# 如果应用在别的机器上,绑内网 IP(如 192.168.1.10),绝不绑 0.0.0.0

3. 开启保护模式

protected-mode yes

保护模式的作用:没设密码 + 没绑地址时,拒绝外部连接。双保险。

4. 禁用危险命令

# 重命名或禁用高危命令(防 RCE 利用)
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG "随机字符串"
rename-command EVAL ""
rename-command DEBUG ""

⚠️ 注意:rename-command CONFIG 后,config set 也用不了,config get 要用新名字。有些程序依赖 CONFIG 命令,改名前先测试。

5. 用普通用户跑,禁止 root

# 配置文件
user redis
# 或 systemd 单元里
User=redis
Group=redis

Redis 进程被拿下后,拿的是 redis 用户权限而不是 root,损失可控。

6. 防火墙兜底

即使 Redis 只听 127.0.0.1,防火墙也加上:

# ufw
ufw deny 6379/tcp
ufw allow from 192.168.1.0/24 to any port 6379    # 只允许内网段

# firewalld
firewall-cmd --permanent --remove-port=6379/tcp
firewall-cmd --reload

# iptables
iptables -A INPUT -p tcp --dport 6379 -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -p tcp --dport 6379 -j DROP

四、已经被入侵了:应急处理

怀疑 Redis 被利用过,按这个流程查:

1. 看有没有异常

# 看 Redis 日志有没有可疑的 config set
grep -i "config set" /var/log/redis/redis-server.log

# 看有没有异常连接记录
redis-cli -a 密码 client list

# 看 RDB 文件是否被动过(攻击者靠 save 写文件)
ls -la /var/lib/redis/
ls -la /root/.ssh/

2. 检查常见后门位置

# SSH 公钥后门(最高频)
cat /root/.ssh/authorized_keys
# 看到不认识的公钥 = 被入侵

# crontab 后门
crontab -l
ls /etc/cron.d/ /var/spool/cron/

# 系统服务后门
systemctl list-units --type=service --state=running | grep -v known

# 异常进程(挖矿特征:CPU 占满、进程名随机)
top
ps aux | grep -E "kdevtmpfs|xmrig|minerd|\.\/"

# 异常端口
ss -tlnp

3. 处置顺序

  1. 先断网:安全组/防火墙全关,只留自己的 IP
  2. 改密码:Redis 密码、系统 root 密码、所有可能泄露的密钥
  3. 清后门:authorized_keys 里删陌生公钥、crontab 清异常项
  4. 备份证据:把日志、可疑文件留着,分析入侵路径
  5. 重装系统:root 权限丢过的机器,最干净的做法是重装,只恢复数据不恢复配置
  6. 补上加固:按上面六步重新配

详细应急流程见服务器被入侵应急排查。

五、Redis 安全配置模板

一份可以直接抄的配置:

# /etc/redis/redis.conf 安全部分

# 网络
bind 127.0.0.1 -::1
protected-mode yes
port 6379
tcp-backlog 511
timeout 0            # 客户端空闲不超时(按需调整)
tcp-keepalive 300

# 认证
requirepass 你的超长随机密码
# Redis 6+ 支持 ACL,更细粒度
# user default on >你的密码 ~* +@all

# 危险命令禁用
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG "CONFIG_RANDOM_STRING"
rename-command KEYS ""

# 内存上限(防被打爆)
maxmemory 256mb
maxmemory-policy allkeys-lru

# 运行用户
# 在 systemd 单元里设 User=redis

# 日志
logfile /var/log/redis/redis-server.log
loglevel notice

改完重启并验证:

systemctl restart redis
redis-cli -h 127.0.0.1 ping                    # 应该要求密码
redis-cli -h 127.0.0.1 -a 密码 ping            # 返回 PONG
redis-cli -h 公网IP 6379                       # 应该连不上

六、云服务器上的额外注意

安全组

云厂商控制台的安全组,默认可能放通了所有端口。去检查:

  • 6379 端口只对 127.0.0.1 或内网开放
  • 不要图省事「放通全部端口」

NAT 型服务器的特殊性

NAT 型云服务器没有独立公网 IP,服务商在网关做端口映射。这意味着:

  • 只有映射出来的端口才能从公网访问。如果映射列表里没有 6379,公网扫不到你的 Redis,天然安全一层
  • 但别主动去映射 6379——没有任何正当理由把数据库端口暴露公网
  • 在服务商控制台确认映射端口清单,把不需要的端口从映射里删掉

这也是 NAT 机型的一个隐性安全优势:端口默认不开放,攻击面小。

公网必须访问 Redis 的场景

如果应用和 Redis 不在同一台机器(比如 Web 在前端、Redis 在数据节点),不要直接开放 6379,用这两种方式:

  1. 内网互通:同 VPC 内网直接连,不走公网(首选)
  2. SSH 隧道:ssh -L 6379:localhost:6379 user@redis机,加密走 SSH
  3. stunnel/TLS:Redis 6+ 支持 TLS,配证书加密传输

七、常见问题

Q:设了密码,应用连不上了?
连接字符串要带密码:redis://:你的密码@127.0.0.1:6379。检查代码里的配置,密码别手滑带空格。

Q:rename-command CONFIG 后,程序报错?
程序用不了 CONFIG 命令了。要么改回,要么升级程序改用别的方式配置。生产环境谨慎用这个。

Q:Redis 6 的 ACL 和 requirepass 用哪个?
Redis 6+ 推荐用 ACL,可以给不同用户不同权限(比如只读用户、只能操作某些 key 前缀)。requirepass 简单粗暴,小场景够用。

Q:怎么监控 Redis 有没有被扫?
看 Redis 日志的连接来源 IP,异常的 IP 加防火墙黑名单:

# Redis 日志里连接记录
grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' /var/log/redis/redis-server.log | sort | uniq -c | sort -rn

Q:本地开发要方便,能不能关密码?
可以,但必须同时满足:只听 127.0.0.1 + protected-mode yes + 防火墙挡 6379。三个条件缺一不可,生产环境一律设密码。

小结

Redis 安全就三句话:设密码、只听本地、防火墙兜底。五分钟检查完,能防住互联网上最常见的入侵方式之一。已经怀疑被入侵的,别只删后门——root 丢过的机器请重装,这是唯一彻底的办法。

更多安全教程见财富云计算知识库:防火墙配置、fail2ban、数据库加固、被入侵应急全系列。需要云服务器可以看看财富云计算:一键开服面板,NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上,网关层减少暴露面。

延伸阅读
  1. 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
  2. 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
  3. 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
  4. 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
  5. 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
  6. RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
  7. 短链接服务搭建:Shlink 自托管,链接数据自己掌握
  8. 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道
更多阅读
  1. 上一篇:Nginx 限速与 CC 防护进阶配置:不买高防也能扛
  2. 下一篇:数据库安全加固与权限最小化:MySQL 加固完整方案
发表评论 5

取消回复