
上一篇文章 我们整体性的介绍了 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 是使用 DSL(Domain specific language) 定义的,该 DSL 描述了用户能够执行的操作。该规则始终 从上到下,从左到右应用,因为规则的顺序对于理解用户的实际权限很重要。
ACL 规则可以在 redis.conf 文件以及 users.acl 文件中配置 DSL,也可以在命令行中通过 ACL 命令配置。
接下来的我们细说 ACL 的规则以及命令描述。
on:启用用户:可以以该用户身份进行认证。off:禁用用户:不再可以使用此用户进行身份验证,但是已经通过身份验证的连接仍然可以使用。+:将命令添加到用户可以调用的命令列表中。-:将命令从用户可以调用的命令列表中移除。+@:允许用户调用 类别中的所有命令,有效类别为 @admin,- @set,@sortedset 等,可通过调用 ACL CAT 命令查看完整列表。特殊类别 @all 表示所有命令,包括当前和未来版本中存在的所有命令。-@:禁止用户调用 类别中的所有命令。+|subcommand :允许使用已禁用命令的特定子命令。allcommands:+@all 的别名。包括当前存在的命令以及将来通过模块加载的所有命令。nocommands:-@all 的别名,禁止调用所有命令。~:添加可以在命令中提及的键模式。例如 ~* 和 *allkeys 允许所有键。*resetkeys:使用当前模式覆盖所有允许的模式。如:~foo:* ~bar:* 、resetkeys ~objects:* ,客户端只能访问匹配 object:* 模式的 KEY。>:将此密码添加到用户的有效密码列表中。例如,>mypass 将 “mypass” 添加到有效密码(采用 sha256 加密保存)列表中。该命令会清除用户的 nopass 标记。每个用户可以有任意数量的有效密码。<:从有效密码列表中删除此密码。若该用户的有效密码列表中没有此密码则会返回错误信息。#:将此 SHA-256 哈希值添加到用户的有效密码列表中。该哈希值将与为 ACL 用户输入的密码的哈希值进行比较。允许用户将哈希存储在 users.acl 文件中,而不是存储明文密码。仅接受 SHA-256 哈希值,因为密码哈希必须为 64 个字符且小写的十六进制字符。!:从有效密码列表中删除该哈希值。当不知道哈希值对应的明文是什么时很有用。nopass:移除该用户已设置的所有密码,并将该用户标记为 nopass 无密码状态:任何密码都可以登录。resetpass 命令可以清除 nopass 这种状态。resetpass:情况该用户的所有密码列表。而且移除 nopass 状态。resetpass 之后用户没有关联的密码同时也无法使用无密码登录,因此 resetpass 之后必须添加密码或改为nopass 状态才能正常登录。reset:重置用户状态为初始状态。执行以下操作 resetpass,resetkeys,off,-@all。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>
#若用户不存在,则按默认规则创建用户,并为其增加。若用户存在则在已有规则上增加 。
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)