
Garnet ACL 命令完全指南用户、密码与命令级权限控制实战【免费下载链接】garnetGarnet is a remote cache-store from Microsoft Research that offers strong performance (throughput and latency), scalability, storage, recovery, cluster sharding, key migration, and replication features. Garnet can work with existing Redis clients.项目地址: https://gitcode.com/GitHub_Trending/garnet4/garnet本指南以 Garnet 仓库的 ACL 命令文档 为主体完整讲解ACL家族的全部 10 个子命令CAT、DELUSER、GETUSER、GENPASS、LIST、LOAD、SAVE、SETUSER、USERS、WHOAMI的语法、语义与 RESP 返回格式并结合 ACLCommands.cs、ACLParser.cs、AccessControlList.cs 等源码深入讲解底层实现。读完本文你将能够配置 Garnet 的 ACL 认证、通过命令创建和管理受限用户、为自定义扩展命令下发细粒度权限、以及正确使用 ACL 文件实现规则的原子化加载与持久化。ACL 在 Garnet 中的角色Garnet 的 ACLAccess Control List系统为每一位连接用户定义了可以执行哪些命令、使用哪些命令类别、拥有哪些密码从而实现对远程缓存存储的多租户隔离与最小权限管理。从源码结构看ACL 相关实现集中在 libs/server/ACL 目录核心类型包括AccessControlList.cs管理所有用户句柄UserHandle的顶层容器支持从文件加载、保存到文件User.cs单个用户的权限模型开关状态、密码哈希集合、命令与类别权限ACLParser.cs将 ACL 规则文本解析为User对象UserHandle.cs并发安全的用户引用句柄配合TrySetUser实现无锁权限更新。每个新连接默认使用名为default的用户进行认证。只有将服务器配置为 ACL 认证方式GarnetACLAuthenticator后ACL命令才可用否则服务端会返回ERR ACL authentication is disabled对应源码ValidateACLAuthenticator见 ACLCommands.cs。启用 ACL前置条件与配置项在运行任何ACL命令之前需要通过命令行或配置文件指定 ACL 用户文件例如dotnet run --project main/GarnetServer -- --acl-file /path/to/users.acl对应的配置项定义在 Options.cs配置项类型默认值说明--acl-filestringnull外部 ACL 用户文件路径未指定时仅创建default用户--acl-strict-custom-commandsbooltrue为 true默认时ACL 规则引用了未被任何已加载模块注册的自定义命令名服务器拒绝启动为 false 时按原样加载未解析的名字并记录警告这两个选项同时出现在 defaults.conf 中键名AclFile并兼容 Redis 风格的aclfile配置见 RedisOptions.cs。配置文件中若未定义default用户的密码则使用--password指定的密码作为其密码若两者都未提供default用户将变为免密登录nopass见 AccessControlList.cs 中默认用户的自动创建逻辑。ACL 认证设置由抽象类 AclAuthenticationSettings.cs 承载实际有两种实现AclAuthenticationPasswordSettings.cs密码认证与 AclAuthenticationAadSettings.cs结合 AAD 认证。提示测试套件 AclConfigurationFileTests.cs 展示了如何以useAcl: true, aclFile: ...启动带 ACL 的服务器并验证ACL USERS、ACL LIST的输出可作为集成验证的参考。ACL 规则语法与命令类别ACL SETUSER的规则、ACL 文件的每一行都遵循统一的规则语法。由 ACLParser.cs 的定义可知支持以下操作操作含义on/off启用 / 禁用用户账号password/password添加 / 移除明文密码#hash/!hash添加 / 移除密码哈希以#前缀存储于GETUSER输出nopass允许该用户免密登录同时清空密码列表resetpass清空所有密码并禁止免密登录reset移除该用户的全部密码与访问权限category/-category授予 / 移除某个命令类别command/-command授予 / 移除单个命令支持command|subcommand形式~*/allkeys、resetkeys键模式占位当前仅支持通配符键模式源码中按 no-op 处理ACL 类别由 ACLParser.cs 中的映射表定义ACL CAT无参数时列出的正是这些类别admin、bitmap、blocking、connection、dangerous、geo、hash、hyperloglog、fast、keyspace、list、pubsub、read、scripting、set、sortedset、slow、stream、string、transaction、vector、write、garnet、custom、all其中all表示全部命令custom专门用于归类自定义扩展命令garnet是 Garnet 特有的类别。规则解析对类别名大小写不敏感OrdinalIgnoreCase并支持cmd与category混用叠加到同一用户。用户管理命令ACL SETUSER创建与修改用户ACL SETUSER username [rule [rule ...]]若用户名不存在则创建一个无任何权限的新用户然后从左到右应用所有规则若用户已存在则规则在原有权限基础上增量叠加。例如ACL SETUSER alice on pssw0rd all -dangerous -debug ACL SETUSER bob on nopass get set hash -hset实现要点见 ACLCommands.cs权限修改通过UserHandle.TrySetUser(newUser, currentUser)的 CAS 循环完成保证并发安全每条规则由ACLParser.ApplyACLOpToUser解析未知操作抛出ACLUnknownOperationException并回滚整条命令命令成功后返回OK失败返回-ERR ...。ACL DELUSER删除用户ACL DELUSER username [username ...]删除所有指定用户并终止所有以这些用户身份认证的连接。返回被删除用户数量的整数回复不存在的用户名不计入。注意default用户不可删除——AccessControlList.cs 中对此显式抛出异常 The special default user cannot be removed from the system。ACL USERS / ACL WHOAMI枚举与身份查询ACL USERS返回所有已配置用户的用户名数组Array replyACL WHOAMI返回当前连接所认证的用户名Bulk string reply。新连接默认认证为default可通过AUTH切换用户。ACL USERS的实现直接遍历AccessControlList.GetUserHandles()的用户名集合见 ACLCommands.cs。ACL GETUSER查看用户规则ACL GETUSER username返回指定用户的全部规则定义具体为一个包含三个字段的 mapArray reply实现见 ACLCommands.csflagson或off用户是否启用passwords密码哈希数组每个元素以#前缀形式给出commands该用户已启用命令的描述字符串。若用户不存在返回Nil reply。查询命令ACL CAT查看类别与类别内命令ACL CAT [category]无参数时返回所有 ACL 类别名上文列出的 25 个指定类别名时返回该类别下的全部 Garnet 命令。实现上直接使用ACLParser.ListCategories()与内部类别映射ACLCommands.cs。传入无效类别名会返回Simple error reply。ACL LIST查看当前生效的 ACL 规则ACL LIST返回服务器当前所有生效 ACL 规则的数组每个元素是一条可写回 ACL 文件的规则文本由User.DescribeUser()生成见 User.cs。这些规则可直接作为ACL SETUSER的参数或 ACL 文件的行内容使用。ACL GENPASS生成强随机密码ACL GENPASS [bits]输出一个足够强、可直接用作密码的随机二进制串的十六进制表示。默认生成 256 位即 64 个十六进制字符Bulk string reply。传入bits可调整长度位数会向上取整到 4 的倍数因此请求 1 位也会输出 1 个十六进制字符4 位。实现细节见 ACLCommands.cs当前仓库源码使用System.Security.Cryptography.RandomNumberGenerator.GetHexString生成随机串合法参数范围在代码中校验为大于 0 且不超过 4096 位文档描述的 1024 上限在实现中更为宽松以实际源码为准。参数非整数或越界时会返回对应-ERR。ACL 文件LOAD 与 SAVEACL LOAD与ACL SAVE仅在配置了--acl-file时可用否则返回ERR ACL authentication file not set之类的错误见ValidateACLFileUseACLCommands.cs。ACL LOAD原子化重载规则ACL LOAD从 ACL 文件重新加载全部规则替换服务器内存中的现有规则。其关键语义是全有或全无all-or-nothing文件每一行都合法则全部加载只要有一行非法则什么都不加载继续使用内存中的旧规则。该原子性在 AccessControlList.cs 的Load中实现先把文件解析进一个全新的临时AccessControlList解析成功后才一次性原子替换用户列表解析过程中任何ACLParsingException都会带上文件:行号信息抛出。加载后若文件中未定义default用户会自动补齐。成功返回OK失败返回-ERR 原因。ACL SAVE将内存规则写回文件ACL SAVE将当前内存中的全部用户规则通过User.DescribeUser()序列化写回 ACL 文件成功返回OK失败返回-ERR。实现位于 AccessControlList.cs使用lock保证同一时刻只有一次写盘先写满内存缓冲区再手动Flush避免频繁小写。自定义扩展命令的 ACL 规则除内置命令与category外Garnet 允许把单个自定义命令名直接作为规则使用此特性是 acl.md 中专门强调的扩展点json.set授予JSON.SET访问权-json.get拒绝JSON.GET逐命令的显式拒绝优先于类别级允许因此custom -json.set表示允许所有自定义命令、唯独拒绝JSON.SET名称匹配大小写不敏感内置命令优先级更高若名称被识别为内置命令或command|subcommand规则作用于内置命令即使某模块注册了同名自定义命令。ACL SETUSER在运行时是严格的name/-name中的名称若未在任何已加载模块中注册会被拒绝典型错误信息如Unknown custom command xxx (not registered with any loaded module)见 ACLCommands.cs。用户上已存在的名称例如模块注册前从 ACL 文件宽松加载进来的名称可在 allow/deny 间来回切换而不重新校验。ACL 文件加载默认同样严格启动时若文件引用了未注册的自定义命令名服务器将拒绝启动。若需要宽松的加载顺序例如模块注册晚于 ACL 文件解析可将--acl-strict-custom-commands设为false此时未解析的名称会原样保留并记录警告。从 ACLParser.cs 可以看到未知名称先以待解析状态挂在用户上待模块加载后统一解析——这也是该配置项存在的意义。自定义命令名的合法字符集为首字符为字母数字后续字符允许.、_、-、||用于镜像command|subcommand记号见IsValidCustomCommandNameACLParser.cs。验证与深入阅读命令实现ACLCommands.cs 覆盖全部 10 个子命令的网络层处理与参数校验规则解析ACLParser.cs 定义规则语法、类别表与自定义命令名校验用户模型User.cs 与 UserHandle.cs 承载权限状态与并发更新文件与默认用户AccessControlList.cs 实现原子化Load/Save与default用户自动创建配置项Options.cs 与 defaults.conf测试用例AclConfigurationFileTests.cs文件加载、默认用户补齐、密码优先级等场景、AclParserTests.cs规则语法解析。ACL 文件格式即为每行一条ACL LIST风格规则例如user default on nopass all user alice on secret123 all -dangerous -config|get user bob on #5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8 get set在投入使用前建议先用ACL GETUSER核对规则、用ACL SAVE持久化并用 Garnet.test.acl 中的测试模式对多用户场景做完整验证。【免费下载链接】garnetGarnet is a remote cache-store from Microsoft Research that offers strong performance (throughput and latency), scalability, storage, recovery, cluster sharding, key migration, and replication features. Garnet can work with existing Redis clients.项目地址: https://gitcode.com/GitHub_Trending/garnet4/garnet创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考