邮件安全网关与钓鱼防护:从认证到流程的四层防线
大部分团队在邮件安全上的第一步都是配置 SPF、DKIM、DMARC,这一步做对了,能挡住「有人拿你的品牌名发信给客户」。但员工每天面对的风险几乎全在另一侧:有人冒充同事、冒充供应商、冒充银行发信给公司内部的人。前者靠出站配置解决,后者只能靠入站防护,而两者用的从来不是同一套技术。
入站防护的困难在于它的收益结构:攻击者只需要成功一次,防护方需要每次都成功。所以网关类产品的定位不该是「拦截所有威胁」,而是「把廉价攻击全部挡掉、把可疑的降级隔离、把剩下的交给流程」。理解这条分工线,比对比功能清单更重要。
下面的顺序是按防线从里到外:先分类攻击面,再讲四层防线各自解决什么,然后逐层展开认证、信誉情报、内容链接、身份流程,最后落到选型维度与被入侵后的响应清单。邮件认证的记录层面细节见 邮件 SPF/DKIM/DMARC 配置。
一、攻击面不止一种
1.1 凭据钓鱼、恶意附件与恶意链接
这三类是量最大、技术最成熟的一类,共同点是「有可检测的载体」:一个指向假登录页的链接、一个带宏的文档、一个压缩包里的可执行文件。它们能被检出,是因为载体本身在内容或信誉上有特征。
凭据钓鱼的目标是把人引到一个长得像的登录页,拿到账号密码;恶意附件的目标是让人在本机执行代码;恶意链接介于两者之间,可能直接投放钓鱼页,也可能跳转到下载。三者的共同弱点是必须让受害者做一个动作,而这个动作通常发生在点击之后——这就是「点击时检测」有价值的原因。
1.2 账号接管之后的内部发信
比外部钓鱼更难处理的是「信真的是从内部账号发出来的」。攻击者用泄露的凭据登录一个真实账号,然后用这个账号给同事、客户、财务发信。这封信通过了所有认证:域名对、IP 对、DKIM 签名有效、DMARC 对齐,因为它本来就是合法的发信行为。
此时任何基于「发件域是否可信」的判断都失效了。可用的信号只剩下行为:这个账号平时发给谁、什么时候发、发信频率如何、有没有突然大量外发、有没有在异地或异常设备上登录。这是身份层的工作,不是认证层的工作。
1.3 BEC 为什么最难防
商务邮件诈骗(BEC)的特点是三无:没有恶意链接、没有附件、语言也正常。它的内容通常是「我下午要见客户,你先安排这笔款,回头补流程」,或者「我们换了收款账户,这是新的开户信息」。整封信里没有任何一个技术特征可供检测,因为它的攻击面是人的判断,不是软件。
技术手段在这里几乎无效,能起作用的只有流程:付款信息变更必须用已知号码回呼确认、大额付款双人复核、建立「不接受通过邮件变更收款账户」的硬规则。这三条不是安全产品的功能,是财务制度的一部分,而它们对 BEC 的有效性远高于任何过滤器。
一个常被忽视的细节:BEC 常常先做一轮「无 payload 的探路信」,比如只问「你在吗」「这个项目谁负责」,用来确认邮箱活跃、确认署名与语气。这些信在任何网关里都干净得很,但它们是有价值的线索——同一发件人短期内先探路再提要求,是可以被行为规则识别出来的模式。
二、四层防线的分工
四层防线不是四个可以互相替代的产品,而是一条纵深:每一层挡掉不同的东西,漏下来的由下一层接住。
| 层 | 解决的问题 | 典型手段 | 主要局限 |
|---|---|---|---|
| 认证层 | 本域是否被直接伪造 | SPF、DKIM、DMARC 判定 | 管不到相似域名与合法账号滥用 |
| 信誉与情报层 | 发信基础设施是否可疑 | 域名年龄、IP 声誉、情报匹配 | 新注册的干净域名无历史可查 |
| 内容与链接层 | 载体是否有恶意特征 | 链接重写、沙箱引爆、宏拦截 | 无载体的社会工程完全无感 |
| 身份与流程层 | 人与账号的行为是否异常 | 异常登录、行为基线、付款复核 | 依赖制度与执行,不靠配置 |
2.1 四层各解决什么
认证层告诉你「这封信是不是真的从它声称的域发出来的」。信誉情报层告诉你「这个发信的域和 IP 有没有前科、有多新」。内容链接层告诉你「点下去会发生什么、附件打开会做什么」。身份流程层告诉你「这个账号现在的行为像不像本人」。
把四层的输出混在一个「拦截/放行」的开关里,是很多网关用不好的原因。合理的做法是让每层的判断可解释、可分级:通过、标记、隔离、拒绝。用户在隔离区看到「为什么被隔离」的理由,比看到一个总分更有用。
三、认证层:判伪造,但只判你
3.1 DMARC 覆盖的与覆盖不到的
DMARC 的判定逻辑是「对齐」:SPF 或 DKIM 通过的那一项,其域名是否与 From 头域名一致。当攻击者直接把 From 写成你的域、又没通过你的认证时,DMARC 判失败,收件方按 p= 处置,这就是防伪造。对齐模式的细节与规范演进见 DMARC 规范更新。
它覆盖不到三类:一是相似域名,examp1e.com、example.co、exampIe.com 都不是你的域,DMARC 对它们没有管辖权;二是合法账号被接管后的发信,认证全过;三是显示名欺骗,From 的显示名写「CEO 张三」而实际地址是外部免费邮箱,认证层面完全合法。第三类最廉价也最常见,收件方只能靠「外部地址 + 内部显示名」这种启发式规则提醒。
3.2 相似域名与同形字
同形字(homoglyph)攻击利用字符外观相似:拉丁字母 l 与数字 1、西里尔字母 а 与拉丁 a、以及各种国际化域名(IDN)编码后的显示差异。防御侧能做的是提前枚举与监控,而不是事后判断。
import itertools
import os
brand = os.environ["BRAND_DOMAIN"].split(".")[0]
tld = os.environ.get("BRAND_TLD", "com")
homoglyphs = {"a": "а", "e": "е", "o": "о", "p": "р", "c": "с", "x": "х"}
variants = set()
for i, ch in enumerate(brand):
if ch in homoglyphs:
variants.add(brand[:i] + homoglyphs[ch] + brand[i + 1:])
if ch in "lo":
sub = "1" if ch == "l" else "0"
variants.add(brand[:i] + sub + brand[i + 1:])
for a, b in itertools.combinations(brand, 2):
variants.add(brand.replace(a, "", 1))
print(sorted(f"{v}.{tld}" for v in variants))
这段脚本只是枚举思路的最小演示:真实场景还要加上连字符插入、单词拼接、换 TLD 等情况,并把结果送进注册与解析监控,而非只做一次性检查。域名层面的品牌防护还可参考 企业邮箱服务选型 中关于域资产统一管理的部分。
四、信誉与情报层
4.1 域名年龄与首次出现的发件人
新注册的域名没有历史,因此无法用「过去是否发过垃圾」来判断;反过来说,正因为没有历史,它在业务语境里往往是可疑的——你的供应商不会昨天才注册域名。所以「域名注册时长」是一个便宜且有效的负向信号:越新越扣分,再叠加「这个发件域在本组织的历史里是否出现过」。
「首次出现」本身也是一个信号,但要注意它的两面性:真实的第一次合作、新接入的 SaaS 通知、客户换了域名,都会触发首次出现。合理的处置不是直接拒绝,而是加提示条、进隔离区、或要求二次确认,而不是静默丢弃。
4.2 IP 声誉与威胁情报匹配
IP 声誉看的是发信 IP 的历史行为:是否出现在黑名单、是否有高投诉历史、是否属于被大量滥用的托管网段。它的局限是共享性——一个大邮件服务商的出口 IP 承载成千上万的发件人,其中一户作恶会让整段 IP 声誉受损,于是误报与漏报同时存在。
威胁情报匹配则是「已知恶意基础设施」的比对:已知的钓鱼站点域名、已知的恶意文件哈希、已知的 C2 地址。它的价值在于快,对已经流行过的攻击命中率高;弱点是对新基础设施无感。所以这一层的作用是「低成本剔除已知」,不能当作主判断。
五、内容与链接层
5.1 链接重写与点击时检测
传统做法是收信时抓取链接做比对,问题是攻击者可以做「时效性投放」:收信时页面是正常的,几小时后再换成钓鱼页;或者按 User-Agent、IP 归属地做差异化返回,让沙箱看到干净页面、让真实用户看到钓鱼页。
链接重写把这个判断推迟到点击那一刻:邮件里的链接被改写成网关域的地址,用户点击时实时判定再跳转。它的代价是隐私与可用性——网关能看到每一次点击,链接在邮件里看起来也不是原域名;同时需要保证重写链路的可用性,否则网关抖动会变成全员无法点击邮件链接。落地时要评估这两点,而不是只看检测率。
5.2 沙箱引爆与宏拦截
附件沙箱的思路是在隔离环境里真的打开文件、观察行为:是否尝试连接外部地址、是否写入自启动项、是否释放子进程。它能抓住「静态特征看不出来但行为恶意」的样本,代价是延迟——几十秒到几分钟不等,对时效敏感的邮件要单独策略。
宏与脚本的处置更简单也更有效:默认拦截 Office 宏、拦截可执行附件类型、拦截带密码的压缩包(因为它绕过了内容检查)。这类「一律拒绝」的策略误报很低,收益很高,但需要业务侧确认没有依赖宏的合法流程。
六、身份与流程层
6.1 异常登录与内部发信基线
异常登录是最容易被现有身份系统覆盖的一层:不可能旅行(短时间内两地登录)、新设备、新地区、异常时段。检测到之后的关键动作不是「发提醒」,而是「能吊销会话」——很多事故的处置卡在这里:改了密码,但攻击者持有的令牌仍然有效。
内部发信基线是邮件系统独有的信号:某个账号平时只发给固定几个同事,突然给全公司发信;某个账号从不外发,突然向大量外部地址发送带附件的邮件;某个账号在深夜批量创建转发规则。这些模式在单一账号维度看都不算异常,在基线维度看非常刺眼。
6.2 三个最容易被忽略的后门
- 自动转发规则。 攻击者拿到账号后第一件事常常是设一条转发到外部地址的规则,从此持续收到该账号的全部来信,而用户完全无感。排查方法是定期导出所有账号的转发规则并与白名单比对。
- OAuth 应用授权滥用。 用户被诱导授权一个第三方应用访问邮箱,之后攻击者通过应用接口读信,整个过程不经过密码,也不触发登录告警。排查方法是审计企业侧的第三方应用授权,把「未审批应用的邮箱访问权限」列为高风险。
- 隐藏的收件规则。 比转发更隐蔽:把特定发件人(比如银行、安全告警、HR)的来信自动移到「已删除」或某个不常看的文件夹。它不产生外发流量,因此很难被流量监控发现,只能靠规则审计。
这三类后门的共同点是「持久化」:它们不依赖再次钓鱼,一次成功即可长期驻留。所以处置流程里必须包含「清点并清除持久化机制」,否则改完密码仍然是被入侵状态。OAuth 授权本身的安全边界见 API 安全与 OAuth/JWT。
6.3 付款流程的硬规则
对待 BEC 唯一被验证有效的办法是把判断从「读邮件」转移到「用已知渠道核对」。可落地的三条规则:收款账户变更必须用合同上预留的号码回呼确认,不接受邮件或即时消息里的新号码;超过阈值的付款必须双人复核,且两人不能是同一审批链上的上下级;新供应商首次付款设置冷静期。
制度要配技术才生效:把「回呼确认」做成流程系统里的必填项,把「双人复核」做成系统级硬约束,而不是写在制度文档里由国家自觉执行。规则能被绕过一次,就会在被绕过的那次出事。
七、选型维度与响应清单
7.1 选型维度与工具边界
看四个维度:与身份提供商(IdP)的集成深度,能否把登录风险与邮件风险关联;是否提供 API 而不只是网关串联模式,因为很多处置动作需要脚本化;误报的处理工作流,隔离区是否可自助放行、审批链是否清晰;以及对「内部到内部」发信的可见性,很多网关只看入站外部邮件,内部信完全不看。
边界要写清:工具解决不了人的判断,培训与流程不可替代;网关也不能替代 DMARC,两者是不同层——DMARC 保护你的品牌不被别人发信冒充,网关保护你的员工不被别人发信欺骗。把它们当成同一件事的两种实现,是最常见的采购误区。选型之后往往伴随一次邮箱体系迁移,改 MX 当天的风险控制见 企业邮箱迁移实操。
7.2 被入侵后的 6 小时响应清单
- 第 0–30 分钟:止血。 吊销该账号所有会话与刷新令牌,强制重置密码与二次验证设备,禁用可疑的第三方应用授权。
- 第 30–60 分钟:清点持久化。 导出并逐条检查转发规则、收件规则、签名、自动回复、委派权限;把外部转发一律删除并记录。
- 第 1–2 小时:确认影响面。 拉取该账号近 30 天的登录日志、发信记录、规则变更记录;确认是否有对外发信、是否有数据外带。
- 第 2–3 小时:阻断横向。 检查同一批账号是否被同一钓鱼页命中,检查是否存在同源的可疑登录;必要时对相关账号加限制。
- 第 3–4 小时:对外沟通。 通知可能收到过伪造邮件的客户与合作伙伴,尤其是涉及付款信息的往来;准备统一口径。
- 第 4–6 小时:复盘与加固。 定位入口(钓鱼页、密码复用、第三方授权),补上对应的检测规则与流程硬约束,把这次事件的可检测特征加入告警。
结论可以压成一句:认证层防的是「别人冒充你」,内容层防的是「恶意载体」,身份层防的是「合法账号被滥用」,流程层防的是「没有任何技术特征的诈骗」;四层缺一层,就会被那一层的攻击打穿。 基础设施侧的加固清单见 服务器加固基础清单,收进来的信如何安全解析见 入站邮件处理自动化,发信侧的信誉治理见 事务邮件与营销邮件的隔离架构。
来源:16IDC 原创,文中涉及的协议规范、平台行为与合规口径以 IETF RFC、相关监管要求及服务商官方文档为准。