背景

在 Redis6.0 之前的版本中,登陆 Redis Server 只需要输入密码(前提配置了密码 requirepass )即可,不需要输入用户名,而且密码也是明文配置到配置文件中,安全性不高。并且应用连接也使用该密码,导致应用有所有权限处理数据,风险也极高。在 Redis6.0 有了 ACL 之后,终于解决了这些不安全的因素,可以按照不同的需求设置相关的用户和权限。本文来介绍下 Redis 6.0 ACL 相关的配置和使用。具体的说明可以查看官方文档:**ACL**

ACL介绍

Redis ACL 是 Access Control List 的缩写,是一种特性,它可以限制某些连接的可执行命令访问 key 的权限。它的工作方式是,在连接之后,客户端需要提供用户名和有效密码进行身份验证:如果身份验证阶段成功,则连接与给定用户相关联,并限制用户的权限。Redis 可以配置为已经使用 “default” 用户(这是默认配置)对新连接进行了身份验证,所以配置 default 的用户,作为一个副作用,仅提供一个特定功能的子集,没有明确身份验证的连接。

在默认配置下 ,Redis 6(第一个拥有 ACL 的版本)的工作原理与旧版本的 Redis 完全相同,也就是说,每一个新的连接都能够调用每一个可能的命令和访问每一个 key ,所以ACL功能是向后兼容的。另外,使用requirepass配置指令配置密码的旧方法仍然可以正常工作,但现在它所做的只是为default用户设置密码。

Redis AUTH命令在 Redis 6 中被扩展了,所以它现在可以在两个参数的形式使用它:

AUTH <username> <password>

按旧形式使用时,即:

AUTH <password>

实际情况是,用于身份验证的用户名是“default”,因此仅指定密码就意味着我们要针对默认用户进行身份验证。这提供了与过去完美的向后兼容性。

ACL的作用

在使用acl之前,您可能想问问自己,通过实现这一层保护,您希望实现什么目标。通常acl可以很好地实现两个主要目标:

  • 限制对命令和密钥的访问来:

    以便不受信任的客户机没有访问权限,而受信任的客户机只有对数据库的最低访问级别,以便执行所需的工作。例如,某些客户端只能执行只读命令。

  • 提高操作安全性:

    以防止由于软件错误或人为错误而导致进程或人员访问 Redis,从而破坏数据或配置。例如,从Redis获取延迟作业的worker没有理由能够调用FLUSHALL命令。

ACL 规则

以下是有效的ACL规则列表。某些规则只是单个单词,用于激活或删除标志,或执行对用户ACL的给定更改。其他规则是与命令或类别名称或键模式等连接的字符前缀。

启用和禁用用户

on:启用用户,可以使用该用户进行身份验证。

off:禁用用户,不再可能与该用户进行身份验证,但是已经通过身份验证的连接仍将工作。

注意,如果默认用户被标记为关闭,新的连接开始时将不经过身份验证,并且将要求用户发送带有AUTH选项的AUTH或HELLO以某种方式进行身份验证,而不管默认用户配置如何。

允许和禁止命令

+<command>:将该命令添加到用户可以调用的命令列表中。可以与|一起使用以允许子命令(例如“+config|get”)。

—<command>:将命令从用户可以调用的命令列表中移除。可以与|一起用于阻塞子命令(例如“-config|set”)。

+@<category>:为用户添加一类命令的权限,有效的类如@admin, @set, @sortedset,…等等,通过调用ACL CAT命令查看完整的列表。特殊类别@all表示所有命令,包括当前在服务器中存在的命令和将来将通过模块加载的命令。

-@<category>:类似**+@<category>**,从客户端可以调用的命令列表中删除命令

+\<command>|first-arg:允许一个特定的第一个参数,否则禁用命令。注意,这个表单不允许是负数,比如-SELECT|1,而只能是以“+”开头的加法。

allcommands:+@all的别名。注意,它意味着能够执行通过模块系统加载的所有未来命令。

nocommands: -@all的别名。

允许和禁止某些 key

~<pattern>:添加可以作为命令的一部分提到的键模式。例如~*允许所有的键。该模式是一个全局样式的模式,类似于KEYS模式。可以指定多个模式。

allkeys: 也就是~*。

