如何保护 Redis 安装:关键配置技巧
通过网络绑定、保护模式、ACL或密码、更安全的命令访问、防火墙规则、最小权限和TLS来保护Redis。
如何保护Redis安装:基本配置技巧
Redis快速、简单,常被应用程序代码用于会话数据、队列、计数器和缓存记录。这使得Redis的安全性变得重要:一个暴露的实例可能让攻击者读取数据、使用FLUSHALL删除键,或滥用管理命令。
你的目标是让Redis仅对需要它的系统可访问,要求身份验证,减少危险命令的访问,并保护保存配置和持久化数据的文件。
1. 网络配置:限制暴露
最直接的安全措施是控制Redis监听的网络接口。许多打包的Redis安装默认绑定到localhost,但容器镜像、自定义配置文件和旧版部署可能不同。始终检查你活跃的redis.conf,而不是假设默认设置是安全的。
绑定到特定接口(bind)
你必须配置Redis仅监听必要的接口。在大多数生产环境中,这意味着仅绑定到回环地址或应用服务器使用的特定私有IP地址。
仅限内部或本地访问
如果你的应用服务器与Redis位于同一主机,请仅绑定到回环地址。
# redis.conf 配置片段
bind 127.0.0.1
网络私有访问
如果你的应用服务器位于私有网络段并需要网络访问,请绑定到该特定私有IP地址。不要将Redis绑定到面向公共互联网的IP。如果需要远程访问,将其放在私有网络上,并通过防火墙规则或安全组限制流量。
# 列出应访问Redis的特定内部IP地址
bind 192.168.1.100 10.0.0.5
理解保护模式
自Redis 3.2起,标准Redis构建中默认启用保护模式。当Redis未明确配置为远程客户端时,它有助于阻止外部访问。将其视为安全网,而非主要控制手段。使用绑定限制、身份验证和防火墙规则。
如果必须为特定配置禁用它,可以使用:
protected-mode no
警告: 仅在正确配置了
bind、身份验证和网络过滤后,才禁用protected-mode。
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访问控制列表(ACL)
对于运行Redis 6.0及更高版本的生产环境,ACL是首选的身份验证方法。ACL允许你定义具有特定密码和细粒度权限的多个用户(例如,用户A只能读取,用户B可以写入特定键空间)。
ACL配置通常涉及在redis.conf或单独的ACL文件中定义用户及其规则:
# redis.conf或aclfile中的示例ACL用户定义
user default off
user app_reader on >app_read_P@ss ~cache:* +get +scan
user app_writer on >app_write_P@ss ~data:* +set +del
重命名或禁用危险命令
某些管理命令(如FLUSHALL、CONFIG、KEYS和SHUTDOWN)如果被滥用,可能导致操作中断或暴露敏感配置细节。最佳实践是将这些命令重命名为晦涩的名称或完全禁用它们。
要重命名命令,请使用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传入流量:
# 允许特定应用服务器
iptables -A INPUT -p tcp -s 192.168.1.50 --dport 6379 -j ACCEPT
# 拒绝其他传入的Redis流量
iptables -A INPUT -p tcp --dport 6379 -j DROP
以最小权限运行
永远不要以root用户身份运行Redis服务器进程。如果攻击者攻破Redis进程,以root身份运行将使他们完全控制整个操作系统。
创建一个专用的非特权系统用户,如redis,然后配置你的服务管理器以该用户身份运行Redis进程。使用systemd时,这通常通过单元文件中的User=redis和Group=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
port 0
tls-auth-clients yes
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
port 0禁用明文监听器。仅当每个使用它的客户端位于受信任的本地路径且你有明确理由时,才保留明文端口。
基本安全步骤总结
保护Redis安装是一个分层的工作。从暴露开始,然后是身份验证,最后是操作控制:
- 限制网络访问: 使用
bind 127.0.0.1或特定私有IP。 - 强制身份验证: 使用
requirepass(基本)或ACL(高级)。 - 强化命令: 禁用或重命名危险的管理命令(
FLUSHALL、CONFIG)。 - 使用防火墙: 仅允许来自受信任应用服务器的端口6379流量。
- 最小权限: 以非root专用用户身份运行Redis进程。
- 加密流量: 在适当的情况下为网络连接启用SSL/TLS。