第十四章:管理Rspamd

第十四章:管理RspamdSpam 和 Sieve允许列表超越符号分数数学与垃圾邮件持续的垃圾邮件培训IMAPSieve 和 Extprograms启用 Sieve 模块培训脚本测试持续学习配置 IMAPSieve使用Rspamd测试IMAPSieveRspamd灰名单Rspamd推出缓慢

我们在第7章中安装了一个基本的rspamd配置,然后将其用于SPF和DKIM验证。

Spam 和 Sieve

X-Spam 标头为我们提供了一个简单的过滤目标。这是第12章末尾讨论的 sieve_before 规则的主要用途,允许您在任何人的个人过滤器必须启动之前应用过滤器。

dovecot.conf 中添加一个新的Sieve过滤器:

现在我们只需要一个搜索该标头的Sieve规则:

一定要指定 :create ,这样如果用户删除了他们的垃圾邮件文件夹,Dovecot就会重新创建它。

Dovecot和Sieve现在将在垃圾邮件文件夹中将 X-Spam 标头设置为“yes”的所有内容都归档。通过调整 /etc/rspamd/local.d/actions.conf 中的 add_header 操作阈值,可以增加或减少灵敏度。

允许列表

我们都有合法的通信者,他们的邮件系统很糟糕。我的一个商业伙伴有一个MTA,它羡慕原始Novell Netware邮件网关的技术复杂性。我不知道其他人是如何接受他们的信息的,但我必须这样做。Rspamd有一个允许列表系统,允许您重新加权来自选定通信者的消息。Rspamd仍在测试来自所列域的消息,但允许列表为这些消息分配了额外的权重。诀窍是分配权重,使消息能够克服它们通常携带的符号,同时留出检测伪造消息的空间。

允许列表用于检查SPF、DKIM和/或DMARC。如今,任何向更广泛的互联网发送邮件的人都必须至少拥有其中一个。检查邮件的标头以查看它们提供了什么,并仔细检查DNS以确保它仍然存在。

/etc/rspamd/modules.d/whitelist.conf 中的允许列表规则定义了有效和无效SPF、DKIM、带SPF的DKIM和DMARC的符号。让我们考虑一下DMARC列表:

此规则需要有效的DMARC,并适用于枚举域的映射。请记住,映射将多个数据源聚合到一个列表中。此映射从 rspamd.com 网站、本地文件和web服务器的数据目录中提取当前列表。最后一个映射条目是回退列表。来自这些域并具有有效DMARC的消息的权重为 -7。来自这些域的未通过DMARC验证的消息被分配了符号BLACKLIST_DMARC。对 /etc/rspamd/scores.d/whitelist_group.conf 的检查显示,该符号的权重为6。

该映射包含已验证具有可靠DMARC策略的域列表。来自这些域的电子邮件应始终具有有效的DMARC。查看后备名单可以发现金融机构、社交媒体公司和电子商务公司。此允许列表声明,如果消息的DMARC验证,则来自这些实体的消息可以被信任。

最终的结果是,实际上来自这些大银行的信息得分很低,应该毫发无损地通过rspamd,即使他们的MTA在其他方面是不文明的。假装来自你的银行或名单上任何其他银行的消息都很重,应该像砖头一样沉下去。

几乎可以肯定,你想把一些组织放在允许列表中,但这些组织没有出现在默认列表中。看看这些组织给你发的信息。他们有有效的SPF和/或DKIM吗?每个符号都有自己的映射和本地允许列表。如果您喜欢域的DMARC策略,可以将它们添加到该列表中。

我的小型信用合作社有一个可靠的DMARC政策,所以我想把它们添加到允许列表中。根据上面的映射,我创建了 /etc/rspamd/local.d/maps.d/dmarc_whitelist.inc.local ,并在自己的行中列出了他们的域名。

我的商业伙伴糟糕的MTA只使用SPF。我检查WHITELIST_SPF定义,并将其域添加到 dmarc_whitelist.inc.local

超越符号分数

符号分数在 /etc/rspamd/scores.d 中分配。每个符号都在一个组中,每个组都有自己的文件。找到你的符号。如果您的符号不在文件中,请在web界面中搜索该符号。你会看到这个组。检查scores目录中以该组命名的文件,并使用 local.d 条目对其进行自定义。