resetkeys:刷新允许的键模式列表。例如ACL ~foo:* ~bar:* resetkeys ~objects:*,将导致客户端只能访问匹配模式对象:*的键。

允许和禁止发布/订阅频道

&<pattern>:添加一个用户可以访问的发布/订阅通道的glob样式模式。可以指定多个通道模式。注意,模式匹配只对PUBLISH和SUBSCRIBE提到的通道进行,而PSUBSCRIBE要求在其通道模式和用户允许的通道模式之间进行文字匹配。

allchannels:&*别名,允许用户访问所有发布/订阅通道

resetchannels:刷新允许的通道模式列表,如果用户的发布/订阅客户端不再能够访问各自的通道和/或通道模式,则断开这些客户端。

为用户配置有效的密码

><password>:将此密码添加到用户的有效密码列表中。例如,>mypass将把“mypass”添加到有效密码列表中。该指令清除nopass标志(参见后面的内容)。每个用户可以有任意数量的密码。

<<password>:从有效密码列表中删除此密码。如果删除的密码实际上没有设置,则将发出错误。

#<hash>:将此SHA-256哈希值添加到该用户的有效密码列表中。此hash值将与为ACL用户输入的密码的hash值进行比较。这允许用户将hash值存储在acl.conf文件中,而不是存储明文密码。只能接受SHA-256哈希值,因为密码hash值必须为64个字符,且只能包含小写的十六进制字符。

!<hash>:从有效密码列表中删除此hash值。当您不知道由hash值指定的密码,但希望从用户中删除密码时,这是非常有用的。

nopass:用户设置的所有密码都被删除,用户被标记为不需要密码:这意味着每个密码都适用于该用户。如果将此指令用于默认用户,则每个新连接都将立即使用默认用户进行身份验证,而不需要任何显式的AUTH命令。注意,resetpass指令将清除这个条件。

resetpass:清除允许的密码列表。此外,还删除了nopass状态。重置后,用户没有相关的密码,如果不添加一些密码(或稍后设置为nopass),就无法进行身份验证。

重置用户

rest:执行以下操作:resetpass, resetkeys, resetchannels, off, -@all。用户在创建后立即返回到相同的状态。

使用 ACL 命令配置 ACL

acl是使用DSL(领域特定语言)定义的,DSL描述了给定用户能够做什么或不能做什么。这样的规则总是从第一个到最后一个,从左到右实现,因为有时规则的顺序对理解用户真正能够做什么很重要。

首先看 ACL 的 help,了解大致的使用方法:ACL help

> ACL help
1) ACL <subcommand> arg arg ... arg. Subcommands are:
2) LOAD -- 从ACL文件中重新载入用户信息.
3) SAVE -- 保存当前的用户配置信息到ACL文件.
4) LIST -- 以配置文件格式显示用户详细信息.
5) USERS -- 列出所有注册的用户名.
6) SETUSER <username> [attribs ...] -- 创建或则修改一个用户.
7) GETUSER <username> -- 得到一个用户的详细信息.
8) DELUSER <username> [...] -- 删除列表中的用户.
9) CAT -- 列出可用的类别.
10) CAT <category> -- 列出指定类别中的命令.
11) GENPASS [<bits>] -- 生成一个安全的用户密码.
12) WHOAMI -- 返回当前的连接用户.
13) LOG [<count> | RESET] -- 显示ACL日志条目.

默认情况下,redis只定义了一个用户,称为default

我们可以使用ACL LIST命令来检查当前启用的ACL,并验证一个刚启动的、默认配置的Redis实例的配置是什么:

默认 default 用户,没有配置密码:

127.0.0.1:6379> acl list
1) "user default on nopass ~* &* +@all"

配置密码的:

127.0.0.1:6379> acl list
1) "user onlyread on #ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad ~* +@all"
参 数 说明
user 用户
default 表示默认用户名,或则自己定义的用户名
on 表示是否启用该用户,默认为 off(禁用)
#… 表示用户密码,nopass 表示不需要密码
~* 表示可以访问的 Key(正则匹配)
&* Pub/Sub通道(发布/订阅)
+@ 表示用户的权限,+/- 表示授权还是销权; @为权限类。+@all 表示所有权限

