实战验证:使用PowerShell检查Exchange传输规则拦截垃圾邮件效果

本文详细讲解了如何利用PowerShell命令Get-MailDetailTransportRuleReport来审计和验证Exchange Online中为拦截垃圾邮件域而设置的传输规则的实际运行效果,包括统计拦截数量、分析受影响用户和溯源垃圾邮件来源域。

检查用于拦截垃圾邮件的传输规则的有效性

拥有传输规则却不干活是毫无意义的

几周前,我写过关于使用Microsoft Graph从用户邮箱的垃圾邮件文件夹中提取垃圾域名列表的文章。该列表随后被用作传输规则的输入,以便来自这些垃圾域的任何电子邮件最终进入隔离区,而不是用户邮箱。除了用系统消息通知用户有关隔离邮件的情况(图1)会打扰用户外,这项技术效果不错。一个预定的Azure Automation Runbook会收集新出现的垃圾域名并将其添加到传输规则中。

图1:传输规则拦截来自垃圾域的邮件后发送给用户的隔离通知

实际上,传输规则效果很好,因此我决定不再用隔离通知打扰用户,并更新了传输规则,使其静默删除来自垃圾域的消息,而不通知发件人。现在出现在用户收件箱中的唯一隔离通知是针对那些并非来自这些垃圾域的消息。

检查与验证

然后,我有一种不好的预感:也许传输规则效果“太好”了,一些消息可能被错误地丢弃了。直觉告诉我一切正常,但进行一些验证可以增加我的信心。一种检查方法是搜索用户邮箱,查看自规则开始运行以来是否有来自被禁域名的消息到达,但这似乎有点侵扰性。需要另一种方法。

为了寻求确认,我运行了Get-MailDetailTransportRuleReport cmdlet来获取过去10天内邮件传输规则执行结果的数据(就像邮件跟踪日志一样,Exchange Online将此数据保留最多10天以供即时查询)。

传输规则报告可以根据规则采取的操作进行筛选。支持的操作用户可以通过运行Get-MailFilterListReport cmdlet找到:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
Get-MailFilterListReport -SelectionTarget Actions

SelectionTarget Display                    Value
--------------- -------                    -----
Actions         AddBccRecipient            AddBccRecipient
Actions         AddCcRecipient             AddCcRecipient
Actions         AddManagerAsRecipient      AddManagerAsRecipient
Actions         AddToRecipient             AddToRecipient
Actions         Allow                      Allow
Actions         AllowRedirect              AllowRedirect
Actions         ApplyClassification        ApplyClassification
Actions         ApplyHtmlDisclaimer        ApplyHtmlDisclaimer
Actions         BlockAccess                BlockAccess
...

总结传输规则拦截结果

该传输规则会静默删除垃圾消息,因此要使用的正确操作是“DeleteMessage”。以下是我用于查找和总结事件的命令:

1
2
3
4
5
6
7
[array]$Data = Get-MailDetailTransportRuleReport -Direction inbound -Action DeleteMessage
$Data | Group-Object 'TransportRule' -NoElement | Format-Table Name, Count

Name                                                        Count
----                                                        -----
Block email to administrators from outside the organization    65
Quarantine Traffic from Junk Email Domains                     80

传输规则报告事件中包含的信息如下所示:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
Date              : 02/11/2025 10:42:06
Message ID        : <89a2ec2634a1de9811917cb90a02fe3c@9pz.org>
Message Trace ID  : e07c2b05-ea8a-429d-e933-08de19fc77b1
Domain            : office365itpros.com
Subject           : Re: We make packing bags in China
Message Size      : 31720
Direction         : Inbound
Sender Address    : 1232@9pz.org
Recipient Address : james.a.abrahams@office365itpros.com
Event Type        : TransportRuleActionHits
Action            : DeleteMessage
Transport Rule    : Quarantine Traffic from Junk Email Domains

我们可以提取并总结针对垃圾域拦截传输规则的事件集,以发现如果拦截不存在,哪些人会收到垃圾邮件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
$TransportRule = 'Quarantine Traffic from Junk Email Domains'
[array]$MData = $Data | Where-Object {$_.'TransportRule' -eq  $TransportRule}

$MData | Group-Object -NoElement RecipientAddress | Sort-Object Count -Descending | Format-Table Name, Count

Name                                        Count
----                                        -----
tony.redmond@office365itpros.com               27
james.a.abrahams@office365itpros.com            7
andy.ruth@office365itpros.com                   5
lotte.vetler@office365itpros.com                5
sean.landy@office365itpros.com                  5
brian.weakliam@office365itpros.com              4
jeff.atkinson@office365itpros.com               4
office365.book.comments@office365itpros.com     4
terry.hegarty@office365itpros.com               4
contact@office365itpros.com                     3
o365itprosrenewals@office365itpros.com          2
marty.king@office365itpros.com                  1
office365book@office365itpros.com               1

这些地址大多是用来测试的虚拟账户或共享邮箱。垃圾邮件发送者通过从网络文章中收集信息得知这些地址,但向这些账户发送消息他们得不到任何好处。不过,我不喜欢在为文章截屏前清理垃圾邮件,所以看到传输规则在正常工作,我很高兴。

要查找有多少消息来自特定的垃圾域需要额外做一些工作。以下是一些代码,用于报告传输规则处理的每个域的消息数量:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
[array]$SpammyDomains = (Get-TransportRule -Identity $TransportRule).SenderDomainIs
ForEach ($Domain in $SpammyDomains) {
  $CheckDomain = "*"+$Domain+"*"
  [array]$SpamRecords = $MData | Where-Object {$_.SenderAddress -like $CheckDomain} 
  If ($SpamRecords.Count -gt 0) {
    Write-Host ("Domain {0} sent {1} spammy messages" -f $Domain, $SpamRecords.Count)
  }
}

Domain 9pz.org sent 7 spammy messages
Domain conarh02.com sent 6 spammy messages
Domain conarh03.com.mx sent 25 spammy messages
Domain conarh07.com sent 6 spammy messages
Domain spamareus.com sent 11 spammy messages
Domain fgwexvb.asia sent 4 spammy messages
Domain forkcontact.com sent 1 spammy messages
Domain moonpig.com sent 4 spammy messages
Domain annoyingcompany.co.uk sent 3 spammy messages
Domain tradetpt12.com sent 5 spammy messages
Domain tradetpxs10.com sent 4 spammy messages
Domain getportant.com sent 4 spammy messages

需要一些处理

这里的经验是,存在一种方法来验证传输规则的有效性。从传输规则报告中提取所需信息可能需要用PowerShell进行一些操作处理,但这无疑是检查规则工作效果的一种方式。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计