我经常收到发给许多收件人的垃圾邮件。早些时候,我遇到了 RCPT_COUNT_ONE 符号,这让我想到了符号 RCPT_COUNT_GT_50 ,用于发送给50多个收件人的消息。此符号的值为零。我几乎没有收到超过50个收件人的消息,而且几乎所有这些都是垃圾邮件。我想给它一个2的权重,说这个特征很垃圾。web界面显示此符号位于“headers”组中。检查 /etc/rspamd/score.d 会显示文件 headers_group.conf 中充满了这样的条目,并分配了权重和描述:

RCPT_COUNT_GT_50没有条目,因此我们必须在本地文件中创建一个条目。使用此文本创建 /etc/rspamd/local.d/headers_group.conf

我指定权重为2,并添加一个描述,说明这是一个自定义权重,因为我需要提醒。

重新加载rspamd以使更改生效。

数学与垃圾邮件

垃圾邮件不是数学,但垃圾邮件遵循模式,而模式就是数学。你的火腿也有规律。垃圾邮件发送者会改变他们的模式,试图逃避检测。火腿也在变化,但变化更慢。应用于垃圾邮件检测的第一种分析是贝叶斯统计,但其他类型的统计分析也加入了进来。无论使用什么算法,数学垃圾邮件检测通常都被称为贝叶斯,但rspamd称整个技术类别为统计(statistics)。Rspamd对每条消息运行一系列统计数据,得出该消息是垃圾邮件的概率,然后将这些概率转换为权重。

在使用统计数据之前,您必须分析一堆已知的火腿和已知的垃圾邮件。这个过程通常被称为学习(learning),尽管其中没有实际的思想或教育。Rspamd计算火腿和垃圾邮件的特征和模式,每种火腿和垃圾邮件200件就足够了。

没有统计数据是完美的。它们需要随着模式的变化而不断更新。它们非常有用,统计支持是rspamd核心的一部分,而不是在一个模块中。Rspamd的统计支持从训练系统开始,然后更新教学。

使用 rspamc(1) 分析您的火腿和垃圾邮件。在这里,我转到了我的主邮件目录,每个IMAP文件夹都是一个目录。在Dovecot中,文件夹的 cur 子目录包含已读取的邮件,而 new 则保存未打开的邮件。我并不总是打开垃圾邮件,所以让我们从两者中学习。使用 learn_spam 参数。

使用 rspamcstat 选项检查它是否接受了这些消息。您可以全部阅读,也可以快速获取统计信息:

它处理了我的227条垃圾邮件。然而,它对火腿一无所知。从收件箱和几个选定的文件夹中输入火腿:

这提供的火腿量与我收到的垃圾邮件大致相同。Rspamd立即开始使用该信息。检查我收到的下一条消息的标题显示:

统计分析表明,这条消息有55.2%可能是火腿。这是来自我的网络服务器的自动消息。下一条信息显示出更果断的态度。

随着您在统计训练数据中添加更多垃圾邮件和火腿,rspamd将变得更加准确。但是,您不希望返回命令行来处理单个消息。学习过程应该通过您的电子邮件客户端透明地进行。

持续的垃圾邮件培训

当垃圾邮件进入收件箱或合法邮件落入垃圾邮件文件夹时,请检查符号。也许你需要更重的东西。也许有人打破了他们的DMARC、DKIM或SPF。再多的贝叶斯分析也无法超越伪造的地址和糟糕的SMTP堆栈。

但也许统计分析是错误的,需要纠正。添加更多垃圾邮件不会微调贝叶斯分类器。其中大部分将是它已经看到的东西。只有纠正误报和漏报才能改进模型。当您的收件箱中收到垃圾邮件时,将其保存到垃圾邮件文件夹应该会告诉rspamd从邮件中学习。当合法邮件被错误地归档为垃圾邮件时,将其移动到另一个文件夹应该会触发rspamd将其作为垃圾邮件进行研究。您可以通过将邮件保存在不同的文件夹中来更新rspamd对垃圾邮件的理解。通过Pigeonhole的IMAPsieve和extprograms模块进行安排。

IMAPSieve 和 Extprograms

Sieve是为MTA交付期间使用而设计的,通常被LMTP或LDA所称。IMAP与两者是分开的。Pigeonhole的 IMAPsieve 插件将Sieve添加到IMAP中。我们将添加一条规则,上面写着“学习作为垃圾邮件移动到垃圾邮件文件夹的邮件”,另一条规则是“学习作为火腿从垃圾邮件文件夹中移出的邮件”。