权限对 key 的类型和命令的类型进行了分类,如有对数据类型进行分类:string、hash、list、set、sortedset,和对命令类型进行分类:connection、admin、dangerous。

配置实例

密码相关

1、配置密码:一个用户可以设置不同的密码,即一个用户可以有多个密码。

-- 添加密码 
## >开头: >password,明文密码;
> ACL SETUSER zhoujy on >abc
OK

# 获取哈希值密码 echo -n "cba" | shasum -a 256
6d970874d0db767a7058798973f22cf6589601edab57996312f2ef7b56e5584d

## #开头: #hash,SHA-256哈希值
> ACL SETUSER zhoujy on #6d970874d0db767a7058798973f22cf6589601edab57996312f2ef7b56e5584d
OK

## 查看
> ACL GETUSER zhoujy
1) "flags"
2) 1) "on"
3) "passwords"
4) 1) "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
2) "6d970874d0db767a7058798973f22cf6589601edab57996312f2ef7b56e5584d"
5) "commands"
6) "-@all"
7) "keys"
8) (empty array)

## 认证密码
> AUTH zhoujy abc
OK
> AUTH zhoujy cba
OK


-- 移除密码
## <开头: <password ,明文密码
> ACL SETUSER zhoujy <abc
OK

## 用!开头: !hash,SHA-256哈希值
> ACL SETUSER zhoujy on !6d970874d0db767a7058798973f22cf6589601edab57996312f2ef7b56e5584d
OK

## 查看
> ACL GETUSER zhoujy
1) "flags"
2) 1) "on"
3) "passwords"
4) (empty array)
5) "commands"
6) "-@all"
7) "keys"
8) (empty array)

## 认证密码
> AUTH zhoujy abc
(error) WRONGPASS invalid username-password pair

2、清理 / 删除密码:通过 nopass 清理用户的密码,但是该用户连接还是需要 AUTH,只是密码可以是任意值

-- 清理/删除密码,可以用任意密码登陆
## 查看
> ACL GETUSER zhoujy
1) "flags"
2) 1) "on"
2) "allkeys"
3) "allcommands"
3) "passwords"
4) 1) "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
2) "6d970874d0db767a7058798973f22cf6589601edab57996312f2ef7b56e5584d"
5) "commands"
6) "+@all"
7) "keys"
8) 1) "*"

## 删除、清理用户密码
> ACL SETUSER zhoujy nopass
OK

## 查看
> ACL GETUSER zhoujy
1) "flags"
2) 1) "on"
2) "allkeys"
3) "allcommands"
4) "nopass"
3) "passwords"
4) (empty array)
5) "commands"
6) "+@all"
7) "keys"
8) 1) "*"

## 验证
> AUTH zhoujy --需要AUTH
(error) WRONGPASS invalid username-password pair

> AUTH zhoujy '' --可以输入任何密码
OK


-- 清理/删除密码,不能登陆,需要设置密码后才能登陆
## 查看
> ACL GETUSER zhoujy
1) "flags"
2) 1) "on"
2) "allkeys"
3) "allcommands"
3) "passwords"
4) 1) "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
2) "6d970874d0db767a7058798973f22cf6589601edab57996312f2ef7b56e5584d"
5) "commands"
6) "+@all"
7) "keys"
8) 1) "*"

## 删除、清理用户密码
> ACL SETUSER zhoujy resetpass
OK
> ACL GETUSER zhoujy
1) "flags"
2) 1) "on"
2) "allkeys"
3) "allcommands"
3) "passwords"
4) (empty array)
5) "commands"
6) "+@all"
7) "keys"
8) 1) "*"

## 验证,被resetpass重置密码之后,不能登陆,只能设置密码或则设置nopass才能登陆
> AUTH zhoujy
(error) WRONGPASS invalid username-password pair

> AUTH zhoujy ''
(error) WRONGPASS invalid username-password pair

3、重置用户和密码:实际上是执行 resetpass,resetkeys,off,-@all

## 查看
> ACL LIST
1) "user default on #ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad ~* +@all"
2) "user zhoujy on #ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad ~* +@all"

## 重置用户
> ACL SETUSER zhoujy reset
OK

## 查看
> ACL LIST
1) "user default on #ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad ~* +@all"
2) "user zhoujy off -@all"

