
后端通信【免费下载链接】maddy✉️ Composable all-in-one mail server.项目地址https://gitcode.com/gh_mirrors/ma/maddy点击查看免费下载本指南系统讲解 maddyComposable all-in-one mail server中的auth.pass_table认证模块它通过 table 模块如table.file、table.sql_table实现用户名:密码式的登录校验是 maddy 默认配置文件中最常用的本地用户凭据存储方案。读完本文你将掌握 pass_table 的两种配置写法、三种密码散列算法bcrypt/argon2/sha256的格式与安全含义以及maddy hash、maddy creds两个配套命令的完整用法并理解其底层源码实现原理。模块定位表驱动的用户名密码认证auth.pass_table是 maddy 提供的一种认证提供方authentication provider核心思路是不自己存储密码而是把查找用户名 → 取得密码散列这件事委托给任意实现了 table 接口的模块。因此它的能力边界完全由底层 table 决定通过table.file从文本文件加载用户名:密码映射通过table.sql_table/table.sql_query从 SQL 数据库查询凭据也可以直接复用其他认证模块见 docs/reference/table/auth.md 中说明大多数认证提供方同时可作为包含全部用户名的 table 使用auth.external与pam除外。在 maddy 的默认配置 maddy.conf 中local_authdb正是用 SQLite 中的credentials.db来承载 pass_tableauth.pass_table local_authdb { table sql_table { driver sqlite3 dsn credentials.db table_name passwords } }正如配置注释所言如果 table 模块支持写操作sql_table 支持则凭据可以用maddy creds命令来管理也可以把表换成文本文件甚至整个替换 pass_table 改用 PAM、/etc/shadow 等外部凭据源。配置语法完整块与行内简写完整定义具名块auth.pass_table [block name] { table table config }块名block name在配置文件中全局引用时使用例如默认配置中的local_authdb。块内唯一的指令就是table它接受一个完整的 table 模块配置。行内简写inline当 pass_table 以内联方式嵌在其他模块中时可以用简化写法pass_table table [table arguments] { [additional table config] }即pass_table关键字后面直接跟 table 模块名及参数后续大括号内补充 table 的其余配置。文档给出的典型示例是 SMTP 提交端点587 端口使用文本文件做认证smtp tcp://0.0.0.0:587 { auth pass_table file /etc/maddy/smtp_passwd ... }这一行等价于auth指令指向一个内联的pass_table其内部table指向file模块参数为/etc/maddy/smtp_passwd。从源码看两种写法由 internal/auth/pass_table/table.go 的Init方法统一处理当存在内联参数inlineArgs时直接通过modconfig.ModuleFromNode(table, a.inlineArgs, ...)解析出行内 table否则走cfg.Custom(table, false, true, nil, modconfig.TableDirective, a.table)从块内解析table指令。密码散列格式与三种算法pass_table 要求 table 中的值value必须是带有算法标签的结构化字符串格式为算法名:散列参数。maddy hash命令就是用来生成这种值的标准工具。在 internal/auth/pass_table/table.go 的AuthPlain中认证流程是先用strings.SplitN(hash, :, 2)拆出算法标签再从HashVerify注册表里找到对应校验函数执行。若值中没有冒号报 no hash tag 错误若算法标签未注册报 unknown hash 错误。maddy 支持的算法定义在 internal/auth/pass_table/hash.go算法标签说明散列值内容bcrypt默认算法DefaultHash HashBcrypt标准 bcrypt 散列串含版本、cost、盐如$2y$10$...argon2Argon2id 密码散列以:分隔的time:memory:threads:salt:hashsalt 与 hash 均为 base64sha256加盐 SHA-256base64 编码的 32 字节盐 : base64 编码的散列摘要从注册表hash.go看HashCompute生成默认注册 bcrypt 与 argon2sha256通过addSHA256()额外注册测试中显式调用Hashes数组[sha256 bcrypt argon2]则用于maddy creds create --hash参数的合法值提示。bcrypt使用golang.org/x/crypto/bcryptcost 默认取bcrypt.DefaultCost10。源码注释明确要求 cost 至少为 10hash.go。bcrypt 自带盐散列串格式即标准 bcrypt 输出无需额外参数。argon2Argon2id生成时hash.go随机生成 16 字节盐Argon2Salt输出 64 字节Argon2Size散列并把 time、memory、threads 三个参数连同盐一起编码进字符串——这样校验时无需知道生成时的参数即可独立验证这是HashOpts结构体注释强调的设计要点。校验时verifyArgon2用subtle.ConstantTimeCompare做常数时间比较避免时序侧信道。sha256加盐 SHA-256 使用 32 字节随机盐拼接密码后做一次 SHA-256 摘要同样用常数时间比较校验hash.go。注意 sha256 未默认注册进HashCompute/HashVerify且它属于快速散列安全性弱于 bcrypt/argon2一般不建议用于新凭据。测试用例中的实际格式internal/auth/pass_table/table_test.go 给出了三种算法在 table 中的真实存储样貌密码均为passwordfoxcpp: sha256:U0FMVA:8PDRAgaUqaLSk34WpYniXjaBgGM93Lc6iF4pw2slthw, not-foxcpp: bcrypt:$2y$10$4tEJtJ6dApmhETg8tJ4WHOeMtmYXQwmHDKIyfg09Bw1F/smhLjlaa, not-foxcpp-2: argon2:1:8:1:U0FBQUFBTFQ:KHUshl3DcpHR3AoVd28ZeBGmZ1Fj1gwJgNn98Ia8DAvGHqI0BvFOMJPxtaAfO8Fqomm2O3h0P0yV50QGwXI/Q,测试同时验证了错误密码会被拒绝以及三种算法的正确密码均能通过AuthPlain校验。maddy hash生成密码散列文档明确指出你应该使用maddy hash命令来生成散列值细节见maddy hash --help。该命令定义在 internal/cli/ctl/hash.go用法示例maddy hash maddy hash --password your-password maddy hash --hash bcrypt --bcrypt-cost 12 maddy hash --hash argon2 --argon2-time 3 --argon2-memory 65536 --argon2-threads 2支持的全部选项选项默认值说明-p, --password无直接指定密码不指定则从 stdin 交互读取。注意CLI 帮助文本明确警告该选项仅供调试不要把密码留在 shell 历史里--hashbcrypt散列算法合法值见pass_table.Hashesbcrypt/argon2/sha256--bcrypt-cost10bcrypt cost源码会在bcrypt.MinCost~bcrypt.MaxCost范围内校验越界直接报错退出--argon2-time3Argon2id 时间因子--argon2-memory1024Argon2id 内存占用KiB--argon2-threads1Argon2id 并行线程数命令输出即为可直接写入 table 的完整值带算法标签例如bcrypt:$2y$10$...。此外hashCommand还有两个贴心的安全提示hash.go当密码为空串或含首尾空白时会向 stderr 打印 WARNING提醒操作者。maddy creds管理可变凭据表如果底层 table 是mutable可变表就可以用maddy creds命令通过 pass_table 模块读写这个本地凭据存储。命令实现在 internal/cli/ctl/users.go其帮助文本说明了两个关键前提凭据库必须在 maddy.conf 中定义为顶层配置块默认块名为local_authdb可通过--cfg-block参数或环境变量MADDY_CFGBLOCK修改仅创建凭据不足以授予 IMAP 访问权限——还需用imap-acct create子命令创建对应的 IMAP 账户。子命令一览子命令用法说明maddy creds list无参数列出所有已创建凭据的用户名空表时 stderr 输出 No users.maddy creds create USERNAME用户名必填从 stdin 读取密码创建用户--hash指定算法默认 bcrypt、--bcrypt-cost指定 cost默认 10、-p直接给密码仅调试用maddy creds remove USERNAME用户名必填删除用户默认要求确认-y/--yes跳过确认maddy creds password USERNAME用户名必填从 stdin 读取新密码并更新典型用法maddy creds create alice maddy creds list maddy creds password alice maddy creds remove alice --yesusersCreate的实现细节值得一提users.go只有凭据库确实是*pass_table.Auth类型时才允许使用--hash/--bcrypt-cost否则会报错 --hashcannot be used with non-pass_table credentials DB非 pass_table 的凭据库例如其他认证提供方走be.CreateUser(username, pass)默认路径。源码原理认证与用户管理的关键路径认证流程AuthPlaininternal/auth/pass_table/table.go 的AuthPlain是登录校验核心用precis.UsernameCaseMapped.CompareKey(username)对用户名做规范化大小写映射的 PRECIS 处理保证认证与存储使用一致的键table.Lookup取出散列值未命中返回module.ErrUnknownCredentials拆出算法标签并分派到对应校验函数。Lookup方法同样经过precis.UsernameCaseMapped.CompareKey归一化table.go这意味着大小写不同但归一化后相同的用户名会被视为同一个账户。用户管理mutable table 能力ListUsers、CreateUser、SetUserPassword、DeleteUser四个方法全部先做类型断言a.table.(module.MutableTable)失败则返回 table is not mutable, no management functionality availabletable.go。这解释了文档中mutable table 才能用 maddy creds的约束。其中CreateUser默认走CreateUserHash(username, password, HashBcrypt, HashOpts{BcryptCost: bcrypt.DefaultCost})CreateUserHash会拒绝已存在的用户名credentials for ... already exist并把值写成bcrypt:前缀形式SetUserPassword目前固定使用 bcrypt源码留有 TODO 注释尚未支持自定义散列算法DeleteUser调用RemoveKey。底层 table 模块选型pass_table 的价值在于可插拔文档点名了两类用法结合仓库可给出完整参数说明。table.file文本文件映射定义与语法详见 docs/reference/table/file.md其特点非常适合小型部署文件每 15 秒检测一次变更依据修改时间自动重载若文件含语法错误则保持旧内容不应用格式为key: value行#开头与纯空白行被忽略行首尾空白会被剔除无冒号的行等价于key:映射到空串同一 key 可重复出现查询时返回多个值也可用逗号分隔多个值不支持转义。与 pass_table 组合时文件每行形如username: bcrypt:$2y$10$...散列值由maddy hash生成后粘贴进去。注意table.file 是只读的因此它不能配合maddy creds使用不满足 mutable 要求。table.sql_table / table.sql_querySQL 后端默认配置使用的sql_table在 internal/table/sql_table.go 中解析driver、dsn、table_name、key_column默认key、value_column默认value等指令并字面上包装sql_query模块——源码注释直言sql_table 通过为 sql_query 生成一份配置块来实现。通用查询模块sql_query的完整指令见 docs/reference/table/sql_query.mdlookup查询必填通过:key命名占位符取值list/add/set/del四个查询一旦配置table 即变为 mutable从而解锁maddy creds。其init指令可用于初始化 RDBMS例如对 SQLite3 执行PRAGMA journal_modeWAL与PRAGMA synchronousNORMAL提升性能named_args默认yes设为no时 key/value 改以$1/$2位置参数传递。maddy 的 PostgreSQL 驱动不支持命名参数SQLite3 驱动对编号参数处理也有已知限制这是选择named_args取值时需要注意的兼容性前提。实战小结一套典型的 pass_table 落地流程是在 maddy.conf 顶层定义auth.pass_table local_authdb表用table.file小型文本场景或table.sql_tableSQLite/PostgreSQL支持maddy creds用maddy hash生成散列推荐默认 bcrypt或按安全需要调高 cost / 选用 argon2把用户名: 散列值写入文件或数据库在 SMTP/Submission/IMAP 端点引用该认证默认配置中local_authdb已被引用见 maddy.conf若表可变用maddy creds create/list/password/remove维护凭据记得为 IMAP 用户额外创建账户imap-acct create。配套参考完整的 auth.pass_table 定义见 docs/reference/auth/pass_table.mdKubernetes Helm chart 内置的 maddy.conf 也展示了相同的 local_authdb 配置写法contrib/kubernetes/chart/files/maddy.conf。赞分享后端通信【免费下载链接】maddy✉️ Composable all-in-one mail server.项目地址https://gitcode.com/gh_mirrors/ma/maddy点击查看免费下载相关推荐Maddy认证系统完全指南从本地用户到LDAP集成Maddy是一款现代化的邮件服务器软件其认证系统提供了从简单本地用户管理到复杂企业级LDAP集成的完整解决方案。无论你是个人用户还是企业管理员Maddy都能后端通信Audiobookshelf用户认证完全指南从本地密码到企业级OIDC集成Audiobookshelf用户认证完全指南从本地密码到企业级OIDC集成 Audiobookshelf作为一款功能强大的自托管有声书和播客服务器提供了灵活后端音视频前端CloudQuery S3 目标插件 AWS 认证指南从本地登录到凭证链原理CloudQuery S3 目标插件 AWS 认证指南从本地登录到凭证链原理 本篇技术指南聚焦 CloudQuery S3 目标插件 plugins/des数据集成数据工程数据分析上一篇免费开源 PDF 对比工具 diff-pdf10 分钟上手速查指南下一篇一次备份博主274条作品douyin-downloader 无水印批量下载与本地归档实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考