文档:ACL

Valkey ACL,即访问控制列表,是一项允许对某些连接执行的命令和可访问的键进行限制的功能。其工作方式是,客户端连接后需要提供用户名和有效的密码进行认证。如果认证成功,该连接将与给定用户及其权限关联。Valkey 可以配置为新连接已通过“默认”用户进行认证(这是默认配置)。配置默认用户的副作用是,能够仅向未明确认证的连接提供特定功能的子集。

标准认证方式是 AUTH 命令的两个参数形式

AUTH <username> <password>

如果密码有效且匹配,连接将认证为名为 <username> 的用户。

当使用该命令的单参数形式时(仅指定密码),则假定隐式用户名为“default”。

AUTH <password>

此形式通过“default”用户的密码进行认证,该密码可通过 ACL 或设置 requirepass 来设置。

ACL 何时有用

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

  1. 您希望通过限制对命令和键的访问来提高安全性,以便不信任的客户端无法访问,而受信任的客户端仅拥有访问数据库所需的最低权限级别,以执行所需的工作。例如,某些客户端可能只能执行只读命令。
  2. 您希望提高操作安全性,以便访问 Valkey 的进程或人员不会因软件错误或手动失误而损坏数据或配置。例如,一个从 Valkey 获取延迟作业的工作程序没有理由能够调用 FLUSHALL 命令。

ACL 的另一个典型用法与托管 Valkey 实例有关。Valkey 经常作为托管服务提供,无论是公司内部团队为其他内部客户处理 Valkey 基础设施,还是由云提供商以软件即服务的方式提供。在这两种设置中,我们都希望确保客户无法使用配置命令。

使用 ACL 命令配置 ACL

ACL 是使用一种 DSL(领域特定语言)定义的,该语言描述了给定用户被允许做什么。这些规则总是从第一条到最后一条,从左到右地执行,因为有时规则的顺序对于理解用户真正能够做什么很重要。

默认情况下,定义了一个名为 default 的用户。我们可以使用 ACL LIST 命令来检查当前活动的 ACL 并验证一个新启动的、默认配置的 Valkey 实例的配置是什么

> ACL LIST
1) "user default on nopass ~* &* +@all"

上面的命令以 Valkey 配置文件中使用的相同格式报告用户列表,通过将当前为用户设置的 ACL 转换回其描述。

每行的前两个词是“user”后面跟着用户名。接下来的词是描述不同事物的 ACL 规则。我们将详细展示这些规则如何工作,但现在只需知道默认用户配置为启用 (on),不需要密码 (nopass),可以访问所有可能的键 (~*) 和 Pub/Sub 通道 (&*),并且可以调用所有可能的命令 (+@all)。

此外,在默认用户的特殊情况下,拥有 nopass 规则意味着新连接将自动使用默认用户进行认证,而无需任何显式的 AUTH 调用。

ACL 规则

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

启用和禁用用户

  • on:启用用户:可以以此用户身份进行认证。
  • off:禁用用户:不再可能以此用户进行认证;但是,先前已认证的连接仍将正常工作。请注意,如果默认用户被标记为 off,则新连接将以未认证状态开始,并将要求用户发送 AUTH 或带有 AUTH 选项的 HELLO 以某种方式进行认证,无论默认用户配置如何。

允许和禁止命令

  • +<command>:将命令添加到用户可以调用的命令列表中。可与 | 一起使用以允许子命令(例如 "+config|get")。
  • -<command>:从用户可以调用的命令列表中移除命令。从 Valkey 7.0 开始,可与 | 一起使用以阻止子命令(例如 "-config|set")。
  • +@<category>:将该类别中的所有命令添加到用户可调用的列表中,有效类别包括 @admin、@set、@sortedset 等,请通过调用 ACL CAT 命令查看完整列表。特殊类别 @all 表示所有命令,包括服务器中当前存在的命令以及将来通过模块加载的命令。
  • -@<category>:类似于 +@<category>,但从客户端可以调用的命令列表中移除命令。
  • +<command>|first-arg:允许一个被禁用命令的特定第一个参数。它只支持没有子命令的命令,并且不允许以负形式出现,如 -SELECT|1,只能以“+”开头添加。此功能已弃用,将来可能会被移除。
  • allcommands+@all 的别名。请注意,它意味着能够执行通过模块系统加载的所有未来命令。
  • nocommands-@all 的别名。

