Dovecot 邮件访问引擎深度解析
IMAP / POP3 高性能架构、Mailbox 格式与索引机制
1. 概述
邮件系统的核心组件分为三类:MTA(邮件传输代理)负责 SMTP 收发与路由,MDA(邮件投递代理)负责将邮件写入存储,而 MAA(邮件访问代理)负责面向最终用户的 IMAP/POP3 协议交互。在前两者被反复讨论的同时,邮件访问引擎往往被视作"只是提供协议端口"的配角——但实际上,IMAP 的协议复杂度远超 SMTP,对存储 I/O、并发模型、索引策略的要求也更苛刻。
Dovecot 的设计哲学是"安全优先 + 高性能索引驱动"。它从第一天起就把进程隔离做到极致——每个客户端连接对应独立进程,认证与会话状态彻底解耦。其 mail 存储层是一个可插拔的抽象接口,底层同时兼容 mbox、Maildir、sdbox、mdbox、cbox、obox 等多种格式,并在上层通过索引文件(dovecot.index / dovecot.index.cache / dovecot.index.log)统一加速。这在同类实现中是独一无二的:你可以在不改变客户端行为的前提下,把 mbox 迁移到 mdbox,同时享受几乎一致的访问延迟。
本文将从进程模型出发,依次剖析认证链、存储抽象层、全文搜索、LMTP 投递、复制同步与负载均衡、IMAP 协议优化和运维诊断工具链。引用规范包括 RFC 3501(IMAP4rev1)、RFC 9051(IMAP4rev2)、RFC 1939(POP3)、RFC 5256(SORT/THREAD)及 RFC 8620/8621(JMAP 邮件数据模型)。
2. 多进程架构
Dovecot 的进程拓扑是理解其稳定性与安全边界的基础。它采用master / worker 模型,所有子进程由 dovecot 主进程(实际二进制名为 dovecot,以 root 启动后切换身份)fork 并管理。
2.1 master 进程
master 进程的角色是看门狗 + 进程工厂。它解析 dovecot.conf,按需 fork 各个 service worker,监听子进程退出信号并自动重启,同时负责打开所有 TCP / UNIX socket 的监听 fd 并传递给 worker。master 本身不参与任何协议交互、不处理请求数据,从而将攻击面压缩到最小。
2.2 log 进程
日志写入由独立的 log 进程处理。所有 worker 通过 UNIX domain socket 将日志行推送给 log,后者负责格式化、按级别过滤、写入文件或 syslog。这种设计避免了多进程争抢文件写入锁,也意味着即使某个 imap 进程崩溃,日志缓冲区里的内容不会丢失——因为它们已经通过 socket 交给了 log 进程。
2.3 anvil 进程
anvil 是一个轻量级连接统计与限流服务。它不处理任何邮件内容,只跟踪每个 IP / 用户的连接数、认证失败次数、最近认证时间等元数据。配置项 mail_max_userip_connections 就是这个层面生效的:
# 限制同一用户从同一 IP 的最大并发 IMAP 连接数 mail_max_userip_connections = 20 # 认证惩罚:连续 N 次失败后延迟应答 auth_failure_delay = 2 secs
anvil 的这些数据纯内存维护、不落盘,重启清零——正是这种"丢了也无所谓"的态度让它保持了极低的开销,单核可以处理数十万连接/秒的统计更新。
2.4 auth 进程
auth 进程是认证中枢。它监听 auth-client socket,接收来自 login 进程和 post-login service 的认证请求,内部通过 auth-worker 子进程异步执行具体的密码查找(避免阻塞主 auth 循环)。认证后端是插件化的:
# /etc/dovecot/conf.d/10-auth.conf auth_mechanisms = plain login # 启用多种后端 !include auth-system.conf.ext # PAM / passwd !include auth-sql.conf.ext # MySQL / PostgreSQL !include auth-ldap.conf.ext # LDAP / Active Directory !include auth-passwdfile.conf.ext # 静态密码文件
smtpd_sasl_path = private/auth 直接连 Dovecot 的 auth socket 完成 SASL 认证,避免维护两套密码体系。
2.5 imap / pop3 / lmtp (post-login workers)
关键设计:login 进程 ≠ 协议处理进程。以 IMAP 为例:
- 客户端 TCP 连接到 143 端口,由
imap-login进程接管(该进程以受限用户运行,不做任何 I/O 操作,只转发数据) imap-login将认证凭据通过 auth socket 发送给 auth 进程- auth 验证成功后,通知 master 进程 fork 一个新的
imap进程 - master 通过 fd 传递将已建立的 TCP 连接 移交给新 fork 的 imap 进程
imap-login退出——后续所有 IMAP 协议交互由独立imap进程处理
这层 login / post-login 分离 的设计保证了:即便 IMAP 协议解析存在漏洞导致进程崩溃,崩溃的只是单个用户的 imap worker,imap-login 进程完全不受影响,其他用户的会话也完全隔离。Postfix 用户应该很熟悉这个模式——它和 Postfix 的 smtpd → cleanup → smtp 流水线本质上同源,都是将高风险操作隔离到独立进程实例。
2.6 indexer-worker 与 imap-hibernate
| 进程 | 职责 | 触发方式 |
|---|---|---|
indexer | 排队管理索引请求 | doveadm index 或 mail 操作触发 |
indexer-worker | 执行实际 FTS 索引构建(最耗费 CPU) | indexer 进程 fork 后分配任务 |
imap-hibernate | 将空闲 IMAP 连接"冬眠"——保存 fd 和状态后释放进程 | 连接空闲超过 imap_hibernate_timeout |
stats | 汇总各进程的 I/O、命令延迟、会话数等指标 | 持续运行,通过 socket 采集 |
3. 认证链架构
Dovecot 的 auth 子系统支持链式认证:可以同时启用多个 passdb 和 userdb 后端,按顺序尝试,第一个成功即返回。典型的虚拟用户场景:
# passdb:密码从哪里查
passdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
# userdb:用户属性从哪里查(uid/gid/home/mail_location 等)
userdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
# 补充:静态 userdb 兜底
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/mail/%d/%n
}
3.1 认证后端对比
| 驱动 | 适用场景 | 性能特征 | 注意事项 |
|---|---|---|---|
pam |
系统用户,少量账户 | 阻塞式,每次认证 fork helper | PAM 栈可能引入不可控延迟 |
passwd / shadow |
系统用户,最简单场景 | 直接读取 /etc/shadow,需 root |
不支持虚拟域 |
sql |
虚拟用户,大规模部署 | 连接池复用,毫秒级 | 密码推荐 SHA512-CRYPT 或 ARGON2ID |
ldap |
企业 AD / OpenLDAP 集成 | 自动连接管理与重连 | 注意 bind DN 权限最小化 |
passwd-file |
开发测试 / 极小规模 | 文件读取,线性扫描 | 不支持并发写入 |
3.2 auth-worker 进程与密码安全
auth 主进程只负责协议分发和结果组装,实际的密码哈希比对由 auth-worker 子进程执行。这样做是为了把可能耗时的操作(比如等待 SQL 查询返回、LDAP 网络往返、bcrypt 计算)隔离出去,避免阻塞其他认证请求的处理。Dovecot 会在启动时预 fork 一组 auth-worker,数量由 auth_worker_max_count 控制(默认 30)。
service auth-worker {
# 可以单独调整 auth worker 的 nice 值
nice_level = 0
}
4. 邮件存储格式
所有 Mailbox 格式在 Dovecot 内部都通过统一的 struct mail_storage 接口操作,但底层行为差异巨大。选型错误带来的迁移代价往往远超预期——下面逐一展开。
4.1 mbox
单一文件存储所有邮件,邮件之间用 From 行分隔。优点是兼容性好(所有 UNIX MUA 都认),缺点也很明显:
- 写锁:修改任何一封邮件都需要对整个 mbox 文件加排他锁,高并发下性能灾难
- 损坏半径大:一次写入中断可能损坏整个文件夹的所有邮件
- From_ 转义:邮件正文中以
From开头的行需要转义为>From
4.2 Maildir
每封邮件一个独立文件,目录内包含 cur/ new/ tmp/ 三个子目录。这是目前社区使用最广泛、也最可靠的格式:
- 无锁设计:写新邮件到
tmp/、然后link()→unlink()(或 rename)到new/,整个过程原子化 - 损坏隔离:单封邮件文件损坏不影响其他邮件
- 文件名编码:用冒号分隔 flags 和尺寸,例如
1625123456.M12345P6789.host,S=2048:2,S
但 Maildir 的缺点也会随着邮件数量暴露:
- inode 爆炸:100 万封邮件 = 100 万个文件,
stat()开销和目录遍历延迟显著上升 - 锁定粒度问题:虽然写邮件无锁,但 Dovecot 索引文件(
dovecot.index)的更新仍需文件锁 - 备份效率:大量小文件的
rsync速度远不如大文件
4.3 sdbox(single-dbox)
sdbox 将每个文件夹的邮件打包写入一个到多个 dbox 文件,每个文件内包含若干封邮件的消息体,消息元数据(UID、flags、keywords)存储在索引文件中。默认配置下每个 dbox 文件约 2MB 后轮转新文件。
mail_location = sdbox:~/sdbox
和 Maildir 相比,sdbox 把"一个文件一份邮件"变成了"一个文件多份邮件 + 索引指针":
- inode 数量大幅下降(约减少 80-95%)
- 邮件删除不立即回收空间——在 dbox 文件内标记"已删除",后续通过
doveadm purge实际压缩 - 读取邮件时需要先通过索引定位 offset,随机访问性能依赖索引健康度
4.4 mdbox(multi-dbox)
mdbox 在 sdbox 的基础上增加了 邮件去重 功能。同一个邮件被投递到多个用户(例如邮件列表场景)时,实际只存储一份消息体,多个用户通过引用计数共享。
mail_location = mdbox:~/mdbox # 设置轮转条件 mdbox_rotate_size = 10M mdbox_rotate_interval = 1 days
去重是 mdbox 最大的卖点,但代价也很明确:
- 引用计数一致性:需要定期
doveadm purge回收、doveadm force-resync修复计数偏差 - 跨用户共享:要求所有共享同一封邮件的用户在同一个文件系统上,且索引维护复杂度上升
- 不适合 POP3:POP3 用户通常会下载后删除邮件,使得去重几乎无效
4.5 格式对比总览
| 维度 | mbox | Maildir | sdbox | mdbox |
|---|---|---|---|---|
| 单文件/单邮件 | 所有邮件一个文件 | 一文件一封 | 多邮件一个文件 | 多邮件一个文件 |
| 并发写入 | 排他锁,接近串行 | 无锁,天然并发 | 需要索引锁 | 需要索引锁 |
| inode 用量 | 极低 | 极高 | 低 | 低 |
| 损坏影响范围 | 整个文件夹 | 单封邮件 | 整个 dbox 文件 | 整个 dbox 文件 |
| 邮件去重 | 无 | 无 | 无 | 有(引用计数) |
| POP3 适用性 | 可以 | 优秀 | 可以 | 不推荐 |
| IMAP 适用性 | 差 | 良好 | 优秀 | 优秀(尤其邮件列表) |
| 备份/rsync 效率 | 差(大文件变更) | 差(大量小文件) | 好 | 好 |
4.6 格式迁移
# Maildir → sdbox 同步转换(保留 UID 和 flags) doveadm sync -u user@example.com maildir:~/Maildir # 或者使用 dsync 做全量迁移 doveadm backup -u user@example.com sdbox:~/sdbox # mdbox 空间回收(删除后的物理空间释放) doveadm purge -u user@example.com # 修复 mdbox 引用计数 doveadm force-resync -u user@example.com '*'
5. 全文搜索(FTS)
IMAP 协议本身只定义了基于 SEARCH 命令的简单文本匹配(RFC 3501 §6.4.4),包括 BODY TEXT SUBJECT 等键。但对于百万级邮件存档来说,遍历每一封邮件做子串匹配是不可接受的——Dovecot 的 FTS 插件体系就是为解决这个矛盾而设计的。
5.1 FTS 插件生态
| 插件后端 | 依赖引擎 | 特点 | 中文支持 |
|---|---|---|---|
fts-flatcurve | Xapian | 性能最优、资源最低,推荐首选 | 需配合 icu 分词 |
fts-xapian | Xapian | 功能完整,社区活跃 | 通过 xapian-omega 分词器 |
fts-solr | Apache Solr | 需要单独维护 Java 服务、功能最强 | Solr 内置 CJK 分词 |
fts (内置) | 无 | 仅做简单分词 + 倒排,不支持词干提取 | 无 |
fts-icu | ICU 库 | 辅助插件,为其他后端提供 Unicode 分词 | 良好(ICU 内置 CJK 规则) |
5.2 flatcurve 配置(推荐)
# /etc/dovecot/conf.d/90-fts.conf
mail_plugins = $mail_plugins fts fts_flatcurve
plugin {
fts = flatcurve
fts_flatcurve_substring_search = yes
fts_languages = zh en
fts_tokenizers = generic email-address
fts_tokenizer_generic = algorithm=simple maxlen=30
# 启用 ICU 处理中文分词
fts_tokenizers = icu email-address
fts_tokenizer_icu = algorithm=simple
}
# 为已有邮件构建索引
# doveadm index -u user@example.com '*'
5.3 Solr 配置(大规模部署)
# dovecot.conf
mail_plugins = $mail_plugins fts fts_solr
plugin {
fts = solr
fts_solr = url=http://127.0.0.1:8983/solr/dovecot/ break-imap-search
}
# Solr schema 中需定义:
# <field name="body" type="text_cjk" indexed="true" stored="false"/>
# <field name="subject" type="text_cjk" indexed="true" stored="false"/>
# <field name="from" type="text_general" indexed="true" stored="false"/>
dovecot-fts-flatcurve/ 子目录),这意味着索引随邮件存储一起备份和迁移,运维一致性好。Solr 需要单独维护一个 Java HTTP 服务,带来运维成本,但搜索性能可以线性扩展(加 Solr 节点即可)。选型原则:小于 50 万封邮件 → flatcurve,大于 100 万封且需要高级搜索语法 → Solr。
6. LMTP 本地投递
LMTP(Local Mail Transfer Protocol,RFC 2033)是 SMTP 的精简版,专为"邮件已经到了最终目的地,只需写入本地存储"设计。Dovecot 内置的 lmtp 服务替代了传统的 Postfix virtual 投递方式:
# Postfix main.cf — 将投递交给 Dovecot LMTP virtual_transport = lmtp:unix:private/dovecot-lmtp # 或使用 TCP(跨主机投递) # virtual_transport = lmtp:inet:192.168.1.10:24
6.1 为什么 LMTP 优于 SMTP over loopback
不少旧教程推荐 Postfix 通过 virtual_transport = virtual 调用 dovecot-lda,或者用 SMTP 回环投递(即 Postfix 通过 SMTP 127.0.0.1:25 把邮件再发给自己的 SMTP 服务)。这两种做法各有严重缺陷:
| 投递方式 | 问题 |
|---|---|
| SMTP loopback | 邮件经过两次 SMTP 处理 → 两次 Received 头 → 两次 content_filter → 如果 SMTP 认证被绕过,可能被 open relay 利用 |
dovecot-lda (pipe) |
每个投递 fork 一个进程 → 性能差;无法批量投递多收件人;不支持 Sieve 在投递阶段的 reject |
| LMTP (推荐) | 单连接多收件人投递、投递成功/失败信息即时返回 MTA、Sieve 脚本在投递阶段即可执行 reject |
一个容易被忽视的安全细节:LMTP 协议要求对每个收件人独立返回投递状态。这意味着 Postfix 在向邮件列表投递时如果中途某个收件人因为 quota 满了而被拒绝,只有该用户的投递失败,其余收件人不受影响——SMTP 的 RCPT TO 也有这个能力,但在 loopback 模式下实现一致性要复杂得多。
# Dovecot LMTP 配置 /etc/dovecot/conf.d/10-master.conf
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
}
# 10-mail.conf
mail_plugins = $mail_plugins sieve
# 90-sieve.conf
plugin {
sieve = file:~/sieve;active=~/.dovecot.sieve
sieve_before = /etc/dovecot/sieve/before.d/
}
7. Replication:dsync 双向同步与 Director 代理
Dovecot 提供两种高可用方案:dsync replication(邮件数据层)和 director 代理(访问路由层)。两者解决不同层面的问题,经常组合使用。
7.1 dsync Replication
dsync 是 Dovecot 内置的异步双向同步引擎。它不是基于日志(如 WAL)复制,而是基于 状态摘要比较:两端各自计算 mailbox 的 GUID 列表和修改时间,然后增量同步差异部分。
# 在两台服务器上分别配置
# /etc/dovecot/conf.d/90-replication.conf
mail_plugins = $mail_plugins notify replication
service replicator {
unix_listener replicator-doveadm {
mode = 0600
user = vmail
}
}
service aggregator {
fifo_listener replication-notify-fifo {
user = vmail
mode = 0600
}
unix_listener replication-notify {
user = vmail
mode = 0600
}
}
plugin {
mail_replica = tcp:192.168.1.11:12345 # 对端地址
}
# 配置 replicator 进程
service replicator {
process_min_avail = 1
}
# dsync 同步端口(两台机器各配对方)
service doveadm {
inet_listener {
port = 12345
ssl = yes
}
}
7.2 Director 代理
director 是一个轻量级的 IMAP/POP3 连接路由层。它的工作原理是:对用户名做一致性哈希,将所有指向同一用户的连接始终路由到同一台后端服务器。这不只是负载均衡——它和 dsync 配合使用时,可以确保"用户 A 始终被 director 路由到 server-1",从而避免双向复制的冲突。
# Director 节点配置(充当代理的机器)
# dovecot.conf
protocols = imap pop3 lmtp
# Director 配置
director_servers = 192.168.1.10 192.168.1.11
director_mail_servers = 192.168.1.10 192.168.1.11
service director {
unix_listener login/director {
mode = 0666
}
fifo_listener login/proxy-notify {
mode = 0666
}
inet_listener {
port = 9090
}
}
# 将 IMAP/POP3 设置为代理模式
service imap-login {
executable = imap-login director
}
# passdb 返回代理目标
passdb {
driver = static
args = proxy=y host=192.168.1.10 nopassword=y
}
director 的一致性哈希基于用户名取模,因此增加或移除节点时会发生 rehash,导致部分用户被路由到新节点。通过设置 director_user_expire 让已断开的用户逐步过期切换,可以减少冲击。
8. IMAP 协议优化
IMAP4rev1(RFC 3501)于 2003 年定稿,其设计目标是用"服务器存储所有邮件、客户端通过网络操作服务器端文件夹"取代 POP3 的"下载到本地"模型。但最初的协议定义存在大量低效设计的遗留——连接建立后需要逐封下载 ENVELOPE、STRUCTURE 等信息,在延迟高或邮箱大的场景中体验极差。
Dovecot 对协议扩展的支持是同类中最完整的,以下是运维中应该关注的几个关键扩展。
8.1 COMPRESS=DEFLATE
IMAP 命令和响应都是纯文本协议,一条 FETCH 1:* (BODY[]) 可能产生几 GB 的未压缩传输。RFC 4978 定义了 COMPRESS=DEFLATE 扩展,在 IMAP 连接上开启 zlib 流压缩:
# Dovecot 默认已启用 # 客户端连接后发送:A01 COMPRESS DEFLATE # 压缩后带宽消耗降低 60-90%(取决于邮件内容)
8.2 CONDSTORE 与 QRESYNC
这是对 IMAP 客户端体验影响最大的两个扩展。在没有它们之前,客户端每次重连后需要重新拉取所有邮件的 flags 和 metadata,或者依赖 UIDNEXT / HIGHESTMODSEQ 做乐观缓存——但一旦缓存失效就是全部重拉。
| 扩展 | RFC | 解决的问题 |
|---|---|---|
| CONDSTORE | RFC 4551 | 允许客户端在 FETCH/STORE/SEARCH 时传入 MODSEQ,服务器只返回变更部分 |
| QRESYNC | RFC 5162 | 快速重同步:客户端传入最后一次看到的 UIDNEXT / MODSEQ,服务器返回差异列表 + EXPUNGE 通知 |
开启方式(Dovecot 默认已支持,无需额外配置):
# 确认已启用(默认开启) doveconf | grep mail_plugins # mail_plugins 中应包含 "acl" 之类 # 测试连接查看能力列表 openssl s_client -connect imap.example.com:993 -quiet a001 capability # 应看到 CONDSTORE QRESYNC
8.3 NOTIFY
传统 IMAP 客户端必须用 IDLE 命令维持一个长连接来等待新邮件通知——每个 IDLE 消耗一个 TCP 连接和一个服务端进程。RFC 5465 定义的 NOTIFY 扩展在此基础上增加了行级事件订阅能力:客户端可以精确订阅 MessageNew MessageExpunge FlagChange 等事件,大幅减少不必要的通知广播。
8.4 SORT 与 THREAD
RFC 5256 定义了服务端 SORT 和 THREAD 扩展,将邮件排序和对话线索的计算推到服务器端。对于有 10 万封邮件的收件箱,客户端排序需要下载所有 ENVELOPE 后在本地计算;服务器端 SORT 可以直接使用索引文件中的缓存数据,延迟从数十秒降到毫秒级。
# Dovecot 对 SORT/THREAD 的支持是内置的,验证: a001 capability # 应看到 SORT THREAD=REFERENCES THREAD=ORDEREDSUBJECT
9. 运维命令参考
doveadm 是 Dovecot 的运维入口,相当于 Postfix 的 postqueue / postsuper / postconf 的集合体。以下是在日常运维中真正高频、不可不记的命令。
9.1 进程与状态诊断
# 查看所有进程和连接数 doveadm process status # 查看当前谁在连接 doveadm who # 踢掉特定用户的全部会话 doveadm kick user@example.com # 查看某个用户的 replicator 同步状态 doveadm replicator status user@example.com
9.2 邮箱诊断与修复
# 查看邮箱状态:邮件数量、虚拟大小、物理大小 doveadm mailbox status -u user@example.com all INBOX # 输出:messages recent uidnext uidvalidity unseen vsize # 搜索特定条件的邮件(不下载内容,只返回数量) doveadm search -u user@example.com BEFORE 7d LARGER 10M # 强制重建索引 doveadm index -u user@example.com '*' # 修复索引不一致(邮件存在但索引中没有记录) doveadm force-resync -u user@example.com INBOX # mdbox 空间回收 doveadm purge -u user@example.com # 批量对所有用户重建 FTS 索引 doveadm user '*' | while read u; do doveadm index -u "$u" '*' & done wait
9.3 数据迁移与导入
# 全量备份(保持 UIDVALIDITY 和 flags) doveadm backup -u user@example.com maildir:/backup/user@example.com # 增量同步(只同步差异) doveadm sync -u user@example.com tcp:remote-server:12345 # 从 mbox 导入到 Maildir doveadm import -u user@example.com \ mbox:/tmp/old-mail/user@example.com '' \ mailbox INBOX all
9.4 性能调优
# 查看配置 doveconf -n # 只显示非默认配置 doveconf -a # 显示所有配置(含默认值) # 查看某个用户的索引目录 doveadm user user@example.com # 输出:uid gid home mail mail_location # 统计全站邮箱大小分布 doveadm -f tab quota get -A | sort -t$'\t' -k3 -rn | head -20
10. 性能调优要点
以下参数直接决定 Dovecot 在高并发场景下的表现,每一条都经过了大规模部署的验证。
# 调大每个 imap 进程允许处理的最大命令数 # 默认 0(无限制),对于内存敏感场景可设置为 1000 imap_client_workarounds = delay-newmail # 邮件缓存:将邮件正文缓存在内存中(推荐) mail_cache_min_mail_count = 30 mail_cache_fields = flags date.sent date.received size.virtual imap.envelope # vsize(虚拟大小)计算策略 # 默认每次 FETCH 都 stat() 每个文件——对大文件夹是灾难 mail_vsize_bg_after_count = 100 # 超过 100 封的文件夹在后台计算 vsize # 限制 IMAP 命令消耗的 IO 时间 mail_prefetch_count = 20 # 邮件预取 maildir_very_dirty_syncs = yes # ⚠️ 风险配置:跳过某些一致性检查以提速
11. 安全加固清单
- 禁止明文认证:
disable_plaintext_auth = yes,ssl = required - 限制认证机制:只保留
auth_mechanisms = plain login(在 TLS 之上的 plain 是安全的) - 进程资源限制:通过
default_vsz_limit限制单个 imap 进程的最大虚拟内存(默认 256M) - 连接频率限制:通过
mail_max_userip_connections和 anvil 内置的惩罚机制 - chroot:login 进程默认运行在受限 chroot 环境中
- SSL/TLS:禁用 SSLv3 / TLS 1.0 / TLS 1.1,最低 TLS 1.2;推荐
ssl_prefer_server_ciphers = yes - 日志脱敏:
auth_verbose = no(生产环境不要记录明文密码)
# TLS 配置 /etc/dovecot/conf.d/10-ssl.conf ssl = required ssl_cert = </etc/ssl/certs/mail.example.com.pem ssl_key = </etc/ssl/private/mail.example.com.key ssl_min_protocol = TLSv1.2 ssl_cipher_list = ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256