下载这篇文章的代码: Edge2007_11.exe (161KB)
面对在 Internet 中肆虐的大量垃圾邮件和其他恶意内容,您如何确保将邮件可靠和安全地发送给组织内的用户?在上个月专栏中本系列的第一部分,我开始描述的一种方法是
在 Internet 和生产环境之间的外围网络中部署 Exchange Server 2007 边缘传输服务器和 Forefront Security for Exchange Server。
此系列分为两部分,这是后一部分,我将在其中介绍如何使用 Exchange Server 2007 的标准代理日志记录和跟踪功能分析运行中的边缘传输代理。我还会使用自定义方法将所有事件对象从传输管道转储到基于 XML 的文件。然后,我将以 Microsoft 在自己的企业生产环境中使用的配置为例,说明如何将反垃圾邮件设置应用到边缘传输测试实验室。最后,我将总结现实中的一些有趣测试方案以查看边缘传输代理如何针对各种垃圾邮件情形作出响应。
有关边缘传输测试实验室的安装和常规边缘传输体系结构的详细信息,请参见 2007 年 10 月的《TechNet 杂志》中本系列的第一篇文章,可在 technetmagazine.com/issues/2007/10/Edge 上获得。
我大量使用脚本和批处理文件以自动执行最重要的配置任务,您可以在本文随附的代码下载中找到这些脚本(请转到 technetmagazine.com/code07.aspx)。此外,有关边缘传输代理的 Microsoft IT 配置的更详细的背景信息,我推荐您阅读针对 Microsoft IT Showcase 编写的技术白皮书“Microsoft Exchange Server 2007 边缘传输和邮件保护”。您可以从 microsoft.com/technet/itshowcase/content/edgetransport.mspx 下载此 IT Showcase 白皮书。
日志记录和跟踪
Exchange Server 2007 提供了许多便于诊断和解决传输代理问题的日志记录和跟踪功能,包括协议日志记录、代理日志记录和管道跟踪。尽管在本文中我没有讲述如何解决传输代理问题,但是日志记录和跟踪信息对检查边缘传输代理如何工作非常有用。
如果您希望跟踪有关 SMTP 发送和接收活动的信息,您应该对发送和接收连接器启用协议日志记录。使用在本系列的第一部分中设置的测试环境(参见图 1),我通过 New-SendConnector 和 New-ReceiveConnector cmdlet 上的以下设置启用了协议日志记录:
图 1 测试环境
CProtocolLoggingLevel: Verbose
默认情况下,您可以在 %ProgramFiles%\Microsoft\Exchange Server\TransportRoles\Logs\ProtocolLog 下的子文件夹中找到生成的 SMTP 日志文件。
如果您希望分析 SMTP 对话,协议日志记录会非常有用;然而,反垃圾邮件代理并不总是影响 SMTP 会话。例如,内容筛选器代理可能仅使用垃圾邮件可信度 (SCL) 值对入站邮件作出标记。只要 SCL 值低于指定的阈值(默认值为 7),内容筛选器代理就不会导致边缘传输过程拒绝邮件。因此,SMTP 对话进程不会受到影响。
要分析反垃圾邮件代理(连接筛选器、内容筛选器、边缘规则、收件人筛选器、发件人筛选器和发件人 ID)对通过传输管道的邮件所执行的操作,您需要检查代理日志而不是协议日志。通常根据 EdgeTransport.exe.config 文件中的 AgentLogEnabled 参数启用代理日志记录。默认情况下,代理日志位于 %ProgramFiles%\Microsoft\Exchange Server\TransportRoles\Logs\AgentLog 文件夹中。您可以在记事本中打开日志,不过 Get-AgentLog cmdlet 可以更直观地显示 Exchange 命令行管理程序中的代理日志信息。
另一个有用的功能是管道跟踪,当来自特定发件人的邮件通过传输管道时,您可以使用它捕获其邮件快照。其思路相当简单;在调用为 OnEndOfHeaders、OnEndofData、OnSubmittedMessage 和 OnRoutedMessage 事件注册的 SMTP 接收和路由代理前后,边缘传输过程创建每封邮件的快照。通过比较这些邮件快照,您可以看到单个代理如何修改每封邮件。当然,在测试环境中启用这一有价值的功能是必要的。
按照以下方式使用 Set-TransportServer cmdlet 可为测试用户激活管道跟踪。正如您所预料的,将 PipelineTracingEnable 参数设置为 $true 会启用管道跟踪。测试用户的电子邮件地址在 PipelineTracingSenderAddress 参数中设置:
Set-TransportServer CIdentity EDGE01 CPipelineTracingEnabled $true -PipelineTracingSenderAddress [email protected]
启用管道跟踪后,您可以在 %ProgramFiles%\Microsoft\Exchange Server\TransportRoles\Logs\PipelineTracing\MessageSnapshots 文件夹中找到来自指定发件人(在本例中,其邮件地址为 [email protected])的每封邮件的邮件快照文件。这是默认文件夹。对于每封邮件,快照文件位于根据分配给该邮件的 GUID 命名的子目录中。请注意,原始邮件在名为 Original.eml 的文件中,邮件的副本在以 SmtpReceive 或 Routing 为前缀的 .eml 文件中(具体前缀取决于遇到的事件和安装的代理)。要分析为 SMTP 接收事件 OnEndofData 和 OnEndOfHeaders 注册的反垃圾邮件代理的过程,请检查 SmtpReceive*.eml 文件。要分析为路由事件 OnSubmittedMessage 和 OnRoutedMessage 注册的防病毒和其他代理的过程,则需要分析 Routing*.eml 文件。
自定义管道转储
尽管标准功能并未涵盖所有传输事件,但是 Exchange Server 2007 的标准代理日志记录和跟踪功能可满足所有故障排除的需要。例如,由于发送主机尚未传送可能要写入 %ProgramFiles%\Microsoft\Exchange Server\TransportRoles\Logs\PipelineTracing 文件夹的任何邮件,管道跟踪无法捕获有关 OnConnectEvent、OnEhloCommand、OnMailCommand、OnRcptCommand、OnDataCommand 和类似传输事件的信息。如果您希望捕获有关这些事件的详细信息,需要实施自定义代理以将事件数据转储到文件系统上的文件。
正如我以前的文章中所述,创建自定义代理并不复杂,因此我在这里构建一个 SMTP 接收代理和一个路由代理,以将所有事件对象从传输管道转储到 XML 文件中。您可以在为本文提供的下载中找到相应的 Microsoft Visual Studio 2005 项目,名为 PipelineXMLDump。两个重要的文件是 DumpAgents.cs 和 XMLDump.cs,前者实施代理工厂和代理,后者实施帮助程序类以通过 System.Re- flection 方法将事件源和事件参数对象的字段写入 XML 文件。如果您编译源代码并将生成的 PipelineXMLDump.dll 文件复制到边缘传输测试服务器上名为 C:\PipelineXMLDump 的文件夹中,则可以使用脚本 RegisterPipelineXMLDump.ps1 和 EnableDumpAgents.ps1 注册并启用自定义代理。这些脚本包含在下载中的 PipelineXMLDump 项目文件夹中。当然,我的自定义代理仅用于说明,尚未进行充分测试,请不要安装在生产服务器上。使用这些代理的风险由您自己承担。
DumpAgents.cs 向您展示如何实施传输管道支持的所有 SMTP 接收和路由事件处理程序。如果您希望实施自己的自定义代理,这可以是一个很好的起点。我的转储代理在 %ProgramFiles%\Microsoft\Exchange Server\TransportRoles\Logs\PipelineXMLDump 下的子文件夹中写入 XML 文件,这些子文件夹对应于 SMTP 会话的标识符(SMTP 接收代理)或消息标识符(路由代理)。图 2 显示了传送到 OnConnectEvent 处理程序中 SMTP 接收代理的事件参数信息示例。该示例显示了接受传入连接请求的本地 IP 终结点(IP 地址和端口)。
图 2 OnConnect 事件期间转储的参数信息 (单击该图像获得较小视图) 图 2 OnConnect 事件期间转储的参数信息 (单击该图像获得较大视图) 准备测试运行
关于日志记录、跟踪和转储的理论已经足够了。现在我们准备一些测试运行来显示实际运行中的反垃圾邮件代理。以下是尽可能反映您的测试环境中 Microsoft IT 配置的摘要。如前所述,背景信息可在技术白皮书“Microsoft Exchange Server 2007 边缘传输和邮件保护”中获得。
首先,运行附带下载中的 EDGE01_disable_agents.ps1 脚本,以取消激活地址重写入站、附件筛选器和地址重写出站代理。由于收件人在内部和外部使用同一电子邮件地址,因此地址重写不是必需的。由于 Forefront Security 提供了取代附件筛选功能,所以我不使用附件筛选器代理。
测试环境未连接到 Internet。这就难以测试连接筛选器代理。要解决此问题,可以通过运行 INTERNET01_create_IP_block_list.bat 文件在 Internet 主机上创建 IP 阻止列表。请确保安装了 Windows 支持工具,因为这些工具包括 DNS 命令行工具 (dnscmd.exe)。否则,您必须手动使用 DNS 控制台创建 DNS 记录,这会花费一些时间。
现在您可以通过运行 EDGE01_add_block_list_provider.ps1 脚本配置连接筛选器代理。该脚本为 ip-bl.consolidatedmessenger.com 添加 IP 阻止列表提供程序。这是 Consolidated Messenger 的 IP 阻止列表,如前所述,已在测试环境中通过在 Internet 主机上运行 INTERNET01_create_IP_block_list.bat 文件创建。Microsoft IT 还使用本地 IP 阻止列表和 IP 允许列表,但是这些功能不需要手动配置。一定要注意,Microsoft IT 不使用 IP 允许列表提供程序。
下一步,通过运行 EDGE01_recipient_filter.ps1 脚本配置收件人筛选器代理以阻止发送到不存在的收件人的邮件、发送到邮箱的邮件和仅用于内部或出站的全局通讯组列表。
发件人筛选器代理还需要配置更新。Microsoft IT 使用发件人筛选作为阻止来自特定发件人地址的大量邮件攻击的对策,并阻止特定列表服务器和认为与业务无关的类似邮件源。Microsoft IT 进一步使用发件人筛选来阻止发件人信息无效或缺少的邮件。让我们通过在边缘传输服务器上运行 EDGE01_sender_filter.ps1 脚本,将该配置应用到测试环境。
如果您希望完全反映 Microsoft IT 配置,还需要在 DNS 中配置发件方策略框架 (SPF) 记录。要为从您的域 (adventure-works.com) 发出的邮件生成宣称边缘传输服务器授权的 SPF 记录,您可以使用 Microsoft Sender ID Framework SPF Record Wizard,该向导可在 microsoft.com/mscorp/safety/content/technologies/senderid/wizard 上获得。尝试一下并指定一个现有的 Internet 域名。在测试环境中,您可以在 Internet 主机上运行 INTERNET01_create_SPF_record.bat 文件。
就是这样!由于大多数代理的默认设置比较合理,因此无需进一步配置参数。要为边缘规则、发件人 ID、协议分析和内容筛选器代理快速检查最重要的默认设置,请在边缘传输服务器上运行 EDGE01_check_defaults.ps1 脚本。
运行中的边缘传输代理
现在,我们将边缘传输代理放在一些实际的邮件方案中来工作。要将测试消息发送到边缘传输服务器,我使用 Windows Server 2003 和 Outlook Express 中包含的 SMTP 和 POP3 服务作为邮件客户端,大部分时间使用默认设置,但确保启用了日志记录。
但是,首先要警告您:如果您的测试环境已连接到生产系统或 Internet,请不要执行本部分中描述的任何步骤或脚本。测试的风险由您自己承担。
我要测试的第一个代理是连接筛选器代理。首先测试它是因为它是边缘传输服务器上工作最繁忙的代理。在 Microsoft,连接筛选器代理阻止了所有 Internet 邮件提交的大约 88%。一个正常工作日有 1300 万个提交尝试,其中仅 150 万来自合法发件人。
因此,让我们以 [email protected] 的名义将一封电子邮件发送到 [email protected]。如果一切工作正常,则管理员不应该收到邮件。相反,Fabrikam.User 应该收到传递状态通知 (DSN),说明无法传递给收件人。Fabri- kam.User 验证该电子邮件地址是正确的,再次发送同一邮件,而 Fabrikam.User 再次收到 DSN。然后,Fabrikam.User 呼叫服务台并报告问题。她不是第一个遇到此问题的人。事实上,Fabrikam 中的任何人都无法继续与 Adventure Works 交流。发生了一些问题。情况很紧急。要尝试快速解决问题,请检查 INTERNET01 上 %systemroot%\system32\Logfiles\SMTPSVC1 文件夹中的 SMTP 日志,如图 3 中红色文本所示,就是这样!
550 错误响应告诉您 Consolidated Messenger 将您的 Internet 主机的 IP 地址放在了 IP 阻止列表上。实现了预期效果。您联系 Consolidated Messenger 以将其从该列表中删除。事实证明,将 IP 地址放在 Consolidated Messenger 阻止列表中比从列表中删除它更容易。要清除它,即使不需要几周的时间,也要花费几天。
您需要更快地获得帮助,因此,您通过电子邮件地址 [email protected] 与 Adventure Works 联系。您以 [email protected] 的名义发送一封电子邮件,描述情形并要求解除对主机的 Internet IP 地址(在本例中是 192.168.1.100)的锁定。验证您的身份后,Adventure Works 使用以下命令指定一个临时例外(该例外在 30 天后自动过期),从而解除了地址锁定:
Add-IPAllowListEntry -IPAddress 192.168.1.100 -ExpirationTime (get-date).AddDays(30)
30 天应该足够让您使用 Consolidated Messenger 对事务进行分类,而 Adventure Works 不需要花费时间手动维护该例外。通过指定自过期例外,Adventure Works 在最大程度上降低了与维护 IP 允许列表相关的管理开销。
安全发件人
下一步,我们将测试内容筛选对安全发件人的识别,这是一项有趣的新功能,旨在提高垃圾邮件筛选的精确度。EdgeSync 将经过散列和加密处理的安全发件人信息从内部环境传播到边缘传输服务器。内容筛选器代理在筛选过程中使用该信息做出合理的决定。您只需将安全发件人信息(即安全发件人列表、安全收件人列表、阻止的发件人名单和外部联系人)放入 Active Directory 中,方法是先使用 Update-SafeList cmdlet,然后使用 Start-EdgeSynchronization cmdlet 将该信息复制到边缘传输服务器。Microsoft IT 按照计划在非高峰时段运行 Update-SafeList cmdlet。在我们的测试环境中,完全可以手动运行相应的脚本 (HUB-MBX-01_update_safelist.ps1)。
首先,通过在边缘传输服务器上运行 EDGE01_clean_up.ps1 脚本清理测试环境,以删除先前创建的 IP 允许列表条目。由于内容筛选器代理不对来自该列表上的源的邮件执行操作,因此这是必要的。然后,在 Internet 主机上运行 INTERNET01_clean_up.bat 文件,从 Consolidated Messenger 阻止列表中删除与 100.1.168.192.ip-bl.consolidatedmessenger.com 对应的 IP 阻止列表条目。否则,如前所述,模拟的 Internet 主机将不能发送邮件。
最后,发送一封内容筛选器代理几乎一定会视为垃圾邮件的邮件。由于内容筛选器代理使用默认的 SCL 拒绝阈值将大多数邮件传递给用户以尽可能减少误报,因此这具有一定的欺骗意义。然而在一些测试后,我发现了一个将 SCL 分级升为拒绝级别的邮件版本。要以 [email protected] 的名义发送邮件,请在 Internet 主机上运行 INTERNET01_contoso_msg.vbs 脚本。
我的脚本使用匿名 SMTP 连接将邮件提交到 INTERNET01 上的 SMTP 服务。为了使其正常工作,您需要将 SMTP 服务配置为中继匿名用户的邮件。在 IIS 管理器中,打开默认 SMTP 虚拟服务器的属性。在“访问”选项卡上,单击“中继”按钮,然后选择“除以下列表外的所有项”。很快我将讲到该配置的含义。
当您运行脚本发送该邮件时,Contoso.User 应该收到 DSN,说明传递失败,其内容如下:Diagnostic-Code:smtp;550 5.7.1 由于内容限制而拒绝了邮件。您还可以在 Internet 主机上的 SMTP 日志中看到该响应,如果在边缘传输服务器上运行命令 Get-AgentLog | Select-Object -Last 1 来显示代理日志中的最后一个条目,您应该能够看到由于其 SCL 分级为 7 而被拒绝的邮件,如图 4 所示。
图 4 由于内容限制而被阻止的邮件 (单击该图像获得较小视图) 图 4 由于内容限制而被阻止的邮件 (单击该图像获得较大视图) 现在,Contoso.User 不是垃圾邮件发送者。遗憾的是,在这种情况下 Contoso.User 的邮件被阻止,但是她通常可与 Adventure Works 的收件人进行交流。因此,Contoso.User 在另一封电子邮件中通知管理员她的原始邮件被错误地阻止。管理员知道 Contoso.User,并且为确保垃圾邮件筛选器将来不再阻止她的邮件,管理员将 Contoso.User 添加到安全发件人列表中。要在 Office Outlook 2007 中执行此操作,请右键单击从 Contoso.User 接收的邮件,指向“垃圾邮件”,然后单击“将发件人添加到安全发件人列表”。
Update-SafeList cmdlet 按照一般的间隔运行来刷新 Active Directory 中的安全列表信息,在下一个边缘同步后,Contoso.User 将能够与管理员进行交流而不会发生误报。要模拟该过程,请运行 HUB-MBX-01_update_safelist.ps1 脚本。
现在运行 INTERNET01_contoso_msg.vbs 脚本再次发送 Contoso.User 邮件。然后使用命令 Get-AgentLog | Select-Object -Last 1 检查边缘传输服务器上的代理日志,您可以在 ReasonData 下看到现在已跳过内容筛选。不再有 Contoso.User 的误报!
垃圾邮件攻击
在测试运行即将结束时,我们尝试一种极端情况。您肯定已经注意到,我在前面的测试中将 Internet 主机配置为开放中继,这就为垃圾邮件发送者打开了大门。因此,如果 [email protected] 注意到该容易利用的配置并滥用主机将成千上万封垃圾邮件发送到 Adventure Works,让我们看看将发生什么情况。INTERNET01_spam_msg.vbs 脚本仅提交一封垃圾邮件,但是您可以编辑脚本并更改 max_loop 值来生成更多的垃圾邮件。
为了模拟垃圾邮件攻击,我将 1,000 封邮件提交到受到影响的主机以中继到边缘传输服务器。SMTP 服务将每个出站连接的邮件数限制为 20,因此,在边缘传输服务器上的协议分析代理具有足够的邮件和触发事件之前,中继足够的垃圾邮件数会花费一些时间。
协议分析代理基于 SMTP 协议分析和 Microsoft Update 提供的 IP 信誉更新自动维护 IP 阻止列表条目,以帮助连接筛选器代理。在本例中,SMTP 协议分析会捕获垃圾电子邮件。协议分析代理跟踪每封邮件的 SCL 分级来计算它用来确定发件人信誉级别 (SRL) 的平均 SCL 值。在我的模拟垃圾邮件活动中,由于越来越多的不合法邮件到达,Internet 主机的 SRL 会不断增长,直到超过 SRL 阻止阈值。结果,该主机在 IP 阻止列表上停留 24 小时。该主机中不会再发出更多的垃圾邮件!它会自动发生。管理员不需要进行任何干预。
图 5 显示了最终的 IP 阻止列表条目和邮件处理中的相应更改。阻止主机之前,边缘传输服务器在 OnEndOfData 事件过程中拒绝了每封垃圾邮件,因为内容筛选器代理根据 SCL 阈值处理每封邮件(请参考图 4)。邮件已提交,尽管没有成功。阻止我的主机后,在 OnMailCommand 事件过程中,连接筛选器代理拒绝了连接。不再提交邮件。这就节省了在邮件提交之前断开垃圾邮件发送者的连接所需的网络带宽和处理资源。
图 5 阻止发送垃圾邮件的 Internet 主机 (单击该图像获得较小视图) 图 5 阻止发送垃圾邮件的 Internet 主机 (单击该图像获得较大视图) 进一步测试
当然,您可以测试更多的代理功能和方案。例如,可以通过以 [email protected] 或 [email protected] 名义发送邮件来测试发件人筛选,通过将邮件发送到 [email protected] 来测试收件人筛选,还可以使用 Telnet 按不同的缓送间隔模拟目录收集攻击。Microsoft IT 在面向 Internet 的接收连接器上为 SMTP 5yz 响应使用 5 秒钟的默认间隔,这段时间足以让 Microsoft IT 呈现垃圾邮件发送者无法得逞的目录收集攻击。但是您可以使用 Set-ReceiveConnector cmdlet 应用不同的值,如 EDGE01_tarpitting.ps1 脚本中所示。
您还可以深入了解并检查管道跟踪为来自 [email protected] 的邮件创建的快照文件。检查防病毒戳记,X-MS-Exchange-Organization-AVStamp-Mailbox:MSFTFF;1;0;0 0 0,Forefront Security 使用它将邮件标记为已扫描。当集线器传输服务器上的 Forefront Security 找到带有最近版本信息的该戳记时,它无需再次扫描该邮件。如果您尝试通过将伪防病毒戳记插入测试邮件欺骗 Forefront Security,您会看到邮件头防火墙发生作用,它在 OnDataCommand 事件后立即删除这些戳记,之后很久才会触发调用 FSE 路由代理的 OnSubmittedMessage 事件。
在您查看快照文件中的邮件头时,可能希望为 Contoso.com 创建 SPF 测试记录,以将错误的 IP 地址标识为合法发件人。实现此操作的一种方法是在 Internet 主机上运行 INTERNET01_wrong_SPF_record.bat 文件。然后,您应该以 [email protected] 的名义发送测试邮件并查看 X-MS-Exchange-Organization-SenderIdResult 和 Received-SPF 邮件头:
X-MS-Exchange-Organization-SenderIdResult: SoftFailReceived-SPF: SoftFail (EDGE01.extranet.adventure-works.com: domain of [email protected] discourages use of 192.168.1.100 as permitted sender)
总结
您在本文和我以前的文章中可以看到,Exchange Server 2007 边缘传输服务器附带一组全面的传输代理来实施可靠、高精确度的反垃圾邮件功能,包括连接筛选、协议分析和内容筛选。传输体系结构是可扩展的,并支持实施其他代理来提供附加功能。例如,FSE 路由代理就是将 Forefront Security for Exchange Server 集成到传输体系结构的附加代理。
与其他功能(如连接缓送、邮件头防火墙、TLS 和身份验证)结合使用,边缘传输服务器提供了在多层实现极高级别邮件保护的必要方法,而不会发生单点故障。通过在外围网络中部署边缘传输服务器和 Forefront Security 并与内部 Exchange Server 组织严格分离,您可以阻止大量不合法和恶意内容进入邮件环境,将合法邮件传递给用户,并且具有非常低的误报率。
Kay Unkroth是一位企业家,他曾担任支持工程师、系统开发人员、顾问、培训师和撰稿人,研究 Microsoft 服务器技术已达 15 年以上。Kay 还是 Biblioso Corporation 的共同创始人兼董事长,该公司专门从事托管文档和本地化服务。
1.第一部分:Microsoft 的 Exchange 边缘传输服务器 http://www.5dmail.net/html/2007-9-29/2007929121318.htm
2.原文链接:http://www.microsoft.com/technet/technetmag/issues/2007/11/Edge2/default.aspx?loc=zh/