4、获取随机密码:

-- 生成随机密码
> ACL GENPASS
"7a3288b05577cb6fea9b1a9a8bcfe10d9589e64be74e8a0e16c131ba896c7bde"

键模式

~<pattern>,通配符模式。比如: * 表示允许访问所有 key,也可以用 `allkeys来表示*****。**resetkeys** 表示清空它之前所有的键模式,之后的键模式不影响。`

-- 可以操作foo开头和bar:开头的所有key
> ACL SETUSER zhoujy on >abc ~foo* ~bar:*+@all
OK

## 查看
> ACL LIST
1) "user default on #ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad ~* +@all"
2) "user zhoujy on #ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad ~foo* ~bar:*+@all"

-- 只能操作ob:开头的key,前面的key模式被resetkeys清空了
> ACL SETUSER zhoujy on >abc ~foo* ~bar:* resetkeys ~ob:*+@all
OK

## 查看
> ACL LIST
1) "user default on #ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad ~* +@all"
2) "user zhoujy on #ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad ~ob:*+@all"

-- 操作所有key,allkeys 和 ~* 一样
> ACL SETUSER zhoujy allkeys +@all
OK
> ACL LIST
1) "user default on #ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad ~* +@all"

## 查看
2) "user zhoujy on #ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad ~*+@all"

权限相关

权限这块涉及到的比较多:权限的类别、类别里包含的命令,以及子权限。
注意:**-@all** 表示没有任何权限;**+@all** 表示有所有权限;

-- 返回权限的类别
> ACL CAT
1) "keyspace"
2) "read"
3) "write"
4) "set"
5) "sortedset"
6) "list"
7) "hash"
8) "string"
9) "bitmap"
10) "hyperloglog"
11) "geo"
12) "stream"
13) "pubsub"
14) "admin"
15) "fast"
16) "slow"
17) "blocking"
18) "dangerous"
19) "connection"
20) "transaction"
21) "scripting"

-- 返回指定类别中的命令,下面hash是上面返回的一个结果
> ACL CAT hash
1) "hsetnx"
2) "hset"
3) "hlen"
4) "hmget"
5) "hincrbyfloat"
6) "hgetall"
7) "hvals"
8) "hscan"
9) "hkeys"
10) "hstrlen"
11) "hget"
12) "hdel"
13) "hexists"
14) "hincrby"
15) "hmset"

从上面的权限列表里看到:权限对 key 的类型和命令的类型进行了分类,如有对类型进行分类:string、hash、list、set、sortedset,和对命令类型进行分类:connection、admin、dangerous。 以及对每个分类的方法进行说明,如上面查看 hash 类型 key 的一些方法。

授权方法

+<command>:将命令添加到用户可以调用的命令列表中,如+@hash
-<command>: 将命令从用户可以调用的命令列表中移除
+@<category>: 添加一类命令,如:@admin, @set, @hash ... 可以ACL CAT 查看具体的操作指令。特殊类别@all表示所有命令,包括当前在服务器中存在的命令,以及将来将通过模块加载的命令
-@<category>: 类似+@<category>,从客户端可以调用的命令列表中删除命令
+<command>|subcommand: 允许否则禁用特定子命令。注意,这种形式不允许像-DEBUG | SEGFAULT那样,而只能以“ +”开头
allcommands:+@all的别名,允许所有命令操作执行。注意,这意味着可以执行将来通过模块系统加载的所有命令。
nocommands:-@all的别名,不允许所有命令操作执行。

1、添加指定类型的权限:+@hash

-- 添加hash类型key的所有权限
> ACL SETUSER zhoujy +@hash
OK

## 查看
> ACL LIST
1) "user default on #ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad ~* +@all"
2) "user zhoujy on #ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad ~* -@all +@hash"

说明:用户 zhoujy 只有对 hash 类型的 key 有权限。

2、删除指定类型的权限:-@hash

-- 删除hash类型key的所有权限
> ACL SETUSER zhoujy -@hash +@string
OK

## 查看
> ACL LIST
1) "user default on #ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad ~* +@all"
2) "user zhoujy on #ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad -@all +@string"

说明:用户 zhoujy 移除对 hash 类型的 key 有权限。

