Redis ACL 规则说明

本文详细解读了Redis的AccessControlList(ACL)功能,包括配置方式、规则定义、用户权限控制、命令操作和持久化策略。重点介绍了如何启用/禁用用户、设置命令权限和访问Key,以及关键的管理命令如ACLHELP、ACLCAT等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

make great efforts

前情回顾

上一篇文章 我们整体性的介绍了 RedisACL,我们来回顾下 ACL 的两种配置方式。

redis 使用 acl 有两种方式可以配置,分别是 configaclfile 模式。在 config 配置文件中配置的 ACL 权限,需要执行 ACL LOAD 或者 重启 Redis 服务 才能生效,事实上我们可以直接在命令行下配置 ACL,在命令行模式下配置的权限无需重启服务即可生效。

我们也可以在命令行模式下配置 ACL 并将其持久化到 aclfile 或者 config 文件中(这取决于配置文件中选择的是 config模式 还是 外部 aclfile 模式),一旦将 user 权限持久化到 aclfileconfig 文件中,下次重启就会自动加载该权限,注意如果忘记持久化,一旦服务宕机或重启,该权限就会丢失。

# 如果使用 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 SAVEACL 权限持久化到 aclfile 中:
# 将 acl 权限持久化到磁盘的 aclfile 中
acl save

# 如果使用 redis.conf 配置 ACL,则使用 config rewrite 命令将 ACL 持久化到 redis.conf 中
config rewrite
  • AUTH,使用 auth 命令切换用户:
AUTH <username> <password>

以上就是关于 Redis ACL 命令的详细说明,你 “学废” 了么?

“只有每天不断学习,才能成长为更好的自己。” – 巨石强森(Dwayne Johnson)

<think>好的,我现在需要帮助用户解决如何使用C++实现RedisACL权限控制。首先,我得确认用户的需求。用户提到了ACL和C++操作Redis,所以核心应该是如何在C++代码中应用RedisACL功能。 首先,我应该回顾一下RedisACL系统。根据引用[1]和[2],ACL是从Redis 6开始详细支持的,允许对用户进行细粒度的权限控制,比如限制可以执行的命令。用户可能需要在C++客户端中配置用户权限,比如认证、选择用户、执行命令等。 接下来,我需要考虑C++中常用的Redis客户端库。常见的有hiredisredis-plus-plus等。比如,redis-plus-plus是对hiredis的封装,可能更方便使用。用户需要先确保使用的库支持Redis 6的ACL命令,比如AUTH、ACL WHOAMI、ACL SETUSER等。 然后,我需要分步骤说明如何实现。首先,创建用户并设置权限,这可能在Redis服务端通过命令行完成,比如使用ACL SETUSER命令。然后在C++代码中,连接Redis时需要以特定用户身份进行认证,使用AUTH命令带上用户名和密码。例如,AUTH username password。 接着,需要考虑如何在代码中执行命令,并验证权限。比如,如果一个用户被禁止执行FLUSHDB,尝试执行时应该会收到错误。这时候需要在代码中处理异常或错误信息。 另外,用户可能需要动态修改权限,比如在运行时通过ACL SETUSER调整权限。这时候可以在C++代码中发送这些命令,但需要确保当前连接的用户权限执行ACL操作,通常需要管理员权限。 还要注意引用中的信息,比如引用[3]提到创建普通用户启动Redis,设置权限和目录归属,这可能影响客户端连接时的权限配置。引用[4]提到了配置文件中的requirepass,但ACL更灵活,可以针对不同用户设置不同密码和权限。 可能的实现步骤包括: 1. 在Redis服务端创建ACL用户,设置密码和权限。 2. 在C++代码中使用hiredisredis-plus-plus连接到Redis,使用AUTH进行认证。 3. 执行命令并处理权限相关的错误。 4. 可选:在代码中动态管理ACL规则,比如添加用户或修改权限。 需要验证各个步骤的正确性,比如确保库支持ACL命令,正确处理认证,以及错误处理机制。此外,可能还需要考虑连接池、异步操作等高级用法,但用户当前的问题可能集中在基础的ACL使用上。 最后,生成相关问题,比如如何创建用户,如何处理权限错误,动态调整权限的方法等。确保问题覆盖用户可能进一步探索的方向。</think>### 如何用 C++ 实现 RedisACL 权限控制 #### 1. 准备工作 - **Redis 版本要求**:确保 Redis 服务端版本 ≥ 6.0,ACL 功能需要 Redis 6+ 支持[^2]。 - **C++ 客户端库选择**:推荐使用支持 Redis 6 ACL 的库,如: - **hiredis**(官方 C 库,可通过封装实现) - **redis-plus-plus**(C++ 封装库,语法更友好) #### 2. 实现步骤 ##### (1) 服务端配置 ACL 用户 通过 Redis CLI 创建用户并设置权限(需管理员权限): ```bash # 创建用户 "cpp_user",密码为 "secret",仅允许 GET/SET 命令 ACL SETUSER cpp_user on >secret ~* &* +@read +@write -@all ``` ##### (2) C++ 代码实现认证与操作 以 **redis-plus-plus** 库为例: ```cpp #include <sw/redis++/redis++.h> using namespace sw::redis; int main() { try { // 连接时指定用户和密码 auto redis = Redis("tcp://127.0.0.1:6379", ConnectionOptions() .user("cpp_user") .password("secret")); // 执行允许的命令 redis.set("key", "value"); auto val = redis.get("key"); // 尝试执行未授权命令(会抛出异常) // redis.flushdb(); // 触发 NOPERM 错误 } catch (const Error &e) { // 捕获权限错误 if (e.what().find("NOPERM") != std::string::npos) { std::cerr << "Permission denied" << std::endl; } } return 0; } ``` #### 3. 关键 API 说明 | 操作 | 代码示例 | 说明 | |--------------------|----------------------------------|---------------------------------------| | 用户认证 | `ConnectionOptions().user().password()` | 连接时绑定用户身份[^1] | | 动态修改 ACL | `redis.command("ACL", "SETUSER", ...)` | 需当前用户有 `acl` 权限 | | 权限验证 | 捕获 `NOPERM` 异常 | 所有未授权操作会返回错误[^2] | #### 4. 权限管理建议 - **最小权限原则**:通过 `+<command>`/`-<command>` 精细化控制命令权限[^1] - **分类标签**:使用 `+@read`、`-@admin` 等预定义分类简化配置 - **密码存储**:避免硬编码密码,建议通过环境变量或配置文件读取
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChaITSimpleLove

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值