允许和禁止特定键和键权限

  • ~<pattern>:添加一个可在命令中提及的键模式。例如 ~* 允许所有键。该模式是一个 glob 风格的模式,类似于 KEYS 的模式。可以指定多个模式。
  • %R~<pattern>:添加指定的读取键模式。这与常规键模式行为类似,但仅授予读取匹配给定模式的键的权限。更多信息请参阅键权限
  • %W~<pattern>:添加指定的写入键模式。这与常规键模式行为类似,但仅授予写入匹配给定模式的键的权限。更多信息请参阅键权限
  • %RW~<pattern>~<pattern> 的别名。
  • allkeys~* 的别名。
  • resetkeys:刷新允许的键模式列表。例如,ACL ~foo:* ~bar:* resetkeys ~objects:* 将只允许客户端访问匹配 objects:* 模式的键。

允许和禁止 Pub/Sub 通道

  • &<pattern>:添加一个 glob 风格的 Pub/Sub 通道模式,用户可以访问这些通道。可以指定多个通道模式。请注意,模式匹配仅针对 PUBLISHSUBSCRIBE 中提及的通道进行,而 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>):创建一个新的选择器以匹配规则。选择器在用户权限之后进行评估,并按照它们定义的顺序进行评估。如果命令与用户权限或任何选择器匹配,则允许执行。更多信息请参阅选择器
  • clearselectors:删除附加到用户的所有选择器。

重置用户

  • reset 执行以下操作:resetpass、resetkeys、resetchannels、allchannels(如果设置了 acl-pubsub-default)、off、clearselectors、-@all。用户恢复到其创建后的立即状态。

使用 ACL SETUSER 命令创建和编辑用户 ACL

用户可以通过两种主要方式创建和修改

  1. 使用 ACL 命令及其 ACL SETUSER 子命令。
  2. 修改服务器配置,其中可以定义用户,然后重新启动服务器。对于外部 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 通道。

这样的用户完全没用。让我们尝试定义用户,使其处于活动状态,有密码,并且只能使用 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)

注意:从现在开始,我们将继续使用 Valkey 默认协议,版本 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,我们包含了所有命令,然后移除了 Valkey 命令表中标记为危险的所有命令。请注意,命令类别绝不包括模块命令,除了 +@all。如果您说 +@all,则用户可以执行所有命令,甚至包括将来通过模块系统加载的命令。但是,如果您使用 ACL 规则 +@read 或任何其他规则,则模块命令总是被排除。这非常重要,因为您应该只信任 Valkey 内部命令表。模块可能会暴露危险的东西,并且在 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 - PubSub 相关命令。
  • read - 从键中读取(值或元数据)。请注意,不与键交互的命令,将不具有 readwrite
  • scripting - 脚本相关。
  • set - 数据类型:集合相关。
  • sortedset - 数据类型:有序集合相关。
  • slow - 所有不属于 fast 的命令。
  • stream - 数据类型:流相关。
  • string - 数据类型:字符串相关。
  • transaction - WATCH / MULTI / EXEC 相关命令。
  • write - 写入键(值或元数据)。

Valkey 还可以使用 Valkey 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 规则将导致某些 geo 命令被排除,因为它们是只读命令。

允许/禁止子命令

