Redis 配置密码:从入门到精通
Redis 作为一款高性能的内存数据库,在现代应用中扮演着至关重要的角色。然而,其默认配置通常不包含密码保护,这意味着任何能够连接到 Redis 服务器的客户端都可以不受限制地访问和操作数据。为了防止未经授权的访问和潜在的数据泄露,正确配置 Redis 密码是确保数据安全的首要步骤。
本文将从最基础的 requirepass 配置入手,逐步深入探讨 Redis 6.0 引入的更高级的访问控制列表(ACL)功能,并提供一系列安全最佳实践,帮助您全面掌握 Redis 的密码配置和安全防护。
1. 基础密码配置:requirepass
requirepass 是 Redis 提供的一种简单有效的密码保护机制。当设置了 requirepass 后,客户端在执行任何命令之前必须先通过 AUTH 命令进行身份验证。
1.1 通过 redis.conf 文件配置 (持久化)
这是设置 Redis 密码最常用且推荐的方式,配置更改后需要重启 Redis 服务才能生效。
- 找到
redis.conf文件:
通常位于 Redis 安装目录下,例如/etc/redis/redis.conf或/usr/local/etc/redis.conf。 - 编辑配置文件:
使用文本编辑器打开redis.conf文件,查找requirepass配置项。它通常被注释掉,并带有一个示例密码foobared。
conf
# requirepass foobared - 设置密码:
取消requirepass前的注释#,并将foobared替换为您自己的强密码。
conf
requirepass YourStrongPasswordHere
重要提示: 密码应足够长且复杂,包含大小写字母、数字和特殊字符,以有效防止暴力破解。 - 保存并关闭文件。
- 重启 Redis 服务:
根据您的操作系统和安装方式,可以使用以下命令重启 Redis:
bash
sudo systemctl restart redis # 对于 systemd 系统
# 或者
sudo service redis restart # 对于 SysVinit 系统
# 或者
redis-cli shutdown
redis-server /path/to/redis.conf
1.2 通过 CONFIG SET 命令配置 (临时生效)
您也可以在 Redis 运行时动态设置密码。但请注意,这种方式是临时的,当 Redis 服务重启后,密码将失效,除非您将其保存到配置文件中。
- 连接到 Redis 客户端:
bash
redis-cli - 设置密码:
bash
CONFIG SET requirepass YourTemporaryPassword
执行此命令后,密码会立即生效。 - 使更改持久化 (可选但推荐):
如果您希望动态设置的密码在重启后依然有效,需要使用CONFIG REWRITE命令将当前配置写入redis.conf文件。
bash
CONFIG REWRITE
注意:CONFIG REWRITE会将当前运行配置写入redis.conf,这可能会覆盖您手动添加的其他注释或格式。
1.3 客户端认证
设置密码后,客户端在执行任何命令之前都需要进行身份验证。
- 连接时指定密码:
bash
redis-cli -a YourStrongPasswordHere - 连接后认证:
如果先连接再认证,或者密码错误,Redis 会返回NOAUTH Authentication required错误。
bash
redis-cli
AUTH YourStrongPasswordHere
如果认证成功,将返回OK。
2. 安全最佳实践
仅仅设置密码不足以完全保护 Redis。以下是一些额外的安全措施,建议与密码配置一同使用:
- 使用强密码: 确保
requirepass设置的密码足够复杂,难以猜测和暴力破解。避免使用常见密码、个人信息或字典词汇。 - 限制网络绑定 (Bind): 默认情况下,Redis 可能监听所有网络接口(
0.0.0.0),这可能导致服务器对外开放。为了安全,应将其绑定到特定的 IP 地址,例如127.0.0.1(仅限本地访问)或内网 IP。
在redis.conf中设置:
conf
bind 127.0.0.1
# 或者
bind 192.168.1.100 - 配置防火墙规则: 使用防火墙(如
iptables、firewalld或云服务商的安全组)限制只有受信任的 IP 地址和端口才能访问 Redis 端口(默认为 6379)。这是网络层面的第一道防线。 - 启用保护模式 (Protected Mode): 从 Redis 3.2 开始,引入了保护模式。如果 Redis 绑定到
0.0.0.0且未设置密码,它将拒绝非本地连接。除非您有充分的理由并已采取其他安全措施,否则不建议禁用此模式。
在redis.conf中设置:
conf
protected-mode yes - 禁用或重命名危险命令: 某些命令(如
FLUSHALL、KEYS、CONFIG)在生产环境中可能非常危险,不当使用可能导致数据丢失或系统配置泄露。您可以禁用它们或将其重命名为难以猜测的名称。
在redis.conf中设置:
conf
rename-command FLUSHALL "" # 禁用 FLUSHALL
rename-command CONFIG my_secret_config_command # 重命名 CONFIG - 定期轮换密码: 定期更换 Redis 密码,并审计访问日志,及时发现和应对潜在的安全风险。
3. 高级密码管理:Redis ACL (Access Control List) – Redis 6.0+
Redis 6.0 及更高版本引入了访问控制列表(ACL)功能,提供了更细粒度的权限控制,允许您创建多个用户,并为每个用户定义不同的命令执行权限和键访问模式。
3.1 什么是 ACL?
ACL 允许您为不同的客户端连接分配不同的用户身份,每个用户可以拥有独立的密码和权限集。这解决了传统 requirepass 只能设置一个全局密码,所有客户端共享相同权限的问题,极大地增强了 Redis 的安全性。
3.2 默认用户 (default)
在 Redis 6.0+ 中,即使启用了 ACL,requirepass 仍然有效,但它现在是为名为 default 的用户设置密码。
default 用户在默认情况下是开启的(on),没有密码(nopass),可以访问所有键(~*)并执行所有命令(+@all)。为了安全,强烈建议为 default 用户设置一个强密码,或者创建一个具有受限权限的新用户,并禁用 default 用户。
3.3 配置 ACL
ACL 可以通过 redis.conf 文件、独立的 ACL 文件或运行时 ACL 命令进行配置。
3.3.1 通过 redis.conf 或 aclfile 配置
您可以在 redis.conf 中直接定义用户,或者指定一个外部的 ACL 文件。
在 redis.conf 中定义用户示例:
“`conf
定义一个只读用户
user readonly_user on >password123 ~* +@read
定义一个管理员用户
user admin_user on >adminpassword456 ~* +@all
“`
使用 aclfile (推荐复杂场景):
在 redis.conf 中指定一个 ACL 文件路径:
conf
aclfile /etc/redis/users.acl
然后,在 /etc/redis/users.acl 文件中定义用户:
acl
user readonly_user on >password123 ~* +@read
user admin_user on >adminpassword456 ~* +@all
当使用 aclfile 时,Redis 启动时会加载该文件中的 ACL 规则。您可以使用 ACL LOAD 命令重新加载 ACL 文件。
3.3.2 通过 ACL 命令配置 (运行时)
您可以在 Redis 客户端中使用 ACL 命令来管理用户。
- 创建/修改用户:
bash
ACL SETUSER new_user on >new_password ~keyspace:* +get +set
这条命令创建了一个名为new_user的用户,密码为new_password,可以访问keyspace:前缀的键,并执行GET和SET命令。 - 列出所有用户及其规则:
bash
ACL LIST
这将显示所有已配置的 ACL 用户及其权限。 - 获取特定用户的信息:
bash
ACL GETUSER new_user - 保存 ACL 规则:
如果您通过ACL命令修改了规则,并且希望这些更改在 Redis 重启后依然有效,需要使用ACL SAVE命令将其保存到aclfile中(如果已配置aclfile)。
bash
ACL SAVE
3.4 ACL 规则语法
ACL 规则使用一种领域特定语言 (DSL) 来定义用户的权限。
user <username>: 定义用户。on/off: 启用或禁用用户。nopass: 用户无需密码即可连接。>password: 设置用户的密码。密码前缀>表示明文密码。#<hashed_password>: 设置用户的哈希密码。~<pattern>: 允许用户访问匹配<pattern>的键。~*表示所有键。+<command>: 允许用户执行指定的命令。+@all允许所有命令。-<command>: 禁止用户执行指定的命令。@<category>: 允许或禁止一类命令,例如@read(只读命令)、@write(写入命令)、@admin(管理命令)、@dangerous(危险命令)。
示例:
acl
user guest on >guestpass ~data:* +get +hget +lrange
user monitor on >monitorpass ~* +info +monitor +slowlog
3.5 客户端使用 ACL 认证
当使用 ACL 时,客户端认证命令 AUTH 扩展为支持用户名和密码:
bash
AUTH <username> <password>
例如:
bash
redis-cli
AUTH admin_user adminpassword456
总结
从入门级的 requirepass 到高级的 ACL,Redis 提供了多种密码配置和安全增强机制。对于简单的应用场景,requirepass 结合网络层防护已足够。对于需要多用户、细粒度权限控制的复杂系统,Redis ACL 提供了强大而灵活的解决方案。
无论选择哪种方式,始终遵循安全最佳实践至关重要:使用强密码、限制网络绑定、配置防火墙、启用保护模式、禁用或重命名危险命令,并定期轮换密码。通过综合运用这些措施,您可以大大提高 Redis 部署的安全性,确保数据在高速运行的同时得到充分的保护。