extprograms 扩展允许Sieve脚本调用外部程序。该模块有三个子权限:vnd.dovecot.pipe 、 vnd.dovecot.filter 和 vnd.dovecot.execute 。每个都必须单独启用。

这些扩展默认仅适用于系统管理员编写的脚本。只有您专门配置了访问权限,用户才能使用自己的脚本。历史一再证明,处理任意电子邮件的编写糟糕的shell脚本会造成痛苦,所以我们不会介绍这种配置。

启用 Sieve 模块

我们以前不需要配置IMAP协议本身——我们已经告诉IMAP守护进程要监听哪个端口,但没有告诉协议的内部。为IMAP协议创建一个新的 dovecot.conf 部分,并使用 mail_plugins 选项启用imap_sive。这将启用IMAP协议中的IMAPSieve扩展。

您还必须通知Sieve它将支持IMAPSieve。在 dovecot.conf plugin 部分,在 sievesieve_beforesieve_after 设置旁边执行此操作。还可以使用 sieve_global.extensions 选项启用 sieve_extprograms 模块的 vnd.dovecot.pipe 扩展。

如果你想允许普通用户通过将邮件从一个IMAP文件夹移动到另一个文件夹来执行shell脚本,你可以使用 sieve_extensions ,但通常不建议这样做。

在这里,我告诉dovecot,如果IMAPSieve脚本使用 vnd.doveco.pipe ,它应该在 /etc/dovecot/bin 中查找外部命令。我的系统都定义了存储附加脚本的位置,但我不想让Sieve访问系统范围的 /usr/local/bin/usr/local/scripts 。这个目录当然不应该在 $PATH 中。通过接收或提交任意电子邮件调用的过滤器应该能够访问一组极小的命令。

重新加载Dovecot,使这些模块可用于 sievec(1)

培训脚本

你需要shell脚本来教rspamd识别新的垃圾邮件和火腿,以及Sieve过滤器来将重新格式化的消息引导到这些脚本。让我们从rspamd脚本开始。创建 /etc/dovecot/bin 目录来存储脚本。这是一个垃圾邮件学习脚本 rspamd-learn-spam.sh

它接受标准输入的垃圾邮件,并告诉rspamd学习它。使脚本可执行。通过将垃圾邮件保存到文件并将其提供给脚本来测试它:

您可能会收到一条警告,表示该消息已被学习。那很好;您的脚本名为 rspamc 。一旦成功,创建一个类似的 rspamd-learn-ham.sh

用合法信息进行测试。Rspamd也可能拒绝从该消息中学习,但其输出确认它看到了该消息。

我们需要一个IMAPSieve脚本目录。当大多数Sieve脚本由dovecot编译时,这些脚本将由IMAP用户 vmail 编译。 vmail 用户必须具有写入编译文件的权限。我使用的是 vmail 拥有的 /vhosts/sieve 。我将实际的脚本文件归 root:vmail 所有,因为sieve应该编译它们,而不是更改它们。这是 learn-spam.sieve

此过滤器基于 vnd.dovecot.pipe 扩展、复制功能和imapsieve构建。它接受来自管道的输入,并将该输入发送到脚本 rspamd-learn-spam.sh 。编译过滤器:

如果出现编译错误,dovecot未配置为支持所有模块和扩展。如果编译成功,您可以创建ham学习过滤器。它与垃圾邮件学习过滤器完全相同,只是它调用脚本来学习新的垃圾邮件。

该脚本必须可由 vmail 用户执行。

learn-spam.shlearn-ham.sh 需要是脚本吗?不,您可以直接在配置中插入命令。然而,当事情出错时,我经常需要调试或 logger(1) 语句。这在脚本中更容易做到。

测试持续学习

我们必须验证移动到垃圾邮件文件夹的邮件是否会触发rspamd的分析和学习。Rspamd将学习每种类型的消息一次。许多垃圾邮件非常相似,rspamd无法从中了解更多信息。当用户通过将消息移动到垃圾邮件文件夹来触发学习时,我们需要验证配置是否有效,学习是否发生。我们需要一些垃圾邮件移到垃圾邮件文件夹,一些火腿移出垃圾邮件文件夹。

