Redis 安全全攻略(2025 版)
核心原则:默认不安全。Redis 设计为「高速内网缓存」,生产环境必须逐层加固。
1. 威胁模型一览
| 威胁 | 场景 | 后果 |
|---|---|---|
| 未授权访问 | 公网暴露 0.0.0.0:6379 | 数据泄露、挖矿、RCE |
| 弱密码 / 无密码 | requirepass 未设 | 任意命令执行 |
| 主从复制劫持 | 从库可写 + 公网 | 写入恶意模块 → RCE |
| Lua 沙箱突破 | EVAL 滥用 | 任意代码执行 |
| 配置不当 | protected-mode no | 绕过本地保护 |
| SSL/TLS 缺失 | 明文传输 | 嗅探、篡改 |
2. 八大安全加固措施(必须全部开启)
2.1 网络隔离(第一道防线)
# redis.conf
bind 127.0.0.1 # 仅本地,或内网 IP
# bind 10.0.0.5
protected-mode yes # Redis 6+ 默认开启
防火墙(仅放通信任 IP):
# ufw
ufw allow from 10.0.0.0/24 to any port 6379
ufw deny 6379
# iptables
iptables -A INPUT -p tcp -s 10.0.0.0/24 --dport 6379 -j ACCEPT
iptables -A INPUT -p tcp --dport 6379 -j DROP
云环境:VPC + 安全组,禁止公网访问。
2.2 认证(第二道防线)
# redis.conf
requirepass YourStrongP@ssw0rd2025
# Redis 6+ ACL(推荐替代 requirepass)
aclfile /etc/redis/users.acl
ACL 配置示例(users.acl)
# 默认禁用所有
user default off
# 管理员
user admin on #P@ssw0rdAdmin ~* +@all
# 只读用户
user readonly on #Read0nly! ~* -@write -@dangerous
# 应用专用(仅操作 db1 的 key 前缀 app:)
user app on #AppSecret123 ~app:* &* +@read +@write -@admin -@dangerous resetchannels
ACL 命令:
ACL SETUSER app on #AppSecret123 ~app:* +@read +@write
ACL SAVE
Redis 7+ 支持
ACL GENPASS生成安全密码:redis-cli ACL GENPASS 256 # 生成 64 位哈希
2.3 禁用危险命令(第三道防线)
# redis.conf
rename-command CONFIG "" # 完全禁用
rename-command FLUSHALL "FLUSHALL_XX"
rename-command FLUSHDB "FLUSHDB_XX"
rename-command EVAL ""
rename-command SCRIPT ""
ACL 方式更精细:
user app -@dangerous # 禁止 CONFIG, KEYS, FLUSH*, etc.
2.4 启用 TLS 加密传输(第四道防线)
# redis.conf (Redis 6+)
tls-port 6379
port 0 # 关闭明文端口
tls-cert-file /etc/redis/redis.crt
tls-key-file /etc/redis/redis.key
tls-ca-cert-file /etc/redis/ca.crt
# 客户端强制 TLS
tls-auth-clients yes
生成自签名证书(测试):
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout redis.key -out redis.crt -subj "/CN=redis"
生产推荐:使用 Let’s Encrypt 或企业 CA。
2.5 主从复制安全
# 主节点
requirepass MasterPass123
masterauth MasterPass123
# 从节点
replica-read-only yes
masterauth MasterPass123
Redis 7+ 复制 TLS:
tls-replication yes
2.6 禁用模块加载(防 RCE)
# redis.conf
loadmodule "" # 禁止所有模块
# 或仅允许信任模块
# loadmodule /usr/lib/redis/modules/safe.so
恶意模块(如
exp.so)可直接system.exec。
2.7 日志与监控
loglevel notice
logfile /var/log/redis/redis.log
关键监控项:
redis-cli INFO | grep -E "connected_clients|rejected|cmdstat_config"
推荐工具:
- Prometheus + redis_exporter
- Zabbix / Datadog
- Falco:检测
EVAL,CONFIG SET dir,MODULE LOAD
2.8 文件系统安全
chown redis:redis /var/lib/redis/ -R
chmod 700 /var/lib/redis/
chmod 600 /etc/redis/redis.conf
防止写壳:
dir /var/lib/redis/
dbfilename dump.rdb
# 确保 dir 不可被 redis 用户外部写入
3. 安全配置模板(redis.conf)
# === 网络 ===
bind 127.0.0.1
protected-mode yes
port 6379
timeout 300
# === 认证 ===
requirepass {{STRONG_PASSWORD}}
aclfile /etc/redis/users.acl
# === 危险命令 ===
rename-command CONFIG ""
rename-command FLUSHALL ""
rename-command EVAL ""
rename-command SCRIPT ""
# === TLS ===
tls-port 6379
port 0
tls-cert-file /etc/redis/tls/redis.crt
tls-key-file /etc/redis/tls/redis.key
tls-ca-cert-file /etc/redis/tls/ca.crt
tls-auth-clients yes
# === 复制 ===
masterauth {{STRONG_PASSWORD}}
replica-read-only yes
tls-replication yes
# === 持久化 ===
save 900 1
save 300 10
save 60 10000
# === 其他 ===
maxmemory 2gb
maxmemory-policy allkeys-lru
4. 安全扫描与验证
4.1 本地自检脚本
#!/bin/bash
echo "=== Redis 安全检查 ==="
redis-cli INFO server | grep "tcp_port"
redis-cli INFO stats | grep rejected
redis-cli ACL LIST
redis-cli CONFIG GET requirepass
redis-cli CONFIG GET bind
redis-cli CONFIG GET protected-mode
4.2 外部扫描
# nmap 检测暴露
nmap -p 6379 --script redis-info <IP>
# redis-cli 尝试未授权
redis-cli -h <IP> INFO
5. 应急响应:已暴露怎么办?
5.1 立即隔离
iptables -A INPUT -p tcp --dport 6379 -j DROP
systemctl stop redis
5.2 检查入侵痕迹
# 1. 检查 CONFIG 被改
redis-cli CONFIG GET dir
redis-cli CONFIG GET dbfilename
# 2. 检查异常 key
redis-cli --scan --pattern "*crontab*"
redis-cli --scan --pattern "*ssh*"
# 3. 检查日志
grep -i "config set" /var/log/redis/redis.log
5.3 常见后门特征
| 特征 | 检查命令 |
|---|---|
| 写 crontab | redis-cli KEYS "*crontab*" |
| 写 SSH 公钥 | redis-cli GET user |
| 恶意模块 | redis-cli MODULE LIST |
| 异常 EVAL | redis-cli SLOWLOG GET 10 |
6. 最佳实践清单(Checklist)
| 项目 | 检查 |
|---|---|
| 仅内网访问 | bind 127.0.0.1 或 VPC |
| 强密码 + ACL | requirepass + users.acl |
| 禁用危险命令 | rename-command CONFIG "" |
| 启用 TLS | tls-port 6379, port 0 |
| 从库只读 | replica-read-only yes |
| 文件权限 | 700 /var/lib/redis |
| 监控告警 | rejected_connections |
| 定期轮转密码 | ACL SETUSER newpass |
7. 工具推荐
| 工具 | 用途 |
|---|---|
| redis-cli –tls | 安全连接 |
| redis-check-aof/rdb | 备份校验 |
| RedLock | 分布式锁安全 |
| Redis Sentinel + TLS | 高可用安全 |
| Redis Enterprise | 企业级 RBAC + Audit |
8. 小结
Redis 安全 = 网络隔离 + 认证 + 命令控制 + 加密传输
生产必做:
- 绝不暴露 6379 到公网
- 必须启用
requirepass+ ACL - 必须禁用
CONFIG/EVAL - 必须启用 TLS
- 必须监控
rejected和slowlog
需要 Docker / Kubernetes 安全配置、Redis Enterprise RBAC、或 自动化安全加固 Ansible 脚本?随时告诉我!