redis 7.4 多租户 acl 隔离需关闭 default 用户、显式定义租户用户并配置 aclfile;租户 key 权限通过 ~tenant_a:* 前缀模式控制,非 db 隔离;aclfile 每行以 user 开头、密码紧贴 >、单行完整、路径需在 redis.conf 明确指定;从节点须配置 masteruser 和 masterauth 才能同步认证;acl 规则顺序敏感,影响最终权限。

Redis 7.4 支持多租户 ACL,但必须关闭 default 用户、显式定义每个租户用户,并通过 aclfile 加载配置 —— 否则所有连接仍走默认超级权限,形同虚设。
怎么让每个租户只能访问自己的 key?用 ~pattern 而不是 ~*
ACL 的 key 权限靠 ~ 开头的模式控制,不是靠数据库编号(DB 不再是隔离单元)。比如租户 tenant_a 只能操作 tenant_a:* 下的 key,就得写成:
user tenant_a on >pass123 ~tenant_a:* +@read +@write -@admin -@dangerous
常见错误:
- 写成
~tenant_a:不匹配任何 key,因为没带通配符* - 写成
~tenant_a:*但应用里用了tenant_a:session:abc:没问题;但若用了tenant_a_session:abc就越权了 —— 模式是前缀匹配,不是模糊搜索 - 多个租户共用一个 pattern,比如都用
~tenant_*:会导致互相读写,失去隔离
aclfile 配置文件有哪些硬性限制?
aclfile 是 Redis 7.4 加载 ACL 的唯一持久化方式(ACL SETUSER 命令改的只是内存态,重启即丢),但它有几条不能妥协的规则:
- 每行必须以
user开头,注释行(如# admin user)会被 Redis 当作非法语法,启动失败并报错:Invalid ACL line - 密码必须紧贴
>符号,中间不能有空格:>mypass✅,> mypass❌ - 不支持跨行定义,每个用户必须单行写完;长命令列表建议先在脚本里拼好再写入
- 文件路径需被
redis.conf显式指定:aclfile /etc/redis/users.acl,且 Redis 进程要有该路径的读权限
哨兵/集群环境下,从节点怎么验证租户身份?
Redis 7.4 哨兵或集群中,从节点(replica)本身不维护 ACL 用户表,它依赖主节点同步认证信息。所以必须在从节点配置里显式设置:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
masteruser tenant_b<br>masterauth pass456
否则从节点连不上主节点,报错:NOAUTH Authentication required 或 ERR invalid password。注意:
-
masteruser必须是主节点aclfile中已定义的用户,不能是default(如果已关掉) -
masterauth是对应用户的明文密码,不是 hash;即使主节点存的是 hash,从节点也只认明文字段 - 集群节点间通信(Gossip)不走 ACL,但客户端连接每个节点时,仍需单独认证对应节点上的用户
为什么 ACL GETUSER 看到的密码是 hash,但 aclfile 里必须写明文?
这是 Redis 7.4 ACL 的设计矛盾点:运行时 ACL GETUSER 返回的是服务端内部存储的 SHA256 hash(如 #515c217eb413b6aaf09de74bf42c85a6edc09ee7008c6ebedc2981b44bbc0fd3),但 aclfile 解析器只识别 >password 格式的明文。两者不互通。
这意味着:
- 你不能把
ACL GETUSER输出直接复制进aclfile—— 会启动失败 - 密码轮换必须双写:先
ACL SETUSER u1 >newpass,再手动更新aclfile并ACL LOAD - 生产环境建议用配置中心管理
aclfile内容,避免人工粘贴出错
最易忽略的一点:ACL 规则顺序影响最终权限,比如 +@all -@dangerous +flushdb 允许 flushdb,但写成 +@all +flushdb -@dangerous 就不行 —— 后者被 -@dangerous 覆盖掉了。规则从左到右逐条生效,不可逆。










