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。之所以会误以为它存在,可能有两个原因:
- 与命令名混淆: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'-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类别下的命令时,就包含了cluster和info-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”
这说明如果想授予对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.x:
CLUSTER和INFO等命令被归类于@dangerous类别中-2-6-8。 - 在 Redis 8.x:标准 ACL 类别得到了扩展,
@admin和@dangerous仍然存在,并且还新增了针对特定模块的新类别,例如@search、@json,但依然没有@cluster-1-3-4。
因此,之前设置+@cluster规则报错Unknown command or category name,是符合 Redis 设计预期的。
