如何保护 Redis 安装:关键配置技巧

确保您高性能的 Redis 安装能够抵御未经授权的访问和数据丢失。本指南提供了关键的操作性、分步配置技巧,重点关注网络隔离、身份验证和操作最佳实践。了解如何使用 `bind` 指令限制访问、实现强密码保护(`requirepass` 或 ACL)、禁用危险命令以及保护持久化文件。对于在任何生产环境中安全部署 Redis,这都是必读内容。

33 浏览量

如何保护 Redis 安装:关键配置技巧

Redis 是一个强大、高性能的内存数据存储,常用于缓存、会话管理和消息代理。由于其速度和简洁性,默认的 Redis 配置通常是为开发环境优化的——它优先考虑易用性而非严格的安全性。

然而,将未受保护的 Redis 实例暴露到互联网甚至未分段的内部网络,都可能导致灾难性的数据泄露、数据丢失(通过 FLUSHALL)甚至远程代码执行(通过持久化文件操作)。保护您的生产环境 Redis 部署是不可或缺的。本指南详细介绍了用于有效锁定 Redis 服务器的基本、可操作的配置步骤。


1. 网络配置:限制暴露范围

最直接有效的安全措施是控制 Redis 监听的网络接口。默认情况下,Redis 通常绑定到所有可用接口 (0.0.0.0),使其可能从任何地方访问。

绑定到特定接口 (bind)

您必须配置 Redis 仅监听必要的接口。在大多数生产环境中,这意味着仅绑定到环回地址或应用程序服务器使用的特定私有 IP 地址。

仅内部或本地访问

如果您的应用程序服务器与 Redis 位于同一主机上,请仅绑定到环回地址。

# redis.conf 配置片段
bind 127.0.0.1

网络私有访问

如果您的应用程序服务器位于私有网络段(例如后端子网)并需要网络访问,请绑定到该特定的私有 IP 地址。切勿在没有稳健防火墙规则的情况下绑定到面向公共互联网的 IP。

# 列出应访问 Redis 的特定内部 IP 地址
bind 192.168.1.100 10.0.0.5

理解保护模式 (Protected Mode)

自 Redis 3.2 以来,保护模式 (Protected Mode) 默认启用。如果服务器在没有密码 (requirepass) 且绑定到公共接口的情况下运行,此模式会阻止来自任何外部客户端的连接。虽然有帮助,但仅依赖保护模式是不够的;请始终同时执行绑定限制和身份验证。

如果您必须为特定配置禁用它,可以使用:

protected-mode no

⚠️ 警告: 仅当您正确配置了 bindrequirepass 时才禁用 protected-mode。否则,您的 Redis 实例将完全暴露。

2. 身份验证和访问控制

网络访问受到限制后,下一层防御是身份验证。客户端只有在提供有效密码或(最好是)使用现代访问控制列表 (ACL) 系统时才能与 Redis 交互。

实施密码保护 (requirepass)

redis.conf 文件中使用 requirepass 指令来强制执行客户端身份验证。这充当了基本安全所需的全局共享密钥。

# 设置一个强大、唯一的密码
requirepass T4h!S_Is_V3ry_S3cure_P@ss

要使用密码连接,客户端必须使用 AUTH 命令:

# 使用 redis-cli 的示例
$ redis-cli
127.0.0.1:6379> AUTH T4h!S_Is_V3ry_S3cure_P@ss
OK
127.0.0.1:6379> PING
PONG

高级安全:Redis 访问控制列表 (ACLs)

对于运行 Redis 6.0 及更高版本的生产环境,ACLs 是首选的身份验证方法。ACL 允许您定义具有特定密码和精细权限的多个用户(例如,用户 A 只读,用户 B 可以写入特定键空间)。

ACL 配置通常涉及在 redis.conf 或单独的 ACL 文件中定义用户及其规则:

# ACL 用户定义的示例(在 redis.conf 或 aclfile 中)
user default on # 默认用户已启用
user app_reader on >app_read_P@ss ~cache:* +get +scan
user app_writer on >app_write_P@ss ~data:* +set +del

重命名或禁用危险命令

某些管理命令(如 FLUSHALLCONFIGKEYSSHUTDOWN)如果使用不当,可能会导致操作中断或泄露敏感配置信息。最佳实践是重命名这些命令为晦涩的名称或完全禁用它们。

要重命名命令,请使用 rename-command

# 重命名 CONFIG 命令以防止未经授权的更改
rename-command CONFIG HIDE_MY_CONFIG

# 完全禁用 FLUSHALL
rename-command FLUSHALL ""

3. 操作安全最佳实践

除了 Redis 内部配置之外,实施强大的外部操作安全措施对于完整的安全态势至关重要。

实施严格的防火墙规则

无论 bind 指令的设置如何,始终使用云安全组、iptables 或类似的防火墙解决方案来强制执行网络过滤。Redis 默认端口 (6379) 仅应对您受信任的应用程序服务器的特定 IP 地址或 IP 范围开放。

示例防火墙规则 (Linux/iptables)

仅允许来自已知应用程序服务器 IP (192.168.1.50) 对 6379 端口的传入流量:

# 默认拒绝所有传入到 6379 端口的流量
iptables -A INPUT -p tcp --dport 6379 -j DROP

# 允许特定应用程序服务器
iptables -A INPUT -p tcp -s 192.168.1.50 --dport 6379 -j ACCEPT

以最小权限运行

绝不要以 root 用户身份运行 Redis 服务器进程。如果攻击者攻陷了 Redis 进程,以 root 身份运行将授予他们对整个操作系统的完全控制权。

创建一个专用的、非特权的系统用户(例如 redis),并配置操作系统和 Redis 初始化脚本以在该用户下运行服务器。Redis 配置可以使用 user 指令强制执行此操作(尽管通常由系统设置处理):

# 确保 Redis 进程在受限用户下运行(推荐系统级配置)
user redis

保护配置文件和持久化

redis.conf 文件包含敏感信息,如 requirepass 密码和网络设置。确保此文件以及持久化文件(RDB 快照和 AOF 日志)受到严格的文件权限保护,防止其他系统用户未经授权的读取或修改。

# 推荐的权限示例
# 只有 'redis' 用户和 root 才能读/写
chown redis:redis /etc/redis/redis.conf
chmod 600 /etc/redis/redis.conf

实施 SSL/TLS 加密

在 Redis 流量穿过不受信任的网络段(即使在内部)的环境中,实施 SSL/TLS 加密。虽然 Redis 历史上缺乏原生的 TLS 支持,但现代版本(从 Redis 6 开始)已完全支持它。配置 TLS 需要生成证书并在 redis.conf 中设置相关指令:

# 启用 TLS
tls-port 6379
tls-auth-clients yes
tls-cert-file /etc/redis/tls/redis.crt
tls-key-file /etc/redis/tls/redis.key

关键安全步骤总结

保护 Redis 安装需要一个分层的方法。通过应用这些基础步骤,您可以显著减少攻击面并保护您宝贵的内存数据:

  1. 限制网络访问: 使用 bind 127.0.0.1 或特定的私有 IP。
  2. 强制身份验证: 使用 requirepass(基础)或 ACLs(高级)。
  3. 加固命令: 禁用或重命名危险的管理命令(FLUSHALLCONFIG)。
  4. 使用防火墙: 仅允许来自受信任的应用程序服务器对 6379 端口的流量。
  5. 最小权限原则: 以非 root、专用的用户身份运行 Redis 进程。
  6. 加密流量: 在适当的情况下,为网络连接启用 SSL/TLS。