我们需要将垃圾邮件保存到垃圾邮件文件夹以触发搜索。你已经有一堆垃圾邮件,但它可能在你的垃圾邮件文件夹中。您无法将垃圾邮件从垃圾邮件转移到垃圾邮件中;这不起作用。将所有垃圾邮件移动到另一个名为“sample spam”(示例垃圾邮件)的文件夹中。现在,您可以一次移动这些邮件,查看IMAPSieve脚本是否捕获,rspamc命令是否触发,以及redis数据库是否增长。

现在你的垃圾邮件文件夹是空的,把一些合法邮件复制到其中。我们将用它来纠正错误的火腿。

最后,清除rspamd对您的垃圾邮件的了解。连接到贝叶斯redis实例并用 flushall 擦除它。

验证rspamd是否已忘记 rspamc stat 中的所有内容。统计数据仅每60秒更新一次,因此您可能需要等待它们更新。

统计引擎一无所知,并将从我们发送的任何内容中学习。

现在告诉Dovecot向我们的过滤器发送修改后的消息。

配置 IMAPSieve

IMAPSieve规则位于 dovecot.confplugin 部分,就在筛配置的其余部分旁边。这是我们的第一套规则:

前缀 imapsieve 将此标记为IMAPSieve规则。术语 mailbox1 标记了一条规则。后续规则将被标记为 mailbox2mailbox3 等。以 imapsieve_mailbox1 开头的所有内容都是一组规则。

name 限定符给出了目标文件夹。我们正在查看 spam 文件夹。

IMAP会话具有脚本可以拉入的环境变量。根据标准,IMAPSieve会话必须将 $imap.cause 设置为FLAG、APPEND或COPY之一。我们正在将邮件复制到文件夹中,因此请使用imapsieve_mailbox1_causes 将其设置为 COPY 。IMAPSieve脚本可以从环境中读取此变量以及更多变量。

最后,imapsieve_mailbox1_before 标识了应在任何IMAPSieve用户脚本之前运行的IMAPSieve筛选器。将此指向您的垃圾邮件学习筛过滤器。

“学习失败的火腿是垃圾邮件”的脚本是类似的:

名称限定符是通配符。如果要将邮件保存到任何文件夹,则应用此规则。发件人是一个新的限定符,声明此规则仅适用于从垃圾邮件文件夹中移动邮件的情况。规则的其余部分称为火腿学习过滤器。

你应该做好准备。让我们来测试一下。

使用Rspamd测试IMAPSieve

验证您是否将测试垃圾邮件保存在非垃圾邮件文件夹的位置,以及您的垃圾邮件文件夹是否包含合法电子邮件。删除rspamd的贝叶斯redis,并用 rspamc stat 验证rspamd是否忘记了所有训练。在 dovecot.conf 中启用 mail_debug ,以便显示任何错误。

在一个终端窗口中,在邮件日志上运行 tail -f 。在另一个终端,使用 tail -f 查看rspamd日志。任何错误或活动都会出现在其中一个中。

转到您的邮件客户端。将您的一封非垃圾邮件从垃圾邮件文件夹移动到另一个文件夹。如果Dovecot配置错误,或者你的筛选过滤器有缺陷,或者你学习火腿的shell脚本崩溃,你的邮件日志中会出现错误。如果Dovecot成功地将消息传递给rspamd,rspamd日志将显示有关贝叶斯分类器的条目。如果你等一下, rspamc stat 应该显示它了解了一些火腿。

转到您的训练垃圾邮件文件夹,并将其中一个保存到垃圾邮件文件夹中。看日志。如果rspamd记录了分析,那么您现在就有了纠正训练。如果没有,请阅读错误消息并修复问题。

Rspamd灰名单

默认情况下,Rspamd会采用灰名单机制,但与postscreen略有不同。第8章讨论了灰名单的优缺点。灰名单可能不是邮件运营商之间争论的首要原因,但它肯定排在前五位。你不必参与这些争论,但你确实需要决定你的立场。

如果你不想用灰名单,请在 /etc/rspamd/local.d/greylist.conf 中禁用该模块。

您可以在postscreen和rspamd中都显示灰名单,也可以只显示一个灰名单。这两个程序不共享信息,因此试图向您发送恰好类似垃圾邮件的未知MTA将被postscreen、rspamd延迟一次,最后在第三次尝试时通过。Postscreen的侵入式协议检查比rspamd分析轻得多,但忽略了消息内容。你应该使用哪一种?这完全取决于你收到的垃圾邮件以及你对延误的感受。