3、指定特定 key 的权限:如 sortedset:~z*,z 开头的 key

-- 访问指定key的正则
> ACL SETUSER zhoujy ~z* +@sortedset -@string
OK

## 查看
> ACL LIST
1) "user default on #ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad ~* +@all"
2) "user zhoujy on #ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad ~z* -@all +@sortedset"

说明:用户 zhoujy 只有对 z 开头的 key 有权限。

4、授权只读 / 只写的权限:+@read、+@write

-- 授权所有key的只读权限
> ACL SETUSER zhoujy ~* +@read
OK

##查看
> ACL LIST
1) "user default on #ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad ~* +@all"
2) "user zhoujy on #ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad ~* -@all +@read +@hash +@bitmap +@geo -georadiusbymember -hsetnx -setbit -hset -geoadd -bitop -hincrbyfloat -hdel -bitfield -hincrby -hmset -georadius"

-- 授权所有key的只写权限
> ACL SETUSER zhoujy +@write
OK

##查看
192.168.163.134:8379> ACL LIST
1) "user default on #ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad ~* +@all"
2) "user zhoujy on #ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad ~* -@all +@write +@list +@string +@stream +@fast +@blocking -dbsize -getrange -scard -xrevrange -zrank -llen -xread -ttl -get -ping -watch -publish -hlen -xrange -stralgo -zcount -getbit -lastsave -readonly -hmget -hello -zcard -discard -hstrlen -xinfo -hget -exists -bitfield_ro -select -role -zlexcount -zrevrank -lolwut -hexists -touch -lindex -unwatch -sismember -strlen -xlen -asking -type -mget -time -xpending -echo -multi -auth -readwrite -lrange -pttl -zscore -substr"

说明:用户 zhoujy 对所有 key 有只读或则只写的权限,如果下个这对指定 key,则替换 ~* 即可。

5、授权管理权限:@admin

-- 授权管理权限
> ACL SETUSER zhoujy on >abc ~* +@admin
OK

## 查看
> ACL LIST
1) "user default on #ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad ~* +@all"
2) "user zhoujy on #ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad ~* -@all +@admin +@dangerous -flushall -flushdb -swapdb -keys -role -sort -migrate -restore-asking -restore -info"

说明:用户 zhoujy 有管理权限,包含了危险操作的类型,但排除了 - 开头命令的权限。

6、允许特定类型 key 的子命令权限:

-- 设置子命令。
> ACL SETUSER zhoujy on >abc ~* -client +client|getname +client|setname
OK

##查看
> ACL LIST
1) "user default on #ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad ~* +@all"
2) "user zhoujy on #ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad ~* -@all +client|getname +client|setname"

说明:开始删除 CLIENT 命令,然后添加了两个允许的子命令。请注意,不能相反,即不能 + 在前面,只能添加而不是排除子命令,因为将来可能会添加新的子命令。注意子命令匹配可能会增加一些性能损失。

7、特定用途的账号权限:Sentinel 和 Replicas

-- Sentinel:允许用户在主和副本实例中都有以下命令权限
> ACL SETUSER sentinel-user >somepassword +client +subscribe +publish +ping +info +multi +slaveof +config +client +exec on
OK

-- Replicas:副本需要在主实例上有以下命令权限
> ACL SETUSER replica-user >somepassword +psync +replconf +ping on
OK

保存、加载相关:save、load

通过 ACL 创建的用户是保存在内存里的,如果 Redis Server 重启则 ACL 创建的用户会丢失,所以在创建完用户后需要用 save 保存,在重启之后需要用 load 加载。有两种方式进行保存和加载:

1,使用ACL命令:ACL SAVE、ACL LOAD
2,使用Redis配置,用户被定义,然后重启服务器并生效。 或者使用外部ACL文件,使用ACL LOAD 来导入ACL信息

注意:ACL 的配合文件需要事先手动 touch,否则实例启动会失败。在 redis.conf 里配置和 acl 文件里配置的方法互不兼容,Redis 会要求使用其中一种。 否则实例启动报错:

-- 报错信息
#Configuring Redis with users defined in redis.conf and at the same setting an ACL file path is invalid. This setup is very likely to lead to configuration errors and security holes, please define either an ACL file or declare users directly in your redis.conf, but not both.

