ACL
Redis 访问控制列表
Redis ACL,即访问控制列表,是一项功能,允许对某些连接执行的命令和可以访问的键进行限制。它的工作原理是,连接后,客户端需要提供用户名和有效密码进行身份验证。如果身份验证成功,连接将与给定的用户关联,并且该用户具有相应的限制。Redis 可以配置为使新连接已使用“默认”用户进行身份验证(这是默认配置)。配置默认用户有一个副作用,即能够仅对未明确进行身份验证的连接提供特定功能子集。
在默认配置中,Redis 6(第一个支持 ACL 的版本)的工作方式与旧版本的 Redis 完全相同。每个新连接都可以调用所有可能的命令并访问所有键,因此 ACL 功能与旧的客户端和应用程序向后兼容。此外,使用 **requirepass** 配置指令配置密码的旧方法仍按预期工作。但是,它现在为默认用户设置密码。
Redis AUTH
命令在 Redis 6 中得到了扩展,现在可以使用它进行两个参数的形式
AUTH <username> <password>
以下是一个旧形式的示例
AUTH <password>
发生的情况是,用于身份验证的用户名为“default”,因此仅指定密码表示我们要针对默认用户进行身份验证。这提供了向后兼容性。
ACL 何时有用
在使用 ACL 之前,您可能需要问问自己,通过实施此保护层,您希望实现什么目标。通常,ACL 可以很好地满足两个主要目标。
- 您希望通过限制对命令和键的访问来提高安全性,以便不受信任的客户端无法访问,而受信任的客户端仅具有执行所需工作所需的数据库最小访问级别。例如,某些客户端可能只能执行只读命令。
- 您希望提高操作安全性,以便访问 Redis 的进程或人员不会因软件错误或手动错误而损坏数据或配置。例如,没有理由让从 Redis 提取延迟作业的 worker 能够调用
FLUSHALL
命令。
ACL 的另一个典型用法与托管 Redis 实例相关。Redis 通常作为托管服务提供,既可以由处理其其他内部客户的 Redis 基础设施的内部公司团队提供,也可以由云提供商在软件即服务设置中提供。在这两种设置中,我们都希望确保排除对客户的配置命令。
使用 ACL 命令配置 ACL
ACL 使用 DSL(领域特定语言)定义,该 DSL 描述了给定用户被允许做什么。这些规则始终从第一个到最后一个,从左到右实施,因为有时规则的顺序对于理解用户真正能做什么很重要。
默认情况下,定义了一个名为 *default* 的单个用户。我们可以使用 ACL LIST
命令来检查当前活动的 ACL 并验证新启动的默认配置的 Redis 实例的配置
> ACL LIST
1) "user default on nopass ~* &* +@all"
上面的命令报告了用户列表,其格式与 Redis 配置文件中使用的格式相同,通过将用户当前设置的 ACL 转换回其描述来实现。
每行中的前两个词是“user”,后跟用户名。接下来的词是描述不同事物的 ACL 规则。我们将详细展示规则的工作原理,但现在足以说,默认用户被配置为活动(on),不需要密码(nopass),可以访问所有可能的键(~*
)和 Pub/Sub 通道(&*
),并且能够调用所有可能的命令(+@all
)。
此外,在默认用户的特殊情况下,具有 *nopass* 规则意味着新连接将自动使用默认用户进行身份验证,而无需任何显式的 AUTH
调用。
ACL 规则
以下是有效 ACL 规则的列表。某些规则只是用于激活或删除标志或对用户 ACL 执行给定更改的单个单词。其他规则是字符前缀,它们与命令或类别名称、键模式等连接。
启用和禁用用户
on
:启用用户:可以以该用户身份进行身份验证。off
:禁用用户:不再可能使用该用户进行身份验证;但是,先前已验证的连接仍将起作用。请注意,如果默认用户被标记为 *off*,新连接将以未经身份验证的方式启动,并且将要求用户发送AUTH
或HELLO
(其中包含 AUTH 选项)以便以某种方式进行身份验证,而无论默认用户的配置如何。
允许和禁止命令
+<command>
:将命令添加到用户可以调用的命令列表中。可以与|
一起使用以允许子命令(例如 +config|get)。-<command>
:从用户可以调用的命令列表中删除命令。从 Redis 7.0 开始,它可以与|
一起使用以阻止子命令(例如 -config|set)。+@<category>
:将该类别中的所有命令添加到用户可以调用的命令列表中,有效的类别例如 @admin、@set、@sortedset 等,请通过调用ACL CAT
命令查看完整列表。特殊类别 @all 表示所有命令,包括当前存在于服务器中的命令和将来通过模块加载的命令。-@<category>
:与+@<category>
相似,但会从客户端可以调用的命令列表中删除命令。+<command>|first-arg
:允许否则禁用的命令的特定第一个参数。它仅支持没有子命令的命令,并且不允许作为负形式,例如 -SELECT|1,只能作为以“+”开头的加法形式。此功能已弃用,可能会在将来删除。allcommands
:+@all 的别名。请注意,这意味着能够执行通过模块系统加载的所有未来命令。nocommands
:-@all 的别名。
允许和禁止某些键和键权限
~<pattern>
:添加可以在命令中作为部分提到的键模式。例如,~*
允许所有键。该模式是类似于KEYS
的全局样式模式。可以指定多个模式。%R~<pattern>
: (在 Redis 7.0 及更高版本中可用) 添加指定的读键模式。这与常规键模式类似,但只授予从与给定模式匹配的键读取的权限。有关详细信息,请参阅 键权限。%W~<pattern>
: (在 Redis 7.0 及更高版本中可用) 添加指定的写键模式。这与常规键模式类似,但只授予写入与给定模式匹配的键的权限。有关详细信息,请参阅 键权限。%RW~<pattern>
: (在 Redis 7.0 及更高版本中可用)~<pattern>
的别名。allkeys
:~*
的别名。resetkeys
:刷新允许的键模式列表。例如,ACL~foo:* ~bar:* resetkeys ~objects:*
将只允许客户端访问与模式objects:*
匹配的键。
允许和禁止 Pub/Sub 通道
&<pattern>
: (在 Redis 6.2 及更高版本中可用) 添加用户可以访问的 Pub/Sub 通道的全局样式模式。可以指定多个通道模式。请注意,模式匹配仅适用于PUBLISH
和SUBSCRIBE
提到的通道,而PSUBSCRIBE
需要在通道模式与其允许的用户之间进行文字匹配。allchannels
:&*
的别名,允许用户访问所有 Pub/Sub 通道。resetchannels
:刷新允许的通道模式列表,如果用户不再能够访问各自的通道和/或通道模式,则断开用户的 Pub/Sub 客户端的连接。
配置用户的有效密码
><password>
:将此密码添加到用户的有效密码列表中。例如,>mypass
将“mypass”添加到有效密码列表中。此指令将清除 *nopass* 标志(参见后面)。每个用户可以拥有任意数量的密码。<<password>
:从有效密码列表中删除此密码。如果要尝试删除的密码实际上未设置,则会发出错误。#<hash>
:将此 SHA-256 哈希值添加到用户的有效密码列表中。此哈希值将与为 ACL 用户输入的密码的哈希值进行比较。这允许用户在acl.conf
文件中存储哈希值,而不是存储明文密码。仅接受 SHA-256 哈希值,因为密码哈希必须为 64 个字符,并且只包含小写十六进制字符。!<hash>
:从有效密码列表中删除此哈希值。当您不知道由哈希值指定的密码但想要从用户中删除密码时,这很有用。nopass
:删除用户的所有已设置密码,并将用户标记为不需要密码:这意味着每个密码都将在该用户上起作用。如果此指令用于默认用户,每个新连接都将立即使用默认用户进行身份验证,而无需任何显式的 AUTH 命令。请注意,*resetpass* 指令将清除此条件。resetpass
:刷新允许的密码列表,并删除 *nopass* 状态。在 *resetpass* 之后,用户没有关联的密码,并且没有办法进行身份验证,除非添加一些密码(或稍后将其设置为 *nopass*)。
注意:如果用户没有被标记为 nopass 并且没有有效的密码列表,那么该用户实际上无法使用,因为没有办法以该用户身份登录。
为用户配置选择器
(<rule list>)
: (在 Redis 7.0 及更高版本中可用) 创建一个新的选择器来匹配规则。选择器在用户权限之后进行评估,并且根据定义的顺序进行评估。如果命令与用户权限或任何选择器匹配,则允许该命令。有关详细信息,请参阅 选择器。clearselectors
: (在 Redis 7.0 及更高版本中可用) 删除附加到用户的所有选择器。
重置用户
reset
执行以下操作:resetpass、resetkeys、resetchannels、allchannels(如果设置了 acl-pubsub-default)、off、clearselectors、-@all。用户将返回到其创建后立即所处的相同状态。
使用 ACL SETUSER 命令创建和编辑用户 ACL
可以使用两种主要方式创建和修改用户
- 使用 ACL 命令及其
ACL SETUSER
子命令。 - 修改服务器配置,可以在其中定义用户,并重新启动服务器。使用 *外部 ACL 文件*,只需调用
ACL LOAD
即可。
在本节中,我们将学习如何使用 ACL
命令定义用户。有了这些知识,就可以轻松地通过配置文件完成相同的事情。在配置中定义用户需要单独的章节,将在后面的章节中分别讨论。
首先,尝试最简单的 ACL SETUSER
命令调用
> ACL SETUSER alice
OK
ACL SETUSER
命令接受用户名和应用于用户的 ACL 规则列表。但是上面的例子没有指定任何规则。这只会创建用户(如果用户不存在),使用新用户的默认设置。如果用户已经存在,上面的命令将不会做任何事情。
查看默认用户状态
> ACL LIST
1) "user alice off resetchannels -@all"
2) "user default on nopass ~* &* +@all"
新用户 "alice" 是
- 处于关闭状态,因此
AUTH
对用户 "alice" 不起作用。 - 该用户也没有设置任何密码。
- 无法访问任何命令。请注意,默认情况下,用户在创建时没有访问任何命令的权限,因此上面的输出中的
-@all
可以省略;但是,ACL LIST
尝试明确而不是隐式。 - 该用户无法访问任何键模式。
- 该用户无法访问任何 Pub/Sub 频道。
默认情况下,新用户以限制性权限创建。从 Redis 6.2 开始,ACL 还提供 Pub/Sub 频道访问管理。为了确保在升级到 Redis 6.2 时与版本 6.0 向后兼容,默认情况下,新用户被授予 "allchannels" 权限。默认值可以通过 acl-pubsub-default
配置指令设置为 resetchannels
。
从 7.0 开始,acl-pubsub-default
值被设置为 resetchannels
,默认情况下限制频道访问以提供更好的安全性。为了与以前的版本兼容,默认值可以通过 acl-pubsub-default
配置指令设置为 allchannels
。
这样的用户完全没用。让我们尝试定义用户,使其处于活动状态,具有密码,并且只能使用 GET
命令访问以字符串 "cached:" 开头的键名。
> ACL SETUSER alice on >p1pp0 ~cached:* +get
OK
现在用户可以做一些事情了,但会拒绝做其他事情
> AUTH alice p1pp0
OK
> GET foo
(error) NOPERM this user has no permissions to access one of the keys used as arguments
> GET cached:1234
(nil)
> SET cached:1234 zap
(error) NOPERM this user has no permissions to run the 'set' command
事情按预期进行。为了检查用户 alice 的配置(请记住用户名区分大小写),可以使用 ACL LIST
的替代方案,该方案旨在更适合计算机阅读,而 ACL GETUSER
更适合人类阅读。
> ACL GETUSER alice
1) "flags"
2) 1) "on"
3) "passwords"
4) 1) "2d9c75..."
5) "commands"
6) "-@all +get"
7) "keys"
8) "~cached:*"
9) "channels"
10) ""
11) "selectors"
12) (empty array)
ACL GETUSER
返回一个字段-值数组,以更易解析的术语描述用户。输出包括标志集、键模式列表、密码等等。如果我们使用 RESP3,输出可能更易读,因此它将作为地图回复返回
> ACL GETUSER alice
1# "flags" => 1~ "on"
2# "passwords" => 1) "2d9c75273d72b32df726fb545c8a4edc719f0a95a6fd993950b10c474ad9c927"
3# "commands" => "-@all +get"
4# "keys" => "~cached:*"
5# "channels" => ""
6# "selectors" => (empty array)
注意:从现在开始,我们将继续使用 Redis 默认协议,版本 2
使用另一个 ACL SETUSER
命令(来自不同的用户,因为 alice 无法运行 ACL
命令),我们可以向用户添加多个模式
> ACL SETUSER alice ~objects:* ~items:* ~public:*
OK
> ACL LIST
1) "user alice on #2d9c75... ~cached:* ~objects:* ~items:* ~public:* resetchannels -@all +get"
2) "user default on nopass ~* &* +@all"
现在,内存中的用户表示与我们预期的一致。
多次调用 ACL SETUSER
理解多次调用 ACL SETUSER
时发生的情况非常重要。需要了解的是,每次 ACL SETUSER
调用都不会重置用户,而只是将 ACL 规则应用于现有用户。只有在用户之前未知的情况下才会重置用户。在这种情况下,将使用零 ACL 创建一个全新的用户。该用户无法执行任何操作,被禁止,没有密码,等等。这是为了安全起见最佳的默认值。
但是,以后的调用只会增量地修改用户。例如,以下序列
> ACL SETUSER myuser +set
OK
> ACL SETUSER myuser +get
OK
将导致 myuser 能够同时调用 GET
和 SET
> ACL LIST
1) "user default on nopass ~* &* +@all"
2) "user myuser off resetchannels -@all +get +set"
命令类别
通过逐个指定所有命令来设置用户 ACL 非常麻烦,因此我们使用以下方法
> ACL SETUSER antirez on +@all -@dangerous >42a979... ~*
通过说 +@all
和 -@dangerous
,我们包含了所有命令,然后删除了 Redis 命令表中标记为危险的所有命令。请注意,命令类别永远不包括模块命令,除了 +@all
。如果您说 +@all
,用户可以执行所有命令,甚至包括通过模块系统加载的将来命令。但是,如果您使用 ACL 规则 +@read
或其他任何规则,则模块命令始终被排除在外。这非常重要,因为您应该只信任 Redis 内部命令表。模块可能会公开危险的东西,在只是添加性的 ACL 中,即以 +@all -...
的形式。您应该绝对确保您永远不会包含您不想包含的内容。
以下是命令类别及其含义的列表
- admin - 管理命令。普通应用程序永远不需要使用这些命令。包括
REPLICAOF
、CONFIG
、DEBUG
、SAVE
、MONITOR
、ACL
、SHUTDOWN
等等。 - bitmap - 数据类型:与位图相关。
- blocking - 可能阻塞连接,直到由另一个命令释放。
- connection - 影响连接或其他连接的命令。这包括
AUTH
、SELECT
、COMMAND
、CLIENT
、ECHO
、PING
等等。 - dangerous - 可能存在危险的命令(每个命令都应谨慎考虑,原因各不相同)。这包括
FLUSHALL
、MIGRATE
、RESTORE
、SORT
、KEYS
、CLIENT
、DEBUG
、INFO
、CONFIG
、SAVE
、REPLICAOF
等等。 - geo - 数据类型:与地理空间索引相关。
- hash - 数据类型:与哈希相关。
- hyperloglog - 数据类型:与 HyperLogLog 相关。
- fast - 快速 O(1) 命令。可能在参数数量上循环,但不在键中的元素数量上循环。
- keyspace - 以类型无关的方式写入或读取键、数据库或其元数据。包括
DEL
、RESTORE
、DUMP
、RENAME
、EXISTS
、DBSIZE
、KEYS
、EXPIRE
、TTL
、FLUSHALL
等等。可能修改键空间、键或元数据的命令也将具有write
类别。仅读取键空间、键或元数据的命令将具有read
类别。 - list - 数据类型:与列表相关。
- pubsub - 与 Pub/Sub 相关的命令。
- read - 从键(值或元数据)读取。请注意,不与键交互的命令将不具有
read
或write
。 - scripting - 与脚本相关。
- set - 数据类型:与集合相关。
- sortedset - 数据类型:与有序集合相关。
- slow - 所有不属于
fast
的命令。 - stream - 数据类型:与流相关。
- string - 数据类型:与字符串相关。
- transaction - 与
WATCH
/MULTI
/EXEC
相关的命令。 - write - 写入键(值或元数据)。
Redis 还可以使用 Redis ACL CAT
命令向您显示所有类别的列表以及每个类别包含的确切命令。它可以用两种形式使用
ACL CAT -- Will just list all the categories available
ACL CAT <category-name> -- Will list all the commands inside the category
示例
> 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"
如您所见,到目前为止,有 21 个不同的类别。现在让我们检查一下 geo 类别中包含哪些命令
> ACL CAT geo
1) "geohash"
2) "georadius_ro"
3) "georadiusbymember"
4) "geopos"
5) "geoadd"
6) "georadiusbymember_ro"
7) "geodist"
8) "georadius"
9) "geosearch"
10) "geosearchstore"
请注意,命令可能属于多个类别。例如,像 +@geo -@read
这样的 ACL 规则将导致某些地理命令被排除在外,因为它们是只读命令。
允许/阻止子命令
从 Redis 7.0 开始,子命令可以像其他命令一样被允许/阻止(通过在命令和子命令之间使用分隔符 |
,例如:+config|get
或 -config|set
)
这对所有命令都适用,除了 DEBUG。为了允许/阻止特定的 DEBUG 子命令,请参见下一节。
允许被阻止命令的第一个参数
注意:此功能自 Redis 7.0 以来已弃用,可能会在将来删除。
有时,排除或包含整个命令或子命令的能力还不够。许多部署可能不愿意提供对任何数据库执行 SELECT
的能力,但可能仍然希望能够运行 SELECT 0
。
在这种情况下,我们可以通过以下方式更改用户的 ACL
ACL SETUSER myuser -select +select|0
首先,删除 SELECT
命令,然后添加允许的第一个参数。请注意,无法执行反向操作,因为第一个参数只能添加,不能排除。指定对某些用户有效的第一个参数更安全,因为将来可能会添加新的第一个参数。
另一个例子
ACL SETUSER myuser -debug +debug|digest
请注意,第一个参数匹配可能会增加一些性能损失;但是,即使使用合成基准也很难衡量。额外的 CPU 成本仅在调用此类命令时支付,而不是在调用其他命令时支付。
可以使用此机制在 7.0 之前的 Redis 版本中允许子命令(参见上一节)。
+@all
VS -@all
在上一节中,我们观察了如何可以基于添加/删除单个命令来定义命令 ACL。
选择器
从 Redis 7.0 开始,Redis 支持添加多个规则集,这些规则集相互独立地进行评估。这些辅助权限集称为选择器,通过将一组规则括在括号中来添加。为了执行命令,必须匹配根权限(在括号之外定义的规则)或任何选择器(在括号中定义的规则)。在内部,首先检查根权限,然后按添加顺序检查选择器。
例如,考虑一个具有 ACL 规则 +GET ~key1 (+SET ~key2)
的用户。该用户能够执行 GET key1
和 SET key2 hello
,但不能执行 GET key2
或 SET key1 world
。
与用户的根权限不同,选择器在添加后无法修改。相反,选择器可以使用 clearselectors
关键字删除,这将删除所有添加的选择器。请注意,clearselectors
不会删除根权限。
键权限
从 Redis 7.0 开始,键模式也可以用来定义命令如何才能触及键。这是通过定义键权限的规则来实现的。键权限规则采用 %(<permission>)~<pattern>
的形式。权限定义为单个字符,映射到以下键权限
- W (写入):存储在键中的数据可以更新或删除。
- R (读取):从键中处理、复制或返回用户提供的數據。请注意,这并不包括元数据,例如大小信息(例如
STRLEN
)、类型信息(例如TYPE
)或集合中是否存在值的資訊(例如SISMEMBER
)。
可以通过指定多个字符来组合权限。将权限指定为 "RW" 被认为是完全访问权限,类似于只传入 ~<pattern>
。
举个具体的例子,假设一个用户有以下 ACL 规则:+@all ~app1:* (+@read ~app2:*)
。该用户对 app1:*
拥有完全访问权限,对 app2:*
拥有只读权限。然而,某些命令支持从一个键读取数据,进行一些转换,并将数据存储到另一个键中。其中一个这样的命令是 COPY
命令,它将源键中的数据复制到目标键中。上面例子的 ACL 规则无法处理将数据从 app2:user
复制到 app1:user
的请求,因为根权限和选择器都无法完全匹配命令。但是,使用键选择器,您可以定义一组能够处理此请求的 ACL 规则:+@all ~app1:* %R~app2:*
。第一个模式可以匹配 app1:user
,第二个模式可以匹配 app2:user
。
命令所需的权限类型在 键规范 中有说明。权限类型基于键的逻辑操作标志。插入、更新和删除标志对应于写入键权限。访问标志对应于读取键权限。如果键没有逻辑操作标志,例如 EXISTS
,用户仍然需要读取键或写入键权限才能执行命令。
注意:在评估执行命令是否需要读取权限时,会忽略访问用户数据的旁路。这意味着某些返回关于修改键的元数据的写入命令只需要对键拥有写入权限才能执行。例如,考虑以下两个命令:
LPUSH key1 data
:修改 "key1",但只返回关于它的元数据,即推送后列表的大小,因此命令只需要对 "key1" 拥有写入权限即可执行。LPOP key2
:修改 "key2",但也返回来自它的数据,即列表中最左边的元素,因此命令需要对 "key2" 拥有读写权限才能执行。
如果应用程序需要确保没有从键中访问任何数据,包括旁路,建议不要向该键提供任何访问权限。
密码在内部的存储方式
Redis 内部使用 SHA256 对密码进行哈希存储。如果您设置密码并查看 ACL LIST
或 ACL GETUSER
的输出,您将看到一个看起来很随机的长的十六进制字符串。以下是一个示例,因为在之前的示例中,为了简洁起见,省略了长的十六进制字符串
> ACL GETUSER default
1) "flags"
2) 1) "on"
3) "passwords"
4) 1) "2d9c75273d72b32df726fb545c8a4edc719f0a95a6fd993950b10c474ad9c927"
5) "commands"
6) "+@all"
7) "keys"
8) "~*"
9) "channels"
10) "&*"
11) "selectors"
12) (empty array)
使用 SHA256 可以避免以明文方式存储密码,同时仍然允许使用非常快的 AUTH
命令,这是 Redis 的一个非常重要的功能,并且与客户端对 Redis 的期望一致。
然而,ACL 密码实际上并不是密码。它们是服务器和客户端之间共享的秘密,因为密码不是人类使用的身份验证令牌。例如
- 没有长度限制,密码只需要在一些客户端软件中被记住。在这种情况下,没有人需要记住密码。
- ACL 密码不会保护任何其他东西。例如,它永远不会成为某个电子邮件帐户的密码。
- 通常,当您可以访问哈希密码本身时,例如完全访问给定服务器的 Redis 命令,或者破坏系统本身,您实际上已经访问了密码保护的内容:Redis 实例的稳定性和它包含的数据。
因此,减慢密码身份验证速度,以使用时间和空间来使密码破解变得困难,是一个非常糟糕的选择。我们建议您生成强密码,这样即使有人拥有哈希值,也无法使用字典或暴力破解攻击破解密码。为此,有一个特殊的 ACL 命令 ACL GENPASS
,可以使用系统加密伪随机数生成器生成密码
> ACL GENPASS
"dd721260bfe1b3d9601e7fbab36de6d04e2e67b0ef1c53de59d45950db0dd3cc"
该命令输出一个 32 字节(256 位)的伪随机字符串,并将其转换为 64 字节的字母数字字符串。这足够长,可以避免攻击,而且足够短,易于管理、剪切粘贴、存储等等。这就是您应该用来生成 Redis 密码的方法。
使用外部 ACL 文件
有两种方法可以在 Redis 配置中存储用户
- 用户可以直接在
redis.conf
文件中指定。 - 可以指定一个外部 ACL 文件。
这两种方法是 相互排斥 的,因此 Redis 会要求您使用其中一种。在 redis.conf
中指定用户适合简单的用例。当需要在一个复杂的環境中定义多个用户时,我们建议您使用 ACL 文件。
在 redis.conf
和外部 ACL 文件中使用的格式完全相同,因此在两者之间切换非常容易,格式如下:
user <username> ... acl rules ...
例如
user worker +@list +@connection ~jobs:* on >ffa9203c493aa99
当您想使用外部 ACL 文件时,需要指定名为 aclfile
的配置指令,例如
aclfile /etc/redis/users.acl
当您只在 redis.conf
文件中直接指定几个用户时,可以使用 CONFIG REWRITE
将新的用户配置存储到文件中,方法是重写该文件。
然而,外部 ACL 文件更加强大。您可以执行以下操作:
- 如果您手动修改了 ACL 文件,并希望 Redis 重新加载新的配置,可以使用
ACL LOAD
。注意,此命令只能在所有用户都正确指定的情况下加载文件。否则,会向用户报告错误,并且旧的配置仍然有效。 - 使用
ACL SAVE
将当前 ACL 配置保存到 ACL 文件。
注意 CONFIG REWRITE
不会触发 ACL SAVE
。当您使用 ACL 文件时,配置和 ACL 是分别处理的。
Sentinel 和 Replica 的 ACL 规则
如果您不想向 Redis Replica 和 Redis Sentinel 实例提供对您的 Redis 实例的完全访问权限,则需要允许以下命令才能使所有内容正常工作。
对于 Sentinel,允许用户在主实例和副本实例中访问以下命令:
- AUTH、CLIENT、SUBSCRIBE、SCRIPT、PUBLISH、PING、INFO、MULTI、SLAVEOF、CONFIG、CLIENT、EXEC。
Sentinel 不需要访问数据库中的任何键,但会使用 Pub/Sub,因此 ACL 规则如下(注意:AUTH
不需要,因为它始终被允许):
ACL SETUSER sentinel-user on >somepassword allchannels +multi +slaveof +ping +exec +subscribe +config|rewrite +role +publish +info +client|setname +client|kill +script|kill
Redis Replica 需要在主实例上允许以下命令:
- PSYNC、REPLCONF、PING
不需要访问任何键,因此这转换为以下规则:
ACL setuser replica-user on >somepassword +psync +replconf +ping
注意,您不需要配置副本以允许主实例执行任何命令集。从副本的角度来看,主实例始终以 root 用户身份进行身份验证。