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)