Mailcow 安全加固指南
Mailcow 安全加固指南:管理面 2FA 与强制双因素实测、API 最小暴露、TLS 强制与明文端口禁登录回显、Rspamd 欺诈防护符号链、登录延迟与 netfilter 自动封禁机制、端口暴露面收敛清单与验证命令,全部基于 2026-09a 实测。
Mailcow 安全加固指南
适用:Mailcow 2026-09a(部署与入门见本专栏前篇)。邮件服务器是互联网上被爆破与滥用最频繁的服务之一,本文按"管理面 → 协议面 → 策略面 → 暴露面"四层给出加固清单,全部条目在 2026-10-19 实测验证。
一、环境信息
- Mailcow 2026-09a 降配运行(SKIP_CLAMD/SOGO/FTS=y),Web 入口 HTTP 8126 / HTTPS 8130
- 管理端与 API 同源(
/admin与/api/v1),演示域example.com - 涉及组件:nginx/php-fpm(管理面)、postfix/dovecot(协议面)、rspamd/netfilter(策略面)
二、管理面加固
2.1 强制改密:首登向导已内置
初始管理员 admin/moohoo 必须立即更换。管理端对账号提供 "Force password update at next login" 开关(force_pw_update 属性),置位后该账号下次登录被 pending 动作拦截,实测 302 落在 /admin 并弹出改密向导(changePWModalForm,提交目标 POST /api/v1/edit/admin,敏感值服务端脱敏回显 "password":"*")。多管理员环境建议为每个管理员开启此开关,确保初始口令不落地。
2.2 双因素认证(2FA)与强制 2FA
管理端 System → Configuration → 管理员编辑页提供 TFA 配置,支持三种认证器:TOTP(动态口令)、WebAuthn、FIDO2(实测向导 Modal 含 tfa_method 选择与 tfa-qr-img 二维码,供 TOTP 认证器扫码绑定)。
2026-03 版本起提供 forced 2FA(管理员属性 force_tfa):置位后登录同样被 pending 拦截,实测页面直接渲染 TFA 绑定向导——即管理员在完成双因素绑定前无法进入管理面。这是多人共管环境的强基线。实测触发回显:
login -> HTTP 302 Location: /admin # pending_tfa_setup 拦截
GET /admin/ -> 200(页面含 TFAModal / tfa_method / tfa-qr-img)
绑定的认证器在登录时进入二次确认流程(awaiting_tfa_confirmation,账号会话置 pending,凭据正确但未过 TFA 不发会话)。
2.3 REST API 最小暴露
API 密钥三要素的最小化配置(mailcow.conf):
| 变量 | 加固取值 | 说明 |
|---|---|---|
API_KEY | 随机长串(实测 48 位 hex) | 读写密钥,仅自动化系统需要时才配 |
API_KEY_READ_ONLY | 只读场景单独发 | 监控/报表只给只读密钥 |
API_ALLOW_FROM | 明确 CIDR 列表 | 实测必须包含真实来源网段(含编排网关地址),白名单外一律 authentication failed |
运维红线:读写密钥不出管理网;来源白名单不写 0.0.0.0/0;API 暴露面与管理面同端口,公网不可达管理面的前提下 API 同样不可达(见第五章)。
2.4 角色最小化
超级管理员(superadmin)只保留 1–2 个;日常运维建 domain admin 角色账号(仅管所辖域名/邮箱)。内置 ACL 体系(ACL_ANYONE=disallow 默认值保持)避免 "anyone" 伪用户组扩权。会话层面,管理面与邮箱代管(dual-login)都会在日志留下角色痕迹,定期审计管理员列表。
三、协议面:TLS 强制
3.1 明文端口禁登录(默认即安全)
实测 143 明文口 banner:
$ timeout 4 bash -c 'exec 3<>/dev/tcp/127.0.0.1/143 && cat <&3'
* OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE LITERAL+ STARTTLS LOGINDISABLED] Dovecot ready.
关键在 LOGINDISABLED:明文会话禁止 LOGIN,客户端必须先 STARTTLS 升级。587 提交口同理为 smtpd_tls_auth_only 默认(明文 EHLO 无 AUTH 行,实测 swaks 不带 --tls 报 Host did not advertise authentication)。465 为隐式 TLS。三端口行为实测汇总:
| 端口 | 明文能力 | 凭据传输 |
|---|---|---|
| 143 IMAP | STARTTLS + LOGINDISABLED | 仅 TLS 内 |
| 587 submission | STARTTLS 后广播 AUTH | 仅 TLS 内 |
| 465 submissions | 隐式 TLS | 全程加密 |
3.2 逐邮箱 TLS 策略
每个邮箱属性含 tls_enforce_in / tls_enforce_out(创建邮箱 API 参数实测可见)。对高敏感账号置位后,与未加密对端的收发会被策略拒绝——适合财务/高管邮箱。对外强制层面,postfix-tlspol 组件(官方镜像 ghcr.io/mailcow/postfix-tlspol:1.14.0)维护 TLS 策略缓存,确保发往支持 TLS 的域不出明文。
3.3 证书
公网域用 ACME 自动签发(HTTP-01 或 DNS-01,DNS-01 适配管理面不暴露 80/443 的收敛部署);内网/演示环境用 snake-oil 自签时,客户端侧应固定指纹分发而非放宽校验。
四、策略面:Rspamd 与爆破防护
4.1 入站欺诈防护符号链
每封入站信由 Rspamd 给出可审计的符号明细(实测回显,见快速入门篇 5.2):SPF/DKIM_TRACE/DMARC(身份三件套)、HFILTER_*(HELO/发件人合理性)、RCVD_COUNT_ZERO、MID_RHS_NOTFQDN 等,总分 15 分为拒收线(default: False [0.90 / 15.00])。加固动作在管理端 Rspamd 面板完成:调全局分值线、启用灰名单(对首次发件方延迟重试)、维护域名黑/白名单。
4.2 登录爆破:递增延迟 + F2B 自动封禁
Mailcow 内置两层防护,均可实测观测:
- UI 登录递增延迟:认证失败后
$_SESSION['ldelay']从 0 每次累加 0.5 秒并sleep(源码级实测),脚本爆破被线性减速; - F2B 事件通道:每次失败认证向 Redis
F2B_CHANNEL发布事件,netfilter 组件订阅后对源地址 iptables 封禁。实测启动日志:
2026-10-19 21:30:26 INFO: Clearing all bans
2026-10-19 21:30:28 INFO: Watching Redis channel F2B_CHANNEL
netfilter 封禁带到期自动解封与白名单(/opt/data/mailcow-dockerized/data/conf/netfilter/bans.conf 的 WHITELIST 加入运维跳板网段,避免把自己锁在门外)。UI 失败事件的日志原文形如 mailcow UI: Invalid password for <user> by <ip>,即 F2B 事件源。
4.3 出站滥用防护
被入侵邮箱是最常见的滥用源。实测可见每邮箱创建时自动初始化限速对象(回执 rl_saved);在管理端 E-Mail → Configuration → Rate Limit 按邮箱/域设置发送配额;Rspamd 侧对出站同样过符号评分。配合 2.4 的角色最小化与 3.2 的 TLS 策略,构成出站防线。
4.4 弱口令防线
邮箱/管理员密码保存为 BLF-CRYPT 哈希(MAILCOW_PASS_SCHEME,实测库中前缀 {BLF-CRYPT}$2y$10$);前端集成 Have I Been Pwned 口令库查询(页面资源实测含 hibp_ok 文案),已泄露口令在设置时即被提示拒绝。
五、暴露面收敛
5.1 端口清单与收敛基线
部署后实测宿主监听(ss -ltn):
0.0.0.0:8126 0.0.0.0:8130 # 管理面(建议仅内网/VPN 可达)
0.0.0.0:25 0.0.0.0:465 0.0.0.0:587 # SMTP:必须公网
0.0.0.0:143 0.0.0.0:993 # IMAP:按需公网(993 优先)
0.0.0.0:110 0.0.0.0:995 # POP3:基本可关
0.0.0.0:4190 # ManageSieve:客户端配置过滤规则才需要
127.0.0.1:13306 127.0.0.1:7654 127.0.0.1:19991 # SQL/Redis/Doveadm:仅回环
收敛清单(按收益排序):
- 管理面 8126/8130 不对公网开放(防火墙/安全组仅放内网与 VPN 网段)——管理面承载全部管理动作与 API;
- POP3(110/995)默认关闭:现代客户端走 IMAP;若保留也仅对内网;
- 4190 ManageSieve 按需开放;
- SMTP 三口中,若无需从公网收信(纯出站/内部系统发信),25 亦可收敛为内网;
- SQL/Redis/Doveadm 默认仅绑
127.0.0.1(实测保持),不要改绑 0.0.0.0。
5.2 HTTP 明文入口
非标端口部署时 HTTP_REDIRECT=y 会 301 到 HTTPS(标准端口假设,见部署指南篇 4.3)。收敛视角两种等价安全形态:HTTP_REDIRECT=y 让明文口仅做跳转,或直接不映射 8126 只留 HTTPS 入口。本演示环境为浏览器便利设 n,生产建议保持 y 并只放行 HTTPS。
5.3 内部服务通信
各组件间流量限制在自定义内部网络(本文 10.89.54.0/24),Unbound 为全栈统一递归出口(Rspamd 的 DNSBL/SPF 查询不直连外网解析器),降低 DNS 污染与泄露面。IPv6 不用时保持 ENABLE_IPV6=false,避免未规划的 v6 暴露面。
六、加固自检清单
-
admin/moohoo已改强密码,force_pw_update对全部管理员开启 - 全部管理员启用 2FA(或
force_tfa=1强制) -
API_ALLOW_FROM为精确网段,只读/读写密钥分离 - 管理员列表仅剩必要账号,域管理已委派给 domain admin
- 143/587 banner 含
LOGINDISABLED/AUTH 需 TLS(实测命令见 3.1) - 高敏邮箱
tls_enforce_in/out置位 - Rspamd 灰名单与分值线已按业务调整,
X-Spamd-Result符号抽查无异常放行 - netfilter
WHITELIST含运维网段,F2B_CHANNEL在订阅(日志见 4.2) - 管理面端口不对公网,POP3/Sieve 按需收敛(5.1 清单)
-
postqueue -p定期巡查无异常出站积压(滥用征兆)
七、参考链接
- 官方安全与反垃圾文档:https://docs.mailcow.email/post_installation/firststeps-rspamd_settings/
- netfilter(F2B)说明:https://docs.mailcow.email/manual/u_e-netfilter/
- 强制 2FA 功能发布:https://github.com/mailcow/mailcow-dockerized/releases/tag/2026-03b(Moorch 2026)
- 站内同族加固:《docker-mailserver 安全加固指南》、《iRedMail 1.7.4 配置参数详解》