redis8.6.3创建自定义acl账号添加@cluster报错

📅 2026/7/31 18:12:28 👁️ 阅读次数 📝 编程学习
redis8.6.3创建自定义acl账号添加@cluster报错

redis8.6.3创建自定义acl账号报错

查看日志提示没有@cluster

ERR ErrorinACL SETUSER modifier'+@cluster':Unknowncommandor category nameinACL

问题原因:@cluster类别不存在

+@cluster这个写法,是尝试添加一个名为cluster的命令类别下的所有命令。但根据遇到的报错和官方文档,@cluster并不是一个标准的 ACL 命令类别-2-5-12。

核心原因:@cluster并非标准 ACL 类别

Redis 官方提供的 ACL 命令类别是固定的,而@cluster并不在其中-7。之所以会误以为它存在,可能有两个原因:

  1. 与命令名混淆:Redis 确实有CLUSTER这个具体的命令,用于管理集群,但它自身不是一个ACL类别
  2. 与 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'-a'or'-u'option on thecommandline interface may not be safe.10.52.51.63:31774>aclcat1)"keyspace"2)"read"3)"write"4)"set"5)"sortedset"6)"list"7)"hash"8)"string"9)"bitmap"10)"hyperloglog"11)"geo"12)"stream"13)"pubsub"14)"admin"15)"fast"16)"slow"17)"blocking"18)"dangerous"19)"connection"20)"transaction"21)"scripting"22)"search"23)"timeseries"24)"json"25)"bloom"26)"cuckoo"27)"cms"28)"topk"29)"tdigest"

与集群相关的命令属于什么类别呢?

与集群相关的命令通常归属于@admin@dangerous这两个类别。

例如,在列出@dangerous类别下的命令时,就包含了clusterinfo-3-4-9:

ACL 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”

这说明如果想授予对CLUSTERINFO等管理命令的访问权限,应该使用+@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) @dangerous

info不属于@read@admin(注意:这里@admin是 Redis 7/8 中info不直接归属的类别,从输出看,它确实没有出现@admin),而是属于@slow@dangerous

根据上面的类别信息,有以下几种选择:

方法规则写法影响范围风险等级
精准添加(推荐)+info只放开info这一个命令✅ 最低
放开@slow类别+@slow放开KEYSSCANSORTINFO等耗时命令⚠️ 中等
放开@dangerous类别+@dangerous放开FLUSHALLFLUSHDBDEBUGCLUSTERINFO❌ 最高

最终建议的 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 中,与集群相关的命令(如CLUSTERINFO等)都从未被归类在一个名为@cluster的 ACL 类别下。

从 Redis 6.0 开始引入 ACL 功能至今,标准的命令类别一直是@admin@dangerous@read@write等这些-5-8-10。

  • 在 Redis 6.0 及 7.xCLUSTERINFO等命令被归类于@dangerous类别中-2-6-8。
  • 在 Redis 8.x:标准 ACL 类别得到了扩展,@admin@dangerous仍然存在,并且还新增了针对特定模块的新类别,例如@search@json,但依然没有@cluster-1-3-4。

因此,之前设置+@cluster规则报错Unknown command or category name,是符合 Redis 设计预期的。