Redis企业软件中的Redis ACL概述
Redis企业软件中Redis ACLs、语法和ACL命令支持的概述。
Redis访问控制列表(Redis ACLs)允许您为特定的Redis命令、键和发布/订阅频道定义命名的权限。您可以为多个数据库和角色使用已定义的Redis ACLs。
预定义的Redis ACLs
Redis 企业版软件提供了一个预定义的 Redis ACL,名为 Full Access。此 ACL 允许对所有键执行所有命令,并且无法编辑。
Redis ACL 语法
Redis ACLs 是通过 Redis 语法 定义的,您可以在其中指定允许用于特定键的命令或命令类别。
命令和类别
Redis ACL 规则可以允许或阻止特定的 Redis 命令 或 命令类别。
-
+
包含命令 -
-
排除命令 -
+@
包含命令类别 -
-@
排除命令类别
以下示例允许所有read
命令和SET
命令:
+@read +SET
模块命令有几个ACL限制:
-
Redis 模块 没有命令类别。
-
其他命令类别 ACLs,例如
+@read
和+@write
,不包括Redis模块命令。+@all
是唯一的例外,因为它允许所有Redis命令。 -
你必须在Redis ACL规则中包含单独的模块命令以允许它们。
例如,以下Redis ACL规则允许只读命令和RediSearch命令
FT.INFO
和FT.SEARCH
:+@read +FT.INFO +FT.SEARCH
关键模式
要定义对特定键或键模式的访问,请使用以下前缀:
-
~
或%RW~
允许对键进行读写访问。 -
%R~
允许对键进行读取访问。 -
%W~
允许对键进行写访问。
%RW~
, %R~
, 和 %W~
仅支持 Redis 7.2 或更高版本的数据库。
以下示例允许对所有以“app1”开头的键进行读写访问,并对所有以“app2”开头的键进行只读访问:
~app1* %R~app2*
发布/订阅频道
&
前缀允许访问 pub/sub 频道(仅支持 Redis 6.2 或更高版本的数据库)。
要限制对特定频道的访问,请在允许的频道之前包含resetchannels
:
resetchannels &channel1 &channel2
选择器
Selectors 允许你在单个 Redis ACL 中定义多组规则(仅支持 Redis 7.2 或更高版本的数据库)。如果命令匹配基本规则或 Redis ACL 中的任何选择器,则该命令被允许。
-
(<rule set>)
创建一个新的选择器。 -
clearselectors
删除用户的所有现有选择器。此操作不会删除基本的ACL规则。
在以下示例中,基本规则允许GET key1
,选择器允许SET key2
:
+GET ~key1 (+SET ~key2)
默认的发布/订阅权限
Redis数据库版本6.2引入了发布/订阅ACL规则,这些规则决定了用户可以访问哪些发布/订阅频道。
配置选项 acl-pubsub-default
,在 Redis Enterprise Software 版本 6.4.2 中添加,用于确定所有发布/订阅通道的集群范围默认访问级别。Redis Enterprise Software 默认使用以下发布/订阅权限:
-
对于版本6.4.2和7.2,
acl-pubsub-default
默认是宽松的(allchannels
或&*
),以适应早期的Redis版本。 -
在未来的版本中,
acl-pubsub-default
将更改为限制性(resetchannels
)。限制性权限默认会阻止所有发布/订阅频道,除非由ACL规则明确允许。
如果您使用ACLs和pub/sub通道,您应该审查您的数据库和ACL设置,并计划将您的集群过渡到限制性的pub/sub权限,以准备未来的Redis Enterprise Software版本。
准备限制性的发布/订阅权限
为了保护发布/订阅通道并为将来默认具有限制性发布/订阅权限的Redis Enterprise Software版本准备您的集群:
-
升级Redis数据库:
-
对于Redis Enterprise Software版本6.4.2,请将集群中的所有数据库升级到Redis DB版本6.2。
-
对于Redis Enterprise Software版本7.2,将集群中的所有数据库升级到Redis DB版本7.2或6.2。
-
-
使用
resetchannels &channel
格式创建或更新具有特定频道权限的ACLs。 -
将ACLs与相关数据库关联。
-
将默认的发布/订阅权限(
acl-pubsub-default
)设置为限制性。详情请参阅更改默认的发布/订阅权限。 -
如果出现任何问题,您可以暂时将默认的发布/订阅设置更改回宽松模式。在再次使发布/订阅权限变得严格之前,请解决所有有问题的ACL。
当您将集群的默认发布/订阅权限更改为限制性时,&*
会被添加到 完全访问 ACL 中。在进行此更改之前,请考虑以下事项:
-
由于发布/订阅 ACL 语法是在 Redis 6.2 中添加的,在此更改后,您无法将 完全访问 ACL 与 6.0 或更低版本的数据库关联。
-
如果您再次将
acl-pubsub-default
更改为宽松模式,完全访问 ACL 不会被恢复。 -
每个启用了默认用户的数据库都使用完全访问 ACL。
更改默认的发布/订阅权限
自 Redis Enterprise 版本 6.4.2 起,您可以配置 acl_pubsub_default
,它决定了集群中所有数据库的默认发布/订阅权限。您可以将 acl_pubsub_default
设置为以下值:
-
resetchannels
是限制性的,默认情况下会阻止访问所有频道。 -
allchannels
是宽松的,默认情况下允许访问所有频道。
为了使默认的发布/订阅权限更加严格:
-
升级所有数据库在集群中到Redis版本6.2或更高版本。
-
使用以下方法之一将默认设置为限制性(
resetchannels
):-
新的集群管理器用户界面(仅适用于Redis企业版7.2及更高版本):
-
导航到访问控制 > 设置 > Pub/Sub ACLs并选择编辑。
-
对于Pub/Sub ACLs的默认权限,选择限制性,然后保存。
-
-
rladmin tune cluster acl_pubsub_default resetchannels
-
更新集群策略 REST API 请求:
PUT /v1/cluster/policy { "acl_pubsub_default": "resetchannels" }
-
ACL 命令支持
Redis Enterprise Software 不支持某些 Redis ACL 命令。相反,您可以从集群管理器 UI 管理访问控制。
命令 | 支持 |
---|---|
ACL CAT | ✅ 支持 |
ACL DELUSER | ❌ 不支持 |
ACL DRYRUN | ✅ 支持 |
ACL GENPASS | ❌ 不支持 |
ACL GETUSER | ✅ 支持 |
ACL HELP | ✅ 支持 |
ACL LIST | ✅ 支持 |
ACL LOAD | ❌ 不支持 |
ACL LOG | ❌ 不支持 |
ACL SAVE | ❌ 不支持 |
ACL SETUSER | ❌ 不支持 |
ACL USERS | ✅ 支持 |
ACL WHOAMI | ✅ 支持 |
Redis ACLs 在 Redis 企业版软件中还有以下不同之处:
-
MULTI
、EXEC
、DISCARD
命令始终被允许,但 ACL 会在MULTI
子命令上强制执行。 -
不支持嵌套选择器。
例如,以下选择器在 Redis Enterprise 中无效:
+GET ~key1 (+SET (+SET ~key2) ~key3)
-
键和发布/订阅模式不允许以下字符:
'(', ')'
-
不支持以下密码配置语法:
'>', '<', '#!', 'resetpass'
要在Redis Enterprise Software中配置密码,请使用以下方法之一:
-
rladmin cluster reset_password
:rladmin cluster reset_password <user email>
-
REST API
PUT /v1/users
请求并提供password
-