redis8.6.3创建自定义acl账号添加@cluster报错
redis8.6.3创建自定义acl账号报错查看日志提示没有clusterERR ErrorinACL SETUSER modifiercluster:Unknowncommandor category nameinACL问题原因cluster类别不存在cluster这个写法是尝试添加一个名为cluster的命令类别下的所有命令。但根据遇到的报错和官方文档cluster并不是一个标准的 ACL 命令类别-2-5-12。核心原因cluster并非标准 ACL 类别Redis 官方提供的 ACL 命令类别是固定的而cluster并不在其中-7。之所以会误以为它存在可能有两个原因与命令名混淆Redis 确实有CLUSTER这个具体的命令用于管理集群但它自身不是一个ACL类别。与 Redis 8.x 新增的模块类别混淆Redis 8.x 确实引入了新的 ACL 类别比如search、json、timeseries等-1-8。但这依然不包括cluster。如何验证当前环境的 Redis 支持哪些类别最直接、最可靠的方法是使用ACL CAT命令在 Redis 8.6.3 实例上查询。在 redis-cli 中执行根据返回的列表就可以知道具体可以使用哪些category规则了。redis-cli-h10.52.51.63-p31774--usertest-a-cWarning: Using a password with-aor-uoption on thecommandline interface may not be safe.10.52.51.63:31774aclcat1)keyspace2)read3)write4)set5)sortedset6)list7)hash8)string9)bitmap10)hyperloglog11)geo12)stream13)pubsub14)admin15)fast16)slow17)blocking18)dangerous19)connection20)transaction21)scripting22)search23)timeseries24)json25)bloom26)cuckoo27)cms28)topk29)tdigest与集群相关的命令属于什么类别呢与集群相关的命令通常归属于admin或dangerous这两个类别。例如在列出dangerous类别下的命令时就包含了cluster和info-3-4-9ACL CAT dangerous…15) “info”…68) “cluster|saveconfig”69) “cluster|failover”70) “cluster|bumpepoch”71) “cluster|replicate”72) “cluster|flushslots”73) “cluster|syncslots”74) “cluster|reset”75) “cluster|delslotsrange”76) “cluster|meet”77) “cluster|slaves”78) “cluster|delslots”79) “cluster|replicas”80) “cluster|count-failure-reports”81) “cluster|setslot”82) “cluster|addslots”83) “cluster|addslotsrange”84) “cluster|forget”85) “cluster|set-config-epoch”86) “cluster|migration”这说明如果想授予对CLUSTER或INFO等管理命令的访问权限应该使用dangerous类别需要特别注意授予dangerous类别的安全风险。根据这个类别列表info命令还属于哪些类别可以执行10.52.51.63:31774 COMMAND INFO info 1) 1) info 2) (integer) -1 3) 1) loading 2) stale 4) (integer) 0 5) (integer) 0 6) (integer) 0 7) 1) slow 2) dangerous 8) 1) nondeterministic_output 2) request_policy:all_shards 3) response_policy:special 9) (empty array) 10) (empty array)从COMMAND INFO info的输出可以看到info命令属于7) 1) slow 2) dangerousinfo不属于read、admin注意这里admin是 Redis 7/8 中info不直接归属的类别从输出看它确实没有出现admin而是属于slow和dangerous。根据上面的类别信息有以下几种选择方法规则写法影响范围风险等级精准添加推荐info只放开info这一个命令✅ 最低放开slow类别slow放开KEYS、SCAN、SORT、INFO等耗时命令⚠️ 中等放开dangerous类别dangerous放开FLUSHALL、FLUSHDB、DEBUG、CLUSTER、INFO等❌ 最高最终建议的 ACL 规则如果想最小化权限只让info可用同时保留原来的read和其他权限规则如下-all read config command ping info -keys ~* *或者如果还需要集群命令CLUSTER NODES等可以加cluster或者加上特指命令cluster|slots-all read config command ping info cluster -keys ~* *⚠️注意cluster是具体命令名不是类别。它允许所有CLUSTER子命令NODES、INFO、SLOTS、REPLICAS 等。如何修改 ACL 规则如果是管理员如default用户执行ACL SETUSER test -all read config command ping info -keys ~* *如果当前test用户没有修改自身 ACL 的权限需要用管理员账号执行。修改后再执行info验证info应该可以正常返回服务器信息了。如果还不行用ACL GETUSER test查看当前规则是否生效。补充无论在旧版还是新版 Redis 中与集群相关的命令如CLUSTER、INFO等都从未被归类在一个名为cluster的 ACL 类别下。从 Redis 6.0 开始引入 ACL 功能至今标准的命令类别一直是admin、dangerous、read、write等这些-5-8-10。在 Redis 6.0 及 7.xCLUSTER和INFO等命令被归类于dangerous类别中-2-6-8。在 Redis 8.x标准 ACL 类别得到了扩展admin和dangerous仍然存在并且还新增了针对特定模块的新类别例如search、json但依然没有cluster-1-3-4。因此之前设置cluster规则报错Unknown command or category name是符合 Redis 设计预期的。