Redis 配置密码:从入门到精通 – wiki基地

Redis 配置密码:从入门到精通

Redis 作为一款高性能的内存数据库,在现代应用中扮演着至关重要的角色。然而,其默认配置通常不包含密码保护,这意味着任何能够连接到 Redis 服务器的客户端都可以不受限制地访问和操作数据。为了防止未经授权的访问和潜在的数据泄露,正确配置 Redis 密码是确保数据安全的首要步骤。

本文将从最基础的 requirepass 配置入手,逐步深入探讨 Redis 6.0 引入的更高级的访问控制列表(ACL)功能,并提供一系列安全最佳实践,帮助您全面掌握 Redis 的密码配置和安全防护。

1. 基础密码配置:requirepass

requirepass 是 Redis 提供的一种简单有效的密码保护机制。当设置了 requirepass 后,客户端在执行任何命令之前必须先通过 AUTH 命令进行身份验证。

1.1 通过 redis.conf 文件配置 (持久化)

这是设置 Redis 密码最常用且推荐的方式,配置更改后需要重启 Redis 服务才能生效。

  1. 找到 redis.conf 文件:
    通常位于 Redis 安装目录下,例如 /etc/redis/redis.conf/usr/local/etc/redis.conf
  2. 编辑配置文件:
    使用文本编辑器打开 redis.conf 文件,查找 requirepass 配置项。它通常被注释掉,并带有一个示例密码 foobared
    conf
    # requirepass foobared
  3. 设置密码:
    取消 requirepass 前的注释 #,并将 foobared 替换为您自己的强密码。
    conf
    requirepass YourStrongPasswordHere

    重要提示: 密码应足够长且复杂,包含大小写字母、数字和特殊字符,以有效防止暴力破解。
  4. 保存并关闭文件。
  5. 重启 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 服务重启后,密码将失效,除非您将其保存到配置文件中。

  1. 连接到 Redis 客户端:
    bash
    redis-cli
  2. 设置密码:
    bash
    CONFIG SET requirepass YourTemporaryPassword

    执行此命令后,密码会立即生效。
  3. 使更改持久化 (可选但推荐):
    如果您希望动态设置的密码在重启后依然有效,需要使用 CONFIG REWRITE 命令将当前配置写入 redis.conf 文件。
    bash
    CONFIG REWRITE

    注意: CONFIG REWRITE 会将当前运行配置写入 redis.conf,这可能会覆盖您手动添加的其他注释或格式。

1.3 客户端认证

设置密码后,客户端在执行任何命令之前都需要进行身份验证。

  1. 连接时指定密码:
    bash
    redis-cli -a YourStrongPasswordHere
  2. 连接后认证:
    如果先连接再认证,或者密码错误,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
  • 配置防火墙规则: 使用防火墙(如 iptablesfirewalld 或云服务商的安全组)限制只有受信任的 IP 地址和端口才能访问 Redis 端口(默认为 6379)。这是网络层面的第一道防线。
  • 启用保护模式 (Protected Mode): 从 Redis 3.2 开始,引入了保护模式。如果 Redis 绑定到 0.0.0.0 且未设置密码,它将拒绝非本地连接。除非您有充分的理由并已采取其他安全措施,否则不建议禁用此模式。
    redis.conf 中设置:
    conf
    protected-mode yes
  • 禁用或重命名危险命令: 某些命令(如 FLUSHALLKEYSCONFIG)在生产环境中可能非常危险,不当使用可能导致数据丢失或系统配置泄露。您可以禁用它们或将其重命名为难以猜测的名称。
    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.confaclfile 配置

您可以在 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: 前缀的键,并执行 GETSET 命令。
  • 列出所有用户及其规则:
    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 部署的安全性,确保数据在高速运行的同时得到充分的保护。

滚动至顶部