Redis ACL 规则说明
- 前情回顾
- ACL 定义规范
- 启用和禁用用户
- 允许和禁止调用命令
- 允许或禁止访问某些 Key
- 为用户配置有效密码
- ACL 命令说明

前情回顾
上一篇文章 我们整体性的介绍了 Redis 的 ACL,我们来回顾下 ACL 的两种配置方式。
redis 使用 acl 有两种方式可以配置,分别是 config 和 aclfile 模式。在 config 配置文件中配置的 ACL 权限,需要执行 ACL LOAD 或者 重启 Redis 服务 才能生效,事实上我们可以直接在命令行下配置 ACL,在命令行模式下配置的权限无需重启服务即可生效。
我们也可以在命令行模式下配置 ACL 并将其持久化到 aclfile 或者 config 文件中(这取决于配置文件中选择的是 config模式 还是 外部 aclfile 模式),一旦将 user 权限持久化到 aclfile 或 config 文件中,下次重启就会自动加载该权限,注意如果忘记持久化,一旦服务宕机或重启,该权限就会丢失。
# 如果使用 config 模式,将 ACL 权限持久化到 redis.conf 文件中使用下面的命令:
config rewrite
# 如果使用 aclfile 模式,将 ACL 权限持久化到 users.acl 文件中使用下面的命令:
acl save
说明:redis acl 是 redis v 6.0 扩展的
Auth机制,因此要使用 acl 功能,redis 服务必须是 6.0 及其以上版本(redis version ≥ 6.0)。
ACL 定义规范
ACL 是使用 DSL(Domain specific language) 定义的,该 DSL 描述了用户能够执行的操作。该规则始终 从上到下,从左到右应用,因为规则的顺序对于理解用户的实际权限很重要。
ACL 规则可以在 redis.conf 文件以及 users.acl 文件中配置 DSL,也可以在命令行中通过 ACL 命令配置。
接下来的我们细说 ACL 的规则以及命令描述。
启用和禁用用户
on:启用用户:可以以该用户身份进行认证。off:禁用用户:不再可以使用此用户进行身份验证,但是已经通过身份验证的连接仍然可以使用。
允许和禁止调用命令
+<command>:将命令添加到用户可以调用的命令列表中。-<command>:将命令从用户可以调用的命令列表中移除。+@<category>:允许用户调用<category>类别中的所有命令,有效类别为@admin,- @set,@sortedset等,可通过调用ACL CAT命令查看完整列表。特殊类别@all表示所有命令,包括当前和未来版本中存在的所有命令。-@<category>:禁止用户调用<category>类别中的所有命令。+<command>|subcommand:允许使用已禁用命令的特定子命令。allcommands:+@all的别名。包括当前存在的命令以及将来通过模块加载的所有命令。nocommands:-@all的别名,禁止调用所有命令。
允许或禁止访问某些 Key
~<pattern>:添加可以在命令中提及的键模式。例如~*和*allkeys允许所有键。*resetkeys:使用当前模式覆盖所有允许的模式。如:~foo:* ~bar:*、resetkeys ~objects:*,客户端只能访问匹配object:*模式的KEY。
为用户配置有效密码
><password>:将此密码添加到用户的有效密码列表中。例如,>mypass将“mypass”添加到有效密码(采用sha256加密保存)列表中。该命令会清除用户的nopass标记。每个用户可以有任意数量的有效密码。<<password>:从有效密码列表中删除此密码。若该用户的有效密码列表中没有此密码则会返回错误信息。#<hash>:将此SHA-256哈希值添加到用户的有效密码列表中。该哈希值将与为ACL用户输入的密码的哈希值进行比较。允许用户将哈希存储在users.acl文件中,而不是存储明文密码。仅接受SHA-256哈希值,因为密码哈希必须为64个字符且小写的十六进制字符。!<hash>:从有效密码列表中删除该哈希值。当不知道哈希值对应的明文是什么时很有用。nopass:移除该用户已设置的所有密码,并将该用户标记为nopass无密码状态:任何密码都可以登录。resetpass命令可以清除nopass这种状态。resetpass:情况该用户的所有密码列表。而且移除nopass状态。resetpass之后用户没有关联的密码同时也无法使用无密码登录,因此resetpass之后必须添加密码或改为nopass状态才能正常登录。reset:重置用户状态为初始状态。执行以下操作resetpass,resetkeys,off,-@all。
ACL 命令说明
ACL HELP,查看ACL帮助信息:
alc help

ACL CAT,查看命令类别,用于授权:
# 显示所有的命令类别。
ACL CAT
# 显示所有指定类别下的所有命令。
ACL CAT <category>
ACL DELUSER,删除指定的用户:
# 删除指定的用户
acl deluser <username>
ACL DRYRUN,返回用户是否可以在不执行给定命令的情况下执行该命令:
acl dryrun <username> command
ACL GETUSER,使用下面的命令查看用户的ACL权限:
# 查看用户的 ACL 权限
acl getuser <username>
ACL GENPASS,生成一个安全的256位用户密码。可选的“位”参数可用于指定不同的大小:
# 删除指定的用户
acl genpass <username>
ACL LIST,我们可以使用ACL LIST命令来查看当前活动的ACL,默认情况下,有一个“default”用户:
127.0.0.1:6379> acl list
1) "user default on nopass ~* +@all"
其中 user 为关键词,default 为用户名,后面的内容为 ACL规则 描述,on 表示活跃的,nopass 表示无密码, ~* 表示所有key,+@all 表示所有命令。
所以上面的命令表示活跃用户 default 无密码且可以访问所有命令以及所有数据。
ACL SETUSER,使用下面的命令创建或修改用户属性,username区分大小写:
#username区分大小写
#若用户不存在则按默认规则创建用户,若存在则修改用户属性
SETUSER <username> [attribs ...]
#若用户不存在,则按默认规则创建用户。若用户存在则该命令不做任何操作。
ACL SETUSER <username>
#若用户不存在,则按默认规则创建用户,并为其增加<rules>。若用户存在则在已有规则上增加 <rules>。
ACL SETUSER <username> <rules>
ACL USERS,返回所有用户名:
acl users
ACL WHOAMI,返回当前用户名:
acl whoami
ACL LOAD,我们也可以直接在aclfile中修改或新增ACL权限,修改之后不会立刻生效,我们可以在redis命令行中执行acl load将该aclfile中的权限加载至redis服务中:
# 将 aclfile 中的权限加载至 redis 服务中,是配置生效
acl load
ACL LOG,查看ACL安全日志:
acl log
ACL SAVE,前面提到过,我们可以使用acl save命令将当前服务器中的ACL权限持久化到aclfile中,如果没持久化就关闭redis服务,那些ACL权限就会丢失,因此我们每次授权之后一定要记得ACL SAVE将ACL权限持久化到aclfile中:
# 将 acl 权限持久化到磁盘的 aclfile 中
acl save
# 如果使用 redis.conf 配置 ACL,则使用 config rewrite 命令将 ACL 持久化到 redis.conf 中
config rewrite
AUTH,使用auth命令切换用户:
AUTH <username> <password>
以上就是关于 Redis ACL 命令的详细说明,你 “学废” 了么?
“只有每天不断学习,才能成长为更好的自己。” – 巨石强森(Dwayne Johnson)



