子命令可以像其他命令一样被允许/禁止(通过在命令和子命令之间使用分隔符 |,例如:+config|get-config|set

除了 DEBUG,所有命令都适用。为了允许/禁止特定的 DEBUG 子命令,请参阅下一节。

允许被阻止命令的第一个参数

注意:此功能已弃用,将来可能会被移除。

有时,完全排除或包含一个命令或子命令的能力是不够的。许多部署可能不乐意提供执行任何 DB 的 SELECT 命令的能力,但仍希望能够运行 SELECT 0

在这种情况下,我们可以通过以下方式修改用户的 ACL

ACL SETUSER myuser -select +select|0

首先,移除 SELECT 命令,然后添加允许的第一个参数。请注意,无法反向操作,因为第一个参数只能添加,不能排除。更安全的做法是指定对某些用户有效的所有第一个参数,因为将来可能会添加新的第一个参数。

另一个例子

ACL SETUSER myuser -debug +debug|digest

请注意,第一个参数匹配可能会带来一些性能损失;但是,即使使用合成基准测试也难以衡量。额外的 CPU 成本仅在调用此类命令时支付,而不是在调用其他命令时支付。

可以在 Valkey 7.0 之前的版本中使用此机制来允许子命令(参见上一节)。

+@all 与 -@all

在上一节中,我们观察到如何通过添加/移除单个命令来定义命令 ACL。

选择器

Valkey 支持添加多组独立评估的规则。这些辅助权限集称为选择器,通过将一组规则包装在括号中来添加。要执行一个命令,根权限(在括号外定义的规则)或任何选择器(在括号内定义的规则)必须与给定命令匹配。内部,首先检查根权限,然后按照添加的顺序检查选择器。

例如,考虑一个具有 ACL 规则 +GET ~key1 (+SET ~key2) 的用户。该用户能够执行 GET key1SET key2 hello,但不能执行 GET key2SET key1 world

与用户的根权限不同,选择器一旦添加就无法修改。相反,选择器可以使用 clearselectors 关键字删除,该关键字会删除所有已添加的选择器。请注意,clearselectors 不会删除根权限。

键权限

键模式也可以用来定义命令如何访问键。这是通过定义键权限的规则来实现的。键权限规则的形式为 %(<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”同时具有读取和写入权限才能执行。

如果应用程序需要确保不从键访问任何数据,包括侧通道,建议不要提供对该键的任何访问权限。

密码的内部存储方式

Valkey 内部将密码以 SHA256 哈希形式存储。如果您设置一个密码并检查 ACL LISTACL 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 命令,这是 Valkey 的一个非常重要的特性,并且与客户端对 Valkey 的期望一致。

然而,ACL 密码并非真正的密码。它们是服务器和客户端之间的共享秘密,因为密码不是人类使用的认证令牌。例如

  • 没有长度限制,密码只会存储在某个客户端软件中。在此上下文中,无需人工记忆密码。
  • ACL 密码不保护任何其他事物。例如,它绝不会是某个电子邮件帐户的密码。
  • 通常,当您能够通过完全访问给定服务器的 Valkey 命令,或破坏系统本身来访问哈希密码本身时,您已经可以访问密码所保护的内容:Valkey 实例的稳定性和其中包含的数据。

因此,为了使用一种消耗时间和空间以使密码破解困难的算法而降低密码认证速度,是一个非常糟糕的选择。我们建议的做法是生成强密码,这样即使攻击者拥有哈希值,也无法使用字典或暴力攻击来破解它。为此,有一个特殊的 ACL 命令 ACL GENPASS,它使用系统加密伪随机生成器来生成密码

> ACL GENPASS
"dd721260bfe1b3d9601e7fbab36de6d04e2e67b0ef1c53de59d45950db0dd3cc"

该命令输出一个 32 字节(256 位)的伪随机字符串,转换为 64 字节的字母数字字符串。它足够长以避免攻击,也足够短以便于管理、剪切粘贴、存储等。这就是您应该用来生成 Valkey 密码的方法。

使用外部 ACL 文件

Valkey 配置中存储用户有两种方式

  1. 用户可以直接在 valkey.conf 文件中指定。
  2. 可以指定外部 ACL 文件。

这两种方法是互不兼容的,所以 Valkey 会要求您二选一。在 valkey.conf 中指定用户适用于简单用例。在复杂环境中需要定义多个用户时,我们建议您使用 ACL 文件。

valkey.conf 和外部 ACL 文件中使用的格式完全相同,因此从一种切换到另一种非常简单,格式如下

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

例如

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

当您想使用外部 ACL 文件时,需要指定名为 aclfile 的配置指令,如下所示

aclfile /etc/valkey/users.acl

当您只是直接在 valkey.conf 文件中指定少量用户时,可以使用 CONFIG REWRITE 通过重写文件来存储新的用户配置。

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

  • 如果您手动修改了 ACL 文件并希望 Valkey 重新加载新配置,请使用 ACL LOAD。请注意,此命令仅在所有用户都正确指定的情况下才能加载文件。否则,会向用户报告错误,旧配置将保持有效。
  • 使用 ACL SAVE 将当前 ACL 配置保存到 ACL 文件。

请注意,CONFIG REWRITE 不会同时触发 ACL SAVE。当您使用 ACL 文件时,配置和 ACL 是分开处理的。

Sentinel 和 Replicas 的 ACL 规则

如果您不希望 Valkey 副本和 Valkey Sentinel 实例完全访问您的 Valkey 实例,那么以下是为使一切正常工作而必须允许的命令集。

对于 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

Valkey 副本需要主实例允许以下命令

  • PSYNC, REPLCONF, PING

不需要访问任何键,因此这转换为以下规则

ACL setuser replica-user on >somepassword +psync +replconf +ping

请注意,您无需将副本配置为允许主节点执行任何命令集。从副本的角度来看,主节点始终以根用户身份进行认证。