登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  数据库 >  Redis

Redis ACL 按命令和键前缀授权怎么设计

来源:17golang原创

时间:2026-09-07 10:34:03 251浏览 收藏

Redis ACL 设计最容易犯的错,是只给用户加一条很宽的命令权限,再用一个模糊的 key 通配符兜底。更稳妥的做法是把权限拆成三层:先确定服务用户,再列出它真正需要的命令,最后用 key pattern 限制它能触碰的键。下面用一个缓存服务和一个报表读取服务组成的小项目,演示这套拆法。

一个 Redis ACL 用户能否执行成功,至少要同时满足“命令被允许”和“命令涉及的 key 命中 pattern”。生产环境优先使用专用用户和窄前缀,不要把 ~*+@all 当作默认配置。
要点速览
  • +GET+SET 控制能做什么,~app:cache:* 控制能碰哪些键。
  • 缓存写入者与报表读取者分成两个用户,避免一个账号同时拥有两类业务边界。
  • 先用 ACL CAT 看命令分类,再用 ACL DRYRUN 验收允许和拒绝场景。

Redis ACL 设计先拆成三层:用户、命令、key pattern

假设项目有两个连接身份:app_cache 负责维护 app:cache:*,需要读、写、删除和设置过期时间;report_reader 只读取 app:report:*。这两个前缀不是装饰性命名,而是权限边界的一部分。

对象示例解决的问题
用户app_cache哪个服务在使用连接
命令规则+GET +SET这个服务能执行哪些动作
键规则~app:cache:*动作只能作用于哪些 key
Redis ACL 中 app_cache 与 report_reader 用户分别关联命令集合和 app:cache、app:report 键前缀的静态关系图
图1:Redis ACL 的三层边界,把用户身份、可执行命令和可访问 key 前缀分开管理。

~pattern 是读写都允许的 key 模式;Redis 7.0 及更高版本还支持 %R~%W~,可以进一步拆分读写权限。为了兼容更宽的部署范围,本文先用两个用户配合 ~,不把版本差异藏在示例里。

用 ACL SETUSER 组合用户、命令和 key pattern

先创建缓存服务用户。命令中的密码只是占位符,实际部署应从密钥管理系统注入,不能把示例密码直接带到生产环境。

# 清掉旧规则,避免重复执行时残留宽权限
redis-cli ACL SETUSER app_cache reset on >replace-with-a-secret \
  ~app:cache:* +get +mget +set +del +expire

# 报表账号只读自己的业务前缀
redis-cli ACL SETUSER report_reader reset on >replace-with-a-secret \
  ~app:report:* +get +mget +exists +ttl

reset 放在前面,是为了让这段配置具备幂等的起点;on 激活用户;+get 这类规则授予具体命令;最后的 ~... 限制 key。命令和 key 是两道门,只有其中一项匹配并不等于授权成功。

不要为了省事写成 +@all ~app:cache:*。key pattern 只约束带 key 参数的命令,像 FLUSHALL 这类面向整个数据库的命令不能靠前缀保护;如果确实使用了宽命令集合,就要显式移除危险命令。更推荐本文这种只列必要命令的配置。

用 ACL CAT 与 ACL DRYRUN 检查授权

命令分类适合做盘点,不适合替代最终的最小权限清单。先查看某个分类包含什么,再把真正需要的单个命令写进用户规则:

# 查看 read 分类当前包含哪些命令
redis-cli ACL CAT read

# 验收:命令和 key 前缀都匹配时应允许
redis-cli ACL DRYRUN app_cache SET app:cache:42 value
redis-cli ACL DRYRUN app_cache GET app:cache:42

# 验收:命令不在清单或 key 不匹配时应拒绝
redis-cli ACL DRYRUN app_cache CONFIG GET maxmemory
redis-cli ACL DRYRUN app_cache GET other:42
redis-cli ACL DRYRUN report_reader SET app:report:42 value

把这组检查放进发布前清单,至少覆盖“正确命令 + 正确前缀”“正确命令 + 错误前缀”“错误命令 + 正确前缀”三个组合。若需要查看用户最终规则,可使用 ACL GETUSER app_cache;不要只看配置文件里最后一行,因为同一用户可以被多次追加规则。

Redis ACL DRYRUN 通过 app_cache 用户检查 GET、SET 与 app:cache:42、other:42 键匹配关系的静态框图
图2:ACL DRYRUN 的验收关系,命令允许仍要与 key 前缀共同匹配,越过任一边界都会被拒绝。

持久化规则并接入应用

在线执行 ACL SETUSER 后,不要把它当成一次性的命令行改动。自建 Redis 可以按部署方式保存 ACL 文件,并在变更流程中记录版本;托管 Redis 则应按产品支持的权限入口管理,不能假设所有 ACL 子命令都可用。

应用连接串中明确写入用户名,连接后先做一次轻量权限探测,再开始业务请求。回滚时恢复上一版用户规则,而不是临时把用户改成 +@all ~*。如果业务新增 key 前缀,先补充命名约定和 DRYRUN 用例,再扩展权限。

最后可以用这张清单验收:用户是专用身份;命令是必要集合;key pattern 没有无意义的星号;危险的全库命令没有被宽分类带入;错误前缀和错误命令都能被拒绝;规则已有可回滚的持久化版本。

常见问题

只写 ~app:cache:*,为什么 GET 仍然失败?

key pattern 只说明允许触碰哪些键,不会自动授予命令权限。还要为用户添加 +get 或合适的命令分类。

+@read 能不能代替一长串 GET、MGET?

可以减少配置长度,但它会随分类内容扩大权限面。对单一业务账号,明确列出命令更容易审查;只有命令集合稳定且确实需要时才使用分类。

Redis 7 的 %R~ 什么时候值得用?

当同一个用户确实需要访问同一类前缀、但读写边界不同,且运行环境统一支持 Redis 7.0+ 时,可以用它细分读权限和写权限。混合版本环境先采用不同用户和普通 ~ 规则更稳妥。

参考资料

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>