Redis 安全最佳实践详解从 ACL 到 TLS

一、Redis 的安全模型设计理念

Redis 的设计初衷是运行在受信任网络内部环境中,这意味着它本身并没有提供强加密或复杂权限机制作为默认配置。Redis 默认假设客户端已经在可信环境内运行,例如:

  • 内部微服务通过 Redis 实例进行通信;
  • 应用服务器通过 127.0.0.1 或私有网段访问 Redis;
  • 外部用户访问 Redis 的所有行为需通过后端服务“代理”完成。

在这种模式下,Redis 的安全重心落在了隔离与防护外部连接上。

二、网络层防护:保护 Redis 的第一道防线

1. 限制绑定 IP 地址

默认情况下,Redis 会监听所有网络接口。如果服务器对外开放端口(如公网云服务器),将存在巨大风险。最安全的做法是通过配置文件 redis.conf 限制 Redis 只监听本地回环地址:

bind 127.0.0.1

这样即使 Redis 服务正在运行,外部网络也无法直接访问。

2. 配置防火墙规则

可通过 iptables 或云防火墙限制外部 IP 对 Redis 端口(默认 6379)的访问。例如:

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

三、受保护模式(Protected Mode)

从 Redis 3.2 开始,为了减少用户错误配置导致的安全事故,引入了受保护模式(Protected Mode)。其触发条件为:

  • Redis 绑定到 0.0.0.0(所有接口);
  • 没有配置 requirepass 或 ACL 密码。

此时 Redis 将拒绝非本地连接,并返回警告提示。除非用户手动禁用该模式:

protected-mode no

但不推荐在没有身份验证和网络隔离的前提下关闭该功能。

四、身份认证:两种机制的对比

1. 传统密码验证(requirepass

redis.conf 中添加如下配置启用:

requirepass 超长随机密码

客户端需要使用:

AUTH 超长随机密码

缺点:

  • 所有客户端共用一个密码;
  • 无法区分权限级别;
  • 密码以明文形式存储,且 AUTH 命令也非加密。

2. Redis 6+ 引入的 Access Control List(ACL)

ACL 是更推荐的方式,支持创建多个用户、分配不同命令权限。例如:

ACL SETUSER readonly on >readonly123 ~* +get +info
ACL SETUSER admin on >admin456 ~* +@all
  • +get: 允许 GET 命令
  • ~*: 所有 key 模式
  • >xxx: 设置密码

客户端可以用用户名登录:

AUTH readonly readonly123

优势:

  • 支持精细权限控制;
  • 可以禁用敏感命令;
  • 多用户独立管理。

五、TLS 支持:Redis 加密通信的保障

从 Redis 6 开始,正式支持 TLS 加密,包括:

  • 客户端连接
  • 主从复制通信
  • 集群内部通信(Cluster bus)

通过如下配置启用:

tls-port 6379
port 0
tls-cert-file /path/to/redis.crt
tls-key-file /path/to/redis.key
tls-ca-cert-file /path/to/ca.crt

然后客户端使用 TLS 协议连接:

redis-cli --tls \
  --cert /path/to/client.crt \
  --key /path/to/client.key \
  --cacert /path/to/ca.crt

六、命令管控:防止危险操作

虽然已被 ACL 替代,但 Redis 仍保留了通过 rename-command 对命令改名或禁用的能力:

rename-command FLUSHALL ""
rename-command CONFIG "d41d8cd98f00b204e9800998ecf8427e"
  • 禁用 FLUSHALL
  • CONFIG 改为难以猜测的命令名

适用于托管服务或限制控制权限的场景。

七、恶意输入攻击防护机制

Redis 采用随机哈希种子防止 Hash 碰撞攻击。此外:

  • SORT 命令虽基于快速排序(qsort),但在极端输入下可能退化为 O(N²),应避免对大列表执行未加限制的排序;
  • 协议为“长度前缀 + 二进制”,天然防注入;
  • Lua 脚本中拼接字符串时需谨慎,避免信任外部拼接代码逻辑。

八、最小权限原则与系统安全

  • 永远不要以 root 用户运行 Redis;
  • 创建专属用户:
adduser --system --no-create-home --disabled-login redis
chown redis:redis /var/lib/redis
  • 启动服务时使用 --user redis 或通过 systemd 配置运行用户;
  • 禁止 Redis 写入任意路径(避免使用 CONFIG 改动工作目录 + RDB 文件名组合写文件);

九、总结与最佳实践建议

安全措施 建议
网络访问控制 使用 bind 限制监听地址 + 防火墙
身份认证机制 使用 ACL 管理多个用户 + 权限分离
命令限制 禁用 CONFIGFLUSHALL 等危险命令
通信加密 启用 TLS 支持
系统权限管理 redis 非特权用户运行
防范攻击性输入 避免过大数据操作,限制用户行为
文件访问与路径限制 不授予 Redis 写任意目录的能力

十、参考资源

  • Redis 官方安全文档
  • Redis University 安全课程
  • Redis GPG 公钥:用于提交安全漏洞报告

你可能感兴趣的:(运维,缓存技术,redis,安全,bootstrap)