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

Redis ACL LIST 怎样导出用户权限并比较两台实例差异

来源:17golang原创

时间:2026-11-11 04:50:18 374浏览 收藏

迁移 Redis 或做权限审计时,我更愿意先把两台实例的有效 ACL 规则导出成文本,再讨论差异。这个动作只读取当前权限,不会修改用户;核心命令是 ACL LIST,它返回按 ACL 文件格式表达的用户规则。

官方地址:https://redis.io/docs/latest/commands/acl-list/

用 redis-cli --raw ACL LIST 分别导出两台实例,按“完整用户规则行”排序后执行 diff -u。不要把一行里的规则 token 再排序,因为 Redis ACL 规则按从左到右解释。

下面只讨论导出、规范化和比较,不执行 ACL SETUSER、ACL LOAD 等修改动作。

ACL LIST 导出的内容到底是什么

Redis 官方文档把 ACL LIST 定义为导出当前有效规则的命令。通常可以把返回结果理解为“一行一个用户”,每行以 user 和用户名开头,后面跟着启停状态、密码规则、键模式、频道模式和命令类别等 ACL 规则。

user default on nopass ~* &* +@all
user app on # ~cache:* &events:* +@read -@dangerous

示例中的哈希只是脱敏占位,不应把真实导出文件直接贴到工单或聊天窗口。ACL 规则的排列不是普通无序标签:官方 ACL 说明强调规则从左到右生效,后面的规则可能覆盖前面的允许或禁止。因此,比较时可以改变“用户行”的排列,却不要拆开单行后按字母重排。

Redis 实例、ACL LIST、用户规则行、ACL 文件格式和只读审计文件的静态关系说明图
图1:结构说明图,查看 ACL LIST 从 Redis 实例到用户规则文件的边界关系;这是静态说明图,不是运行截图。

先把两台实例导出成同一种文本

两端都使用 --raw,让 redis-cli 输出更适合保存和比较的原始行。认证方式用 --askpass 或现有安全凭据管理方式,示例不把密码写进命令行。

# 从实例 A 导出有效 ACL 规则;--raw 保留每个用户一行
redis-cli -h redis-a.example --user audit-reader --askpass --raw ACL LIST > acl-a.txt

# 从实例 B 导出有效 ACL 规则;示例地址只用于说明,不代表真实环境
redis-cli -h redis-b.example --user audit-reader --askpass --raw ACL LIST > acl-b.txt

# 只对完整用户行排序,不拆开单行中的 ACL 规则
LC_ALL=C sort acl-a.txt > acl-a.sorted.txt
LC_ALL=C sort acl-b.txt > acl-b.sorted.txt

这里的排序目的是消除两台实例返回用户的顺序差异。LC_ALL=C 让同一批文件在不同机器上使用一致的字节序排序,便于审计脚本重复运行。它不会改变任何 Redis 权限,也不会改变一行内部的规则先后。

用 diff 区分三类权限差异

规范化后直接比较两个完整文件:

# 输出统一格式的差异;--- 和 +++ 分别代表两端文件
diff -u acl-a.sorted.txt acl-b.sorted.txt

看结果时可以按下面的方式判断:

diff 现象通常表示优先复核
只有 -user ...实例 A 有而实例 B 没有,或整行规则不同用户名、启停状态、密码规则、键和命令范围
只有 +user ...实例 B 有而实例 A 没有,或整行规则不同是否是迁移后新增账号,是否超出变更单
同名用户出现一删一加用户名相同但有效规则行不同逐段比较规则,不要只看用户是否存在

如果担心终端颜色或上下文影响归档,可以把差异保存为文件。对 ACL 导出文件和差异文件都设置最小访问权限,并在审计结束后按组织的保留策略清理。

# 保存差异并限制本地文件的默认可读范围
umask 077
diff -u acl-a.sorted.txt acl-b.sorted.txt > acl-diff.patch || diff_status=$?

# diff 返回 1 表示存在差异,不要把它误当成命令执行失败
if [ "${diff_status:-0}" -gt 1 ]; then
  echo "diff 执行失败,请检查输入文件" >&2
  exit "${diff_status}"
fi

迁移前后的边界别混在一起

ACL LIST 适合回答“当前两台实例的有效用户规则是否一致”,但它不是完整的迁移动作。导出文件能帮助发现用户、键模式、频道模式和命令类别的差异;它不能替你确认客户端是否拿到了正确密码,也不能证明业务连接已经切换。

实际迁移时,我会把审计分成三层:先比较 ACL 规则文本,再由授权人员确认密码和凭据分发,最后单独安排应用连接切换。不要因为 diff 为空就把生产凭据写入脚本,也不要把导出的规则文件当成可公开分享的普通日志。

两台 Redis 实例导出完整用户规则并通过 diff 区分新增、缺失和同名用户变化的静态结构图
图2:关系说明图,查看两台实例如何以完整用户规则行进入差异对照;这是静态说明图,不是运行截图。

几个容易误判的问题

为什么不能把每行拆开排序? 因为 ACL 规则的左到右顺序有语义,拆开后可能把原本有意义的覆盖关系改写成另一种文本。

为什么同一个用户会显示成一删一加? diff 比较的是整行文本,只要该用户的一项规则变化,就会以旧行删除、新行新增的方式呈现。这正好提醒你逐项查看,而不是把它误判成两个用户。

ACL LIST 能否直接恢复另一台实例? 本文不把导出结果当成自动恢复脚本。恢复或修改需要单独的变更流程、权限审批和凭据处理;本方法只负责提供可审计的只读对照材料。

总结

比较 Redis ACL 的关键不是把输出“洗成任意格式”,而是保持每个用户规则行的语义,再消除用户行顺序造成的噪声。两端用 --raw ACL LIST 导出,整行排序后用 diff -u 对照,就能清楚看到新增用户、缺失用户和同名用户权限变化,同时把审计与权限修改、凭据切换分开。

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