在 redis.conf 中指定用户是一种非常简单的方法,适用于简单的用例。 当有多个用户要定义时,在复杂的环境中,强烈建议使用 ACL 文件。该 2 个文件里的配置内容是一致的,可以相互进行配置,如格式如下:在 redis.conf 和 users.acl 里的格式

-- 配置文件
user default on #ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad ~* +@all
user zhoujy on #ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad ~* +@all

1、保存 ACL 规则

-- 保存ACL规则
> ACL SAVE
OK

2、加载 ACL 规则

-- 加载ACL规则
> ACL LOAD
OK

说明:在使用 ACL 配置文件之后,如果设置了默认用户(default)规则的话,需要看配置文件中 aclfile 和 requirepass 参数的先后顺序,密码以最后出现的为准。

日志相关

显示最近的 ACL 安全事件列表
通过 ACL LOG [ | RESET] 返回 ACL 的日志信息,可以指定条目显示,也可以进行重置:

-- 显示日志信息
> ACL LOG 1
1) 1) "count"
2) (integer) 1
3) "reason"
4) "auth"
5) "context"
6) "toplevel"
7) "object"
8) "AUTH"
9) "username"
10) "zhoujy"
11) "age-seconds"
12) "282.90499999999997"
13) "client-info"
14) "id=5 addr=192.168.163.134:35246 fd=7 name= age=403 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=36 qbuf-free=32732 obl=0 oll=0 omem=0 events=r cmd=auth user=zhoujy"

-- 重置日志,类似slow
> acl log reset
OK

场景说明

注意:以上操作完只有需要执行 ACL SAVE。不然重置之后用户信息全部都清空了。

  1. 创建 DBA 管理账号

    > ACL SETUSER dba on #6d0ac515af9df81653ed0aa3ffa692663c3f556079791e2f00a4578990da66f3 allkeys +@all
    OK
  2. 创建读写账号

    > ACL SETUSER readwrite on >abc allkeys -@all +@read +@write
    OK
  3. 创建只读账号

    > ACL SETUSER readonly on >abc allkeys -@all +@read
    OK
  4. 创建只写账号

    > ACL SETUSER write_user on >abc allkeys -@all +@write
    OK
  5. 创建复制账号

    > ACL SETUSER replica-user >abc -@all +psync +replconf +ping on
    OK
  6. 创建哨兵账号

    > ACL SETUSER sentinel-user >abc -@all +client +subscribe +publish +ping +info +multi +slaveof +config +client +exec on
    OK
  7. 创建监控账号

    > ACL SETUSER monitor on >abc +monitor
    OK
  8. 创建指定 key、有指定类型权限的账号

    -- 指定对h开头的hash类型的key有权限
    > ACL SETUSER ops_user on >abc ~h* +@hash
    OK

    其中 key 的模式是正则匹配,需要 ~ 开头,针对权限则是 hash 的类,其权限可以通过 ACL CAT hash 查看。

使用外部 ACL 文件

有两种方法可以将用户存储在 Redis 配置中,一种是 redis.conf 中配置,一种是使用一个独立的外部 acl 文件,这两种方式不兼容,只能选择一种方式。

redis.conf内部指定用户是一种非常简单的方法,适用于简单的用例。当需要定义多个用户时,在复杂的环境中,我们强烈建议您使用 ACL 文件。

通常外部文件的方式更灵活,推荐使用。

配置内容如下:

user <username> ... acl rules ...

来看一个示例:

user worker +@list +@connection ~jobs:* on >ffa9203c493aa99

当您要使用外部 ACL 文件时,需要在 redis.conf 文件中设置 aclfile文件的路径,如下所示:

aclfile /etc/redis/users.acl

当仅在 redis.conf 文件内部直接指定几个用户时,可以使用 CONFIG REWRITE 以便通过重写将新的用户配置存储在文件中。

但是,外部 ACL 文件功能更强大。您可以执行以下操作:

  • 使用 ACL LOAD 重新加载外部 ACL 文件,通常在你手动修改了这个文件,希望 redis 重新加载的时候使用,需要注意的是要确保 acl 文件内容的正确性
  • 使用 ACL SAVE 将当前 ACL 配置保存到一个外部文件