2. Redis访问控制模型

Redis的访问控制并不是一开始就具备完整的用户与权限体系。早期版本只有一条口令,所有客户端共享同一把钥匙;从Redis 6.0开始引入ACL(Access Control List),才真正形成“用户—规则—权限”的模型。理解这条演进路径,有助于判断在什么场景下用requirepass足够,在什么场景下必须升级到ACL v2。

一、认证机制:从单一口令到多用户认证

最基础的认证方式是requirepass。在redis.conf中写入:

requirepass S3cureP@ss_2024

客户端连接后必须先执行AUTH S3cureP@ss_2024,否则除少数命令外都会被拒绝。它的本质是“全局共享口令”:只要知道口令,就拥有该实例的全部命令权限。这种方式配置简单,但无法区分调用方,也无法限制某个客户端只能读、不能写。

Redis 6.0之后,认证升级为“用户名+口令”的形式:

AUTH app_reader R3adOnly#2024

此时认证对象不再是实例,而是具体用户。默认用户default仍然存在,若未显式关闭,它可能保留较高权限,因此生产环境通常需要重新约束default。

二、ACL规则:用户、权限与键空间

ACL的核心是“一个用户对应一组规则”。规则通过ACL SETUSER定义,主要包含四类约束:

  • 认证方式:on/off启用或禁用用户,>password设置口令,nopass表示免密。
  • 命令权限:+get允许GET,-set禁止SET,+@read允许读命令组,allcommands表示全部命令。
  • 键空间权限:~app:*表示只能访问以app:开头的键,allkeys表示所有键。
  • 频道权限:&notify:*限制Pub/Sub可用的频道。

例如,创建一个只读用户:

ACL SETUSER app_reader on >R3adOnly#2024 ~app:* +@read -@write

这条规则的含义是:启用app_reader,口令为R3adOnly#2024,只能访问app:前缀的键,允许读命令组,禁止写命令组。若客户端尝试执行SET app:name redis,会收到NOPERM错误,提示该用户没有执行该命令的权限。

三、用户与权限模型:默认用户与自定义用户

Redis ACL中存在一个特殊用户default。在未配置ACL时,所有连接都以default身份运行,拥有全部权限。引入ACL后,建议将default降权,例如:

ACL SETUSER default off

这样未认证连接将无法执行任何命令。随后为不同角色建立独立用户,例如运维用户、应用读写用户、监控只读用户。权限模型可以概括为“用户绑定规则,规则决定命令、键和频道范围”。

ACL规则支持继承与组合。使用+@read这类命令组可以快速授权,再用-@dangerous排除高危命令。常见的高危命令包括FLUSHALL、KEYS、CONFIG、SHUTDOWN等,生产环境应通过ACL显式禁止普通应用用户调用。

四、ACL v2的演进与适用边界

Redis 6.0的ACL v1已经支持用户、命令和键空间控制;Redis 7.0进一步引入ACL v2,主要增强包括:更细粒度的命令子命令控制、选择器(selector)机制、以及更灵活的权限组合。选择器允许一个用户拥有多组“命令+键”规则,例如:

ACL SETUSER app_multi on >P@ss2024 (~app:* +@read) (~cache:* +@write)

这表示app_multi在app:键上只读,在cache:键上可写。ACL v2让权限模型从“单一平面”变为“多选择器叠加”,更适合多租户或复杂业务隔离。

适用边界方面:如果只是单应用、单团队、无多租户需求,requirepass加网络隔离已经足够;如果需要区分读写角色、限制键空间、审计不同调用方,应使用ACL v1;如果存在多业务共享实例、需要按前缀隔离读写权限,则应使用ACL v2的选择器能力。需要注意的是,ACL只解决“谁能执行什么”,不解决传输加密和网络暴露问题,仍需配合TLS、防火墙和最小权限原则。

Redis访问控制模型演进 阶段一:requirepass 单一全局口令 所有客户端共享权限 无法区分用户与角色 边界:单应用、可信网络 阶段二:ACL v1(6.0) 用户名 + 口令认证 命令组 + 键空间 + 频道 default用户可降权 边界:读写角色分离 阶段三:ACL v2(7.0) 选择器(selector)机制 多组命令+键规则叠加 子命令级细粒度控制 边界:多租户、前缀隔离 ACL规则四要素 认证 on / off >password / nopass 命令权限 +get / -set +@read / -@dangerous 键空间 ~app:* allkeys 频道 &notify:* allchannels 用户—权限映射示例 app_reader ~app:* +@read -@write app_writer ~app:* +@read +@write app_multi (~app:* +@read)(~cache:* +@write)

五、实践中的判断依据

判断是否已经正确落地ACL,可以观察几个信号:使用ACL LIST查看用户规则是否符合预期;使用ACL WHOAMI确认当前连接身份;尝试越权命令时是否返回NOPERM;default用户是否已关闭或降权。若这些检查都通过,说明访问控制模型已经生效。

ACL规则修改后可通过ACL SAVE持久化到配置文件,否则重启后可能丢失。生产环境建议将ACL规则写入aclfile并纳入版本管理。

总体来看,Redis访问控制模型的核心是“认证身份、限定命令、约束键空间、隔离频道”。从requirepass到ACL v2,能力不断增强,但复杂度也随之上升。选择哪种方式,取决于业务是否需要区分调用方、是否需要按前缀隔离权限,以及是否处于多租户共享实例的场景。