如果垃圾邮件得分等于或超过 greylist 操作,Rspamd会自动将邮件灰名单。垃圾邮件分数较低的邮件不会延迟。Rspamd在五分钟内不会接受来自未知MTA的类似垃圾邮件的邮件。如果该MTA在五分钟后再次尝试,rspamd将接受该消息并将主机添加到允许列表中。允许列表条目在一天后过期,迫使发送MTA重新验证其垃圾邮件。

Rspamd根据模块的 ip4_maskip6_mask 设置,基于网络块显示灰色列表。来自Gmail等组织的重新交付尝试将来自不同的地址,但通常在同一网络中,因此rspamd认为来自同一个 /64 IPv6 网络或 /19 IPv4 网络中任何主机的第二次尝试就足够了。

Postscreen灰名单是基于对SMTP协议的遵守。允许列出电子邮件帝国的MTA是有道理的;来自Microsoft的垃圾邮件永远不会触发SMTP协议检查。虽然大型电子邮件网络发送了大量垃圾邮件,但它们也发送了许多合法信息。您想因为一条可疑消息而延迟这些消息吗?也许 吧。这是你的选择。

使用 whitelisted_ip 选项告诉rspamd在哪里可以找到您的允许列表。我们在第8章中为大型提供商创建了一个允许列表,它对rspamd也适用。

您可以使用 timeout 设置控制灰名单模块接受来自网络的邮件的时间,以及使用 expire 设置控制保留这些条目的时间。增加接受消息之前的时间,可以让DNSBL贡献者有时间识别垃圾邮件源并将其添加到他们的提要中。在这里,我将它们分别设置为十分钟和一周:

如果您想善待必须对邮件进行故障排除的MTA操作员,您可以在延迟通知中包含一条有意义的人类可读邮件,而不是默认的“稍后重试”。在邮件中设置自定义文本。report_time 选项告诉rspamd将剩余时间添加到该消息中:

有了这个,你就可以开始提高rspamd的灵敏度了。

Rspamd推出缓慢

我们首先将rspamd设置为仅看守(watch-only)模式,使用高得不可思议的 action 分数。现在它正在计算分数并进行统计分析,你可以调整灵敏度。

首先检查您收到的合法邮件和收到的垃圾邮件的 X-Spamd-Result 标头。点值是否有趋势?有没有一个明显的数字分数,你可以声明“上面的所有东西都是垃圾邮件,下面的所有东西是火腿?”如果有,试试看。如果没有,请做出最好的猜测。偏高的错误。在 /etc/rspamd/local.d/actions.conf 中,将 add_header 设置为该值:

Rspamd将开始在发现可疑的邮件中添加 X-Spam: Yes 标头。

将全局筛选规则添加到垃圾邮件文件夹中包含该标头的文件邮件中。这是一个 /etc/dovecot/sieve/spam.sieve 示例:

告诉Dovecot在使用dovecot.conf条目的任何其他过滤器之前应用该过滤器,如下所示:

等待一两天,看看哪些邮件会进入垃圾邮件文件夹,哪些会进入你的收件箱。如果你的电子邮件地址是全新的,那么你的缓慢起步将非常缓慢。调整 add_header 阈值,直到您对路由到哪里感到满意,并且只需要偶尔重新训练统计引擎。

还要考虑垃圾邮件文件夹中的内容得分。有没有一个分数可以让你放心地说“任何高于此值的东西都是垃圾邮件,甚至不应该到达垃圾邮件文件夹?”将 reject 操作设置为该值。再次,误差偏高。

分数高于 greylist 值但低于 reject 值的消息将被列入灰名单。考虑具有该分数的消息。拖延他们有意义吗?如果是这样,请保持灰色列表。你想要更激进的灰名单吗?调低 greylist 。如果你的地址很忙,你会在几天内确定合适的值。如果没有,别担心。向世界发送一些消息,垃圾邮件发送者很快就会找到你。

一旦你按照自己的意愿调整了rspamd,它基本上会自行运行。您可以探索其他模块来应对您遇到的特定问题,或者随着电子邮件的发展调整设置。升级时,请仔细阅读发行说明。您可能需要更改设置以利用新功能或运行脚本来更新存储的数据。不过,请注意,您发现并启用的每个可选rspamd模块都将与已运行的所有模块进行交互。保持rspamd安装尽可能简单和接近默认值。

现在让我们考虑一下电子邮件的一些边缘。