如何配置 Redis ACL 账号权限限制特定命令访问

文章导读
Redis 6.0 及以上版本支持通过 ACL(访问控制列表)机制限制特定命令访问,推荐使用ACL SETUSER命令创建独立账号并显式授予或禁止具体命令。此配置适用于多租户隔离、运维权限最小化场景,需注意默认 default 用户权限过大带来的风险边界。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

Redis 6.0 及以上版本支持通过 ACL(访问控制列表)机制限制特定命令访问,推荐使用ACL SETUSER命令创建独立账号并显式授予或禁止具体命令。此配置适用于多租户隔离、运维权限最小化场景,需注意默认 default 用户权限过大带来的风险边界。

先说结论:Redis 6.0+ 原生支持 ACL 细粒度权限控制,可通过命令白名单或黑名单机制限制账号操作范围。

  • 适合:自建 Redis 6.0+ 环境、需要区分读写权限或禁止高危命令(如 FLUSHALL)的场景。
  • 先准备:确认 Redis 版本不低于 6.0,规划好需要放行的命令列表和键空间模式。
  • 验收:使用新账号连接客户端执行被禁命令,确认返回 NOPERM 错误且正常命令可用。

命令速用版

以下命令可直接在 redis-cli 中执行,用于创建受限用户并限制特定命令。

ACL SETUSER limited_user on >StrongPassword123 ~app:* +GET +SET -FLUSHALL -FLUSHDB

上述配置创建了一个名为 limited_user 的账号,密码为 StrongPassword123,仅允许访问 app:* 前缀的键,允许 GET 和 SET 命令,显式禁止 FLUSHALL 和 FLUSHDB。

ACL SETUSER readonly_user on >ReadOnlyPass ~* +@read -@write -@dangerous

上述配置创建只读账号,利用命令类别(category)批量授权,+@read 允许所有读命令,-@write 和 -@dangerous 禁止写操作和高危命令。

为什么会这样

Redis 6.0 之前仅支持单密码认证,所有连接拥有相同权限,无法区分操作级别。ACL 机制引入后,每个用户可独立配置命令权限、键空间权限和频道权限,实现最小权限原则。默认 default 用户通常拥有所有权限,若不禁用或限制,存在误操作风险。

分步处理

按以下步骤配置 ACL 权限,确保配置生效且持久化。

如何配置 Redis ACL 账号权限限制特定命令访问

1. 确认 Redis 版本
执行redis-server `--version`INFO SERVER,确保版本号大于等于 6.0。低版本不支持 ACL 功能,无法执行相关命令。

2. 创建用户并设置密码
使用ACL SETUSER创建用户,on表示启用,>后接明文密码。例如:ACL SETUSER worker on >WorkPass123。此时用户默认无权限(-@all),需后续授权。

3. 配置命令权限
采用白名单模式更安全,仅添加需要的命令。例如只允许读写特定键:ACL SETUSER worker +GET +SET +DEL ~data:*。若需禁止特定高危命令,可在全权限基础上移除:ACL SETUSER admin +@all -FLUSHALL -CONFIG

4. 配置键空间权限
使用~前缀限制可访问的键名模式。例如~user:*仅允许访问 user 开头的键。未匹配模式的键操作将返回 NOPERM 错误。

5. 持久化配置
命令行配置重启后失效,需执行ACL SAVE将规则写入 redis.conf 指定的 aclfile 文件中。或在 redis.conf 中直接配置aclfile /path/to/users.acl并静态定义用户规则。

怎么验证是否生效

配置完成后,需通过命令检查和实际连接测试验证权限。

如何配置 Redis ACL 账号权限限制特定命令访问

1. 查看用户列表
执行ACL LIST查看所有用户规则,确认新用户的命令限制和键模式是否正确显示。

2. 查看用户详情
执行ACL GETUSER <username>,检查 flags、commands、keys 字段,确认无多余权限。

3. 客户端连接测试
使用新账号连接:redis-cli -a <password> `--user` <username>。执行被禁命令(如 FLUSHALL),应返回(error) NOPERM错误。执行允许命令(如 GET),应正常返回结果。

常见坑

配置 ACL 时容易忽略默认用户权限和持久化问题,导致安全策略失效。

1. 默认用户权限过大
default 用户默认拥有所有权限且可能无密码。建议为 default 设置强密码或禁用:ACL SETUSER default off,强制所有连接使用特定账号。

2. 权限未持久化
仅在命令行执行ACL SETUSER重启后会丢失。必须执行ACL SAVE或配置 aclfile 文件,确保重启后规则依然生效。

如何配置 Redis ACL 账号权限限制特定命令访问

3. 键模式与命令不匹配
即使命令权限开放,若键名不匹配~pattern也会失败。例如授权了 SET 但键模式为~app:*,操作SET user:1会被拒绝。

4. 命令类别覆盖
使用+@all后再用-COMMAND禁止特定命令时,需确认命令类别定义。部分命令可能属于多个类别,建议直接用具体命令名控制更精准。

常见问题

Redis 5.0 版本能配置 ACL 吗?

不能,ACL 功能是 Redis 6.0 引入的新特性,5.0 及以下版本仅支持单密码认证,无法实现细粒度命令控制。

如何禁止用户执行 FLUSHALL 命令?

使用ACL SETUSER <name> -FLUSHALL从用户权限中移除该命令,或在授予+@all后显式减去-FLUSHALL

ACL 配置修改后需要重启 Redis 吗?

不需要,ACL SETUSER动态生效。但需执行ACL SAVE持久化到文件,否则重启后配置会丢失。

如何查看当前连接使用的是哪个用户?

执行ACL WHOAMI命令,返回当前认证的用户名,未认证状态下默认返回 default。

参考来源

  • 知识库:怎样在 Redis 6.0 中使用 ACL 权限控制订阅频道_通过 setuser 命令限制 Channel 访问
  • 知识库:1、通过 Redis 的 ACL(访问控制列表)机制,限制对 HLL 命令的使用。
  • 知识库:自建 Redis 中设置 ACL 用户和权限
  • 知识库:Redis(92) 如何配置 Redis 的 ACL?_redis acl 设置-CSDN 博客
  • 知识库:Redis6.0 新特性——ACL(权限控制列表) 实现限制用户可执行命令和 KEY_redis acl setuser-CSDN 博客
  • 知识库:理解 Redis 6.0 的用户管理:访问控制列表 (ACL) 及其持久化