资讯动态

Hermes邮件服务反钓鱼加固:10个可落地的邮件安全技巧

发布时间:2026/10/20 15:36:08 来源:尧图企业网站定制
上周帮一个朋友复盘钓鱼事故情况很典型用户收到一封“HR系统升级”通知显示名是内部HR部门发件地址也伪装得差不多但点开链接后账号密码就进了攻击者的钓鱼后台。这类事故几乎每天都在上演而邮件系统作为企业对外最基础的沟通通道天然是定向钓鱼攻击的首选入口。如果你正在维护Hermes邮件服务或者打算把它作为企业邮件链路的安全网关这篇内容就是给你的一份可直接落地的加固清单。我梳理了10个自己实测有效的技巧目标只有两个一是减少钓鱼攻击的成功率二是让从你这里发出去的每一封邮件都更可信降低被外部当成垃圾或诈骗邮件的概率。别急着直接上配置。邮件安全不是装一个反垃圾模块就能完事先搞清楚钓鱼邮件为什么能绕过传统防线比急着写规则更重要。1. 动手之前先梳理邮件安全的攻防面1.1 钓鱼邮件为什么总有生存空间钓鱼邮件和传统病毒邮件的区别在于它往往没有可执行文件、没有恶意代码攻击者只靠一封话术巧妙的邮件和伪装身份就能让收件人上钩。传统杀毒引擎和内容过滤器对这类邮件几乎无能为力因为邮件正文本身是干净的恶意性藏在“人”的信任关系里。攻击者的成本极低。一封邮件的显示名可以随意写成“IT管理员”“财务部”“总经理”只要用户不点开邮箱的“完整发件人”信息就很难发现真实地址来自陌生域名。更麻烦的是钓鱼链接往往不是一开始就是恶意的攻击者会先用合法域名、短链接或者被入侵的正常网站做跳板等到有人点击时再切换到钓鱼页面这种动态变化让基于静态黑名单的检测手段永远慢半拍。还有一层被很多人忽略的现实邮件安全做的不是单点防御而是全链路对抗。从发件人身份、邮件内容、传输链路、投递信誉到最终端用户的判断力每一个环节都有对应的攻击手法。只堵住其中一处攻击者就会从另一个破口钻进来。1.2 Hermes 在邮件链路中的位置与防护思路我这边说的Hermes是指在企业邮件链路里承担收件、过滤、转发和安全审计的那一层服务或网关组件。它可以是一个独立的邮件安全网关也可以是MTA前面的一套过滤模块不管是哪种形态它都处在邮件进出的咽喉位置天然适合做全链路防护。常规思路是把防护拆成四层每层对应的攻击类型不同身份可信层解决“这封邮件真的是某公司/某人发的吗”核心是SPF、DKIM、DMARC。内容风险层解决“邮件里的链接和附件是否安全”核心是URL检测、沙箱分析、邮件头一致性校验。传输与信誉层解决“传输过程是否被窃听、发件方是否在批量投递恶意邮件”核心是强制TLS、速率限制、灰名单。人与流程层解决“恶意邮件真的到了用户手里用户能不能识别、会不会上报”核心是模拟钓鱼演练、隔离审批、应急响应。这四层对应着下面10个技巧。实际落地时不需要一下子全部启用可以先选风险最高的切入点跑起来再逐步补全。但思路要清晰每一层都要有对应的工具每一类攻击都有对应的处置通道。接下来按顺序讲技巧每个技巧都会给出配置方式、常见坑和我的实操建议。2. 技巧1-3用SPF、DKIM、DMARC拆穿身份伪装邮件身份伪造是钓鱼攻击最常用的手段。如果收件方连“发件方身份”都无法验证那一切内容检测都是在和一个看不清脸的对手搏斗。这三件套是提升邮件可信度的地基。2.1 技巧1 SPF告诉收件方哪些IP允许替你发信SPFSender Policy Framework的作用是在DNS里声明我这个域名只允许哪些服务器发送邮件。收件方收到邮件时会反查发件域名的SPF记录如果来源IP不在白名单里就判定认证失败。配置起来不复杂在域名DNS里加一条TXT记录即可vspf1 include:spf.example.com ip4:203.0.113.10 -all这条记录的含义是允许spf.example.com里定义的IP段和203.0.113.10这个地址发送本域邮件其他所有IP一律拒绝。最后的-all是硬拒绝~all是软拒绝标记但不拒收。很多企业图省事用~all这在反钓鱼场景里会留下漏洞外部反垃圾系统看到软失败往往只是提高一点垃圾分并不会直接拦截伪造邮件。我踩过的坑有两个。一是滥用include比如把某个第三方代发平台的SPF段整个include进来等于花钱给别人开了个“替你发信”的许可二是SPF规范限制DNS查询次数不能超过10次嵌套了好几层include之后记录会直接permerror反而让验证失效。测试命令很简单dig short TXT example.com看输出里SPF记录是否完整、有没有被截断。如果发现第三方发送平台的IP没覆盖到不要直接把整个include塞进来而是只添加对方给你的专用IP或子网。2.2 技巧2 DKIM给每封邮件盖上可验证的防伪章SPF只验证“信封发件人”不验证邮件头里的显示地址所以还需要DKIMDomainKeys Identified Mail。DKIM的原理是用私钥给邮件加数字签名收件方通过DNS查询公钥来验签。只要签名验证通过就能证明这封邮件确实是该域发出的而且正文和关键头在传输途中没有被篡改。生成密钥并配置的步骤我在生产环境里是这样操作的# 生成2048位RSA密钥对 openssl genrsa -out dkim-private.pem 2048 openssl rsa -in dkim-private.pem -pubout -out dkim-public.pem私钥部署到Hermes或MTA的DKIM签名配置中公钥发布到DNS一条TXT记录selector1._domainkey.example.com. TXT vDKIM1; krsa; pMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...selector选择器是给这条记录起的名字通常用selector1、s1之类的代号。关键坑有三个公钥是一长串Base64字符串DNS服务商可能会自动换行导致记录被截断配置完后一定要用dig TXT selector1._domainkey.example.com确认返回完整。私钥只在签名方持有泄露等于印章被盗需要立即重新生成并轮换。轮换密钥时不要立刻删掉旧记录。外部收件方服务器可能缓存旧公钥我一般会让新旧selector并行保留至少两周等缓存过期后再清理。2.3 技巧3 DMARC把身份验证结果变成处置策略SPF和DKIM各自都能给出“验证通过/失败”的结果但如果没有DMARCDomain-based Message Authentication, Reporting, and Conformance收件方不知道该信谁、该按什么标准拒绝。DMARC的价值在于它规定了SPF和DKIM的“对齐”标准并告诉收件方验证失败后应该怎么处理。DMARC同样是一条DNS TXT记录_dmarc.example.com. TXT vDMARC1; pquarantine; ruamailto:dmarcexample.com; rufmailto:dmarcexample.com; fo1策略字段p有三种取值none只收集报告不处置quarantine把失败邮件丢进垃圾箱/隔离区reject直接拒收。我的建议是首次上线先用pnone配合rua接收聚合报告观察至少两周统计出SPF通过率、DKIM签名率、对齐率之后再决定是否收紧到quarantine甚至reject。有几个容易被忽略的细节“对齐”意味着SPF通过的域名或DKIM签名的域必须和邮件头部From地址的域一致。很多企业让代发平台发营销邮件结果代发平台用自家的域做DKIM签名导致对齐失败被DMARC误伤。rua报告是XML格式数据量大建议搭配可视化工具或定期写脚本汇总。子域要单独管理。可以在子域的DMARC记录里用spreject声明继承父域策略否则攻击者可能注册一个看起来像你子域的域名发起钓鱼。三件套一起配置好后外部系统看到的就是“SPF通过、DKIM验签通过、DMARC策略一致”的完整可信链路这是邮件可信度的第一块基石。3. 技巧4-6在内容层把钓鱼诱饵剪断身份验证解决的是“谁发的”但攻击者可以租用合法域名、甚至攻破合法账号来发钓鱼信。因此在邮件内容层面把链接、附件和显示名这些具体诱饵处理掉是第二道防线。3.1 技巧4 URL重写与实时链接检测钓鱼邮件里最常见的载荷就是恶意URL。拦截思路不能只靠黑名单因为黑名单天然有滞后性。更好的方式是在Hermes这一层对邮件正文里的所有链接做“重写”把原始链接替换成一个由安全网关控制的跳转地址收件人点击时网关实时去查链接信誉库确认安全后才放行。在Hermes上可以这样配置一个基础的URL过滤策略url_filter: rewrite: true check: reputation dns allowlist: - https://*.corp.example.com blocklist: - short.link.example.net重写机制有一个我反复踩过的坑部分外部邮件系统会用自己的跳转域名来包装链接比如一些海外营销平台重写后可能让用户点击时经历多次跳转甚至因为参数丢失而打不开页面。解决方法是维护一个“已知正规外链平台”白名单对这些域名只查信誉、不做重写降低误伤。另一个实操经验重写后的链接要带时效。链接地址有效期默认设置成24小时甚至更短可以显著降低用户点击延迟型钓鱼链接的成功率。配合邮件内的“此邮件安全链接已检查”提示也能帮用户建立信任感。3.2 技巧5 附件进入沙箱文件类型走白名单带毒附件是另一大主流钓鱼载荷。最常见的高危类型包括带宏的Office文档docm、xlsm、带脚本的PDF、压缩包zip、rar、iso等。对这些文件只做静态扫描远远不够攻击者很容易通过混淆和加壳绕过。我在Hermes上的落地流程是这样的提取附件元数据识别文件真实类型不信任扩展名用文件头magic number判断。走静态引擎扫一遍特征能拦的直接隔离。对不确定的文件提取到沙箱环境执行观察其网络连接、进程行为、文件写入行为。沙箱判定结果回写超过风险阈值的附件直接隔离并通知收件人。这里要注意几个点攻击者经常把恶意文件塞进加密ZIP里沙箱解不开静态引擎也扫不到。我的策略是加密压缩包、需要密码才能解压的附件一律按高风险隔离不做例外。Office宏文档即使沙箱跑不出明显恶意行为也要保持高度警惕。可以单独设置“宏附件隔离管理员审批”策略。附件大小限制不能只限制单封邮件大小还要限制附件内嵌套压缩层数避免zip炸弹拖垮存储和扫描资源。3.3 技巧6 邮件头一致性校验别让显示名骗了你很多钓鱼邮件并没有高明的链接或附件只是把显示名改成“财务部”“IT Helpdesk”就骗过了一堆人。技术排查时邮件头里有几组信息可以交叉验证Envelope From信封发件人SMTP会话里实际使用的邮箱地址。Header From头From收件人看到的发件人地址可以伪造。Reply-To用户点“回复”时实际送达的地址攻击者常在这里填写真实钓鱼邮箱。校验的核心逻辑是这三个字段如果出现“看似企业内部域名实际是陌生域”的组合就必须拦截。比如显示名是“IT管理员”头From是itcorp.example.com但Envelope From是adminattacker-example.net这就是典型伪装。我写过一个简单的Python脚本用于邮件头审计思路可以直接复用import email with open(mail.eml, rb) as f: msg email.message_from_bytes(f.read()) header_from msg.get(From, ) reply_to msg.get(Reply-To, ) header_domain header_from.split()[-1].strip().strip() reply_domain reply_to.split()[-1].strip().strip() if reply_to else # 核心规则Reply-To的域与Header From的域不一致时标记为可疑 if reply_domain and reply_domain ! header_domain: print(可疑Reply-To域与From域不一致)把这个逻辑做成Hermes过滤插件或者一个独立的邮件头审计程序后还要做一条附加规则凡是外部域名发给内部用户的邮件如果显示名包含“管理员”“财务”“总经理”等内部身份关键词就自动在邮件顶部追加一行外部来源提醒。这一步不影响投递但对用户识别伪装非常有效。4. 技巧7-8传输与信誉边界加固身份和内容都处理完之后还需要防住传输链路和投递信誉这两个边界问题。前者防止邮件在传输过程中被窃听和篡改后者防止恶意邮件被批量投递到用户收件箱。4.1 技巧7 用MTA-STS和TLS-RPT保证传输链路不降级邮件传输默认靠STARTTLS协商加密但这种协商方式存在降级攻击风险攻击者可以在链路中主动干扰握手让双方回落到明文传输从而偷看邮件内容。MTA-STSMail Transfer Agent Strict Transport Security的作用就是把“能加密”变成“必须加密”。启用MTA-STS分两步。第一步在DNS添加_mta-sts.example.com. TXT vSTSv1第二步在https://mta-sts.example.com/.well-known/mta-sts.txt放一个策略文件内容如下{ version: STSv1, mode: enforce, mx: [mx1.example.com, mx2.example.com], max_age: 604800 }mode有三种取值none不生效、testing只记录不强制、enforce强制加密。如果对方服务器不支持TLS或证书校验失败enforce模式下邮件会被拒收这能防降级但也可能误伤还没上线的伙伴域名。稳妥做法是先跑一个月testing模式确认没有任何业务邮件因为TLS问题被卡之后再切到enforce。TLS-RPT是配套的回报机制用来让外部收件方汇报TLS协商和策略执行情况_smtp._tls.example.com. TXT vTLSRPTv1; ruamailto:dmarcexample.com这样就能在MX服务器那边看到实时汇总哪家邮件服务商的TLS支持有问题、哪些外发域名出现过证书失败一目了然。4.2 技巧8 发件速率、灰名单与动态信誉恶意邮件的投递行为有很强的批量特征短时间内从同一个源IP发出大量收件人地址不同的邮件或者从一组新注册的IP轮换发送。针对这个特征Hermes侧适合加两层控制速率限制和灰名单。速率限制的玩法比较直接。比如对每个外部源IP设置“每分钟最多投递N封、连接失败超过阈值就临时拉黑”对单封邮件收件人数设置阈值超过20人自动触发二次审核或改投隔离区。具体参数要结合业务流量来调内部老员工的正常群发和攻击者批量投递在短时间窗口内差异很大没必要为了照顾极端情况把阈值放得太松。灰名单greylisting的原理是对陌生发件人发出的邮件先临时拒绝并返回“请稍后重试”。真正的邮件服务器会自动重试而大多数群发钓鱼工具不会。这招对垃圾邮件效果很好代价是会轻微延迟部分正常邮件。我的建议是用在“首次联系”的陌生域而不是所有外部域。比如已经存在历史通信记录的域直接放行新域必须通过灰名单和信誉评分。需要克制的是白名单。业务部门经常要求“把某大客户的IP加白”加完之后这个来源的所有邮件就不再经过内容检测了。我的经验是白名单范围越窄越好最好精确到IP域名组合而不是通配整个服务商。白名单应该是“少而可信”的例外机制不是绕过安全检测的后门。5. 技巧9-10让人和流程成为最后的防线技术手段再完善也拦不住所有钓鱼邮件。真正有效的邮件安全体系必须把用户的行为习惯和应急流程纳入进来。这两个技巧不涉及复杂的系统配置但往往能救回最关键的那封邮件。5.1 技巧9 模拟钓鱼演练和一键举报机制安全意识的建立不能靠每年一次培训考试要靠高频、低成本的模拟演练。我维护的邮件系统每个月会随机抽取30%的用户发送一封无害的模拟钓鱼邮件场景包括“账户异常登录提示”“系统密码即将过期”“附件待签收”。邮件里所有链接都指向内部演练平台会记录谁点击了、谁输入了账号密码。完整的演练流程需要注意演练前要和业务方、合规部门打好招呼避免造成恐慌也避免收集过多个人行为数据引发隐私争议。演练邮件要有明显的“退出机制”用户点击后进入的页面应当提示“这是演练邮件你刚才的操作存在风险”而不是故作神秘。演练结果要沉淀成评分对反复点击的员工单独安排小班辅导而不是公开点名。更重要的一侧是“一键举报”。在用户邮箱客户端或者Hermes的界面上提供“举报钓鱼邮件”按钮点击后自动把原始邮件转发到一个专用安全邮箱并带上完整邮件头和说明标记。我这边每封举报邮件都会被自动提取IOC恶意链接域名、附件hash、发件地址进入统一的威胁库然后比对近30天的全量邮件看看同一封邮件是否也发给了其他人。这个机制能把单点的用户发现快速转化为全局阻断能力。5.2 技巧10 隔离审批与事件响应SOP最后一条技巧是给运维团队的。邮件安全不只是“过滤”还需要“处置”。处置路径分两类对外发的可疑邮件走隔离审批对已确认的钓鱼事件走应急响应流程。外发隔离审批主要针对的是有敏感信息外发风险的邮件。Hermes上可以配置内容审计规则凡是邮件正文或附件命中身份证号、银行卡号、批量客户数据等关键词一律不直接放行而是进入管理员的审批队列。这一步可以明显减少因账号被盗导致的数据外泄也能防内部人员有意无意的违规发送。已确认钓鱼事件的响应流程我整理成一套固定SOP每次照着走不会漏步骤确认样本收到用户举报或沙箱告警后先人工确认真实性收集原始邮件头。提取IOC把恶意链接、附件hash、发件IP、指纹信息写入规则库。全站检索在Hermes的邮件日志里搜索该IOC关联的所有邮件找到全部收件人。隔离撤回对未读邮件执行强制隔离对已读邮件发送风险提醒。通知用户告诉用户不要点击链接、不要修改密码密码可能泄露的要求立即重置。复盘更新分析攻击者利用了哪层漏洞是SPF没对齐、是网关规则漏了还是纯粹靠伪装成功。每一条结论都变成一条新规则。第六步最重要。我发现很多团队做完前五步就收工结果半个月后同一个模板的钓鱼换个域名又进来了。没有复盘闭环安全建设就是原地打转。6. 常见问题与排查技巧实录这10个技巧我并不是一次就配好的中间踩过不少坑。把最典型的问题和排查思路整理成一张表遇到类似情况可以直接对号入座。现象可能原因排查步骤SPF记录加了外部还是退信或拒收include嵌套超过10次DNS查询、IP段没覆盖完整dig TXT看是否permerror逐个include展开确认覆盖范围DKIM验证失败率高公钥记录截断、selector写错、私钥轮换后旧缓存未过期dig TXT selector._domainkey.example.com核对公钥完整性保留旧selector两周DMARC报表大量未对齐邮件代发平台用自己的域做DKIM、SPF包含段过宽检查第三方平台签名域要求使用你自己域或换成对齐策略邮件被拒且报TLS相关错误MTA-STS是enforce模式、对方证书失效先切回testing模式排查对方MX证书再决定是否保持enforce外部合法邮件被误隔离白名单过窄、URL重写误伤跳转参数、灰名单延迟重试失败查看隔离区命中规则按匹配项把可靠发件人加入白名单用户频繁收到伪造内部邮件SPF用了~all或者DMARC策略还没收紧核对SPF尾部是否为-allDMARC从quarantine逐步收紧再补三个很少被写进文档的实操经验。第一DMARC策略不要直接从none跳到reject。我见过有团队把preject上线后第二天所有走代发平台的业务邮件全被拒收原因是营销系统用的是服务商自己的签名域对齐率长期只有30%。先看数据再动手。第二DKIM密钥轮换时老selector不要急着删。某次我轮换后的第三天有用户陆续反馈“发送给某大型邮箱服务商的邮件被延迟”查了半天才发现那家服务商缓存公钥的时间比我们预期长。之后我把旧记录保留周期固定为14天再没出过同类问题。第三MTA-STS策略文件的域名和MX域名一定要匹配。有人在mta-sts.example.com上放了策略但MX记录里用的其实是另一个域名的机器外部拉取策略时验证失败直接掉进enforce的拒信逻辑业务影响面非常大。上线前用外部工具检测一下策略文件的可达性和MX对齐情况。邮件安全没有一劳永逸的方案它更像是一场持续的精装修。我这几年维护下来最大的体会是真正重要的不是某一个技巧有多花哨而是你能不能把身份验证、内容检测、传输加密、用户意识这四条线都跑起来并且坚持每天看报表、每周清隔离区、每月跑一次应急演练。邮件可信度是积累出来的你每一次回复钓鱼邮件、每一次修正SPF记录、每一次给用户发风险提醒都在给这个体系加分。希望这篇梳理能帮你的Hermes环境少踩几个坑也欢迎你把遇到的新手法或新问题拿出来交流。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