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)



















