myfreax

安装并集成Rspamd邮件过滤器

Rspamd是目前最先进的垃圾邮件过滤系统,允许通过许多规则评估邮件,包括正则表达式,统计分析和自定义服务(如URL黑名单)。 每封邮件都由Rspamd分析并给出垃圾邮件分数,在本教程中,我们将完成Rspamd垃圾邮件过滤系统的安装和配置,并将其集成到我们的邮件服务器中,创建DKIM和DMARC DNS记录

10 min read
By myfreax
安装并集成Rspamd邮件过滤器

Rspamd是目前最先进的垃圾邮件过滤系统,允许通过许多规则评估邮件,包括正则表达式,统计分析和自定义服务(如URL黑名单)。 每封邮件都由Rspamd分析并给出垃圾邮件分数

根据邮件的分数和用户的设置,Rspamd将MTA的操作应用于邮件,例如,传递,拒绝或添加标头。 Rspamd可以同时处理数百条消息,并提供许多有用的功能

在本教程中,我们将完成Rspamd垃圾邮件过滤系统的安装和配置,并将其集成到我们的邮件服务器中,创建DKIM和DMARC DNS记录。

您可能会问我们为什么选择使用Rspamd而不使用Spamassassin。Rspamd是C语言来编写,有更好的性能,社区维护也非常活跃,它比用Perl编写的Spamassassin快得多。另一个原因是Rspamd带有DKIM签名模块,因此我们不必使用其他软件来签署我们的外发电子邮件。

如果您不熟悉Rspamd,可以在此处查看其官方文档

前提条件

在继续本教程之前,请确保以具有sudo权限用户身份登录。

安装Redis

Redis将被Rspamd用作存储和缓存系统,安装它只需运行:

sudo apt install redis-server

安装Unbound

Unbound是一个非常安全的DNS解析器,它可以缓存DNS解释的结果

安装此服务的主要目的是减少外部DNS请求的数量。此步骤是可选的,可以跳过。

sudo apt updatesudo apt install unbound

对于大多数服务器,默认的Unbound设置应该足够

要将Unbound设置为服务器主DNS解析程序,请运行以下命令:

sudo echo "nameserver 127.0.0.1" >> /etc/resolvconf/resolv.conf.d/headsudo resolvconf -u

如果您不使用,resolvconf则需要/etc/resolv.conf手动编辑该文件

安装Rspamd

我们将从其官方存储库安装最新的稳定版Rspamd

首先安装必要的包:

sudo apt install software-properties-common lsb-releasesudo apt install lsb-release wget

使用以下wget命令将存储库GPG密钥添加到apt源密钥环:

wget -O- https://rspamd.com/apt-stable/gpg.key | sudo apt-key add -

通过运行以下命令启用Rspamd存储库:

echo "deb http://rspamd.com/apt-stable/ $(lsb_release -cs) main" | sudo tee -a /etc/apt/sources.list.d/rspamd.list

启用存储库后,请更新程序包索引并使用以下命令安装Rspamd:

sudo apt updatesudo apt install rspamd

配置Rspamd

我们将在/etc/rspamd/local.d/local.d/目录中创建新文件,而不是修改库存配置文件,这将覆盖默认设置。

默认情况下,Rspamd normal worker是扫描电子邮件的工作程序侦听端口11333上的所有接口(即0.0.0.0:11333)。创建以下文件以将Rspamd普通工作程序配置为仅侦听localhost接口:

/etc/rspamd/local.d/worker-normal.inc

bind_socket = "127.0.0.1:11333";

proxy worker 侦听端口11332以支持milter协议。为了让Postfix与Rspamd通信,我们需要启用milter模式:

/etc/rspamd/local.d/worker-proxy.inc

bind_socket = "127.0.0.1:11332";
milter = yes;
timeout = 120s;
upstream "local" {
  default = yes;
  self_scan = yes;
}

接下来,我们需要为controller worker服务器设置一个密码,以便访问Rspamd Web界面。要生成加密密码,请运行:

rspamadm pw --encrypt -p P4ssvv0rD

输出应该如下所示:

$2$khz7u8nxgggsfay3qta7ousbnmi1skew$zdat4nsm7nd3ctmiigx9kjyo837hcjodn1bob5jaxt7xpkieoctb

不要忘记将密码(P4ssvv0rD)更改为更安全的密码

从终端复制密码并将其粘贴到配置文件中:

/etc/rspamd/local.d/worker-controller.inc

password = "$2$khz7u8nxgggsfay3qta7ousbnmi1skew$zdat4nsm7nd3ctmiigx9kjyo837hcjodn1bob5jaxt7xpkieoctb";

稍后我们将Nginx配置controller worker Web服务器的反向代理,以便我们可以访问Rspamd Web界面

通过在classifier-bayes.conf文件中添加以下行,将Redis设置为Rspamd统计信息的后端服务:

/etc/rspamd/local.d/classifier-bayes.conf

servers = "127.0.0.1";
backend = "redis";

打开milter_headers.conf文件并设置milter header:

/etc/rspamd/local.d/milter_headers.conf

use = ["x-spamd-bar", "x-spam-level", "authentication-results"];

您可以在此处找到有关milter header的更多信息。

最后重启Rspamd服务以使更改生效:

sudo systemctl restart rspamd

配置Nginx

第一部分中,我们为PostfixAdmin实例创建了一个Nginx的虚拟服务器。

打开Nginx配置文件并添加以下位置指令

/etc/nginx/sites-enabled/mail.myfreax.com.conf

...
location /rspamd {
    proxy_pass http://127.0.0.1:11334/;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
...

重新加载Nginx服务以使更改生效:

sudo systemctl reload nginx

转到https://mail.myfreax.com/rspamd/,输入您之前使用rspamadm pw命令生成的密码,您将看到Rspamd Web界面

配置Postfix

我们需要配置Postfix才能使用Rspamd milter

运行以下命令以更新Postfix主配置文件:

sudo postconf -e "milter_protocol = 6"sudo postconf -e "milter_mail_macros = i {mail_addr} {client_addr} {client_name} {auth_authen}"sudo postconf -e "milter_default_action = accept"sudo postconf -e "smtpd_milters = inet:127.0.0.1:11332"sudo postconf -e "non_smtpd_milters = inet:127.0.0.1:11332"

重新启动Postfix服务以使更改生效:

sudo systemctl restart postfix

配置Dovecot

在上一篇文章中安装并配置了Dovecot ,现在我们将安装sieve过滤模块并将Dovecot与Rspamd集成。

首先安装Dovecot过滤模块:

sudo apt install dovecot-sieve dovecot-managesieved

安装软件包后,打开以下文件并编辑

/etc/dovecot/conf.d/20-lmtp.conf

...
protocol lmtp {
  postmaster_address = postmaster@myfreax.com
  mail_plugins = $mail_plugins sieve
}
...

/etc/dovecot/conf.d/20-imap.conf

...
protocol imap {
  ...
  mail_plugins = $mail_plugins imap_quota imap_sieve
  ...
}
...

/etc/dovecot/conf.d/20-managesieve.conf

...
service managesieve-login {
  inet_listener sieve {
    port = 4190
  }
  ...
}
...
service managesieve {
  process_limit = 1024
}
...

/etc/dovecot/conf.d/90-sieve.conf

plugin {
    ...
    # sieve = file:~/sieve;active=~/.dovecot.sieve
    sieve_plugins = sieve_imapsieve sieve_extprograms
    sieve_before = /var/mail/vmail/sieve/global/spam-global.sieve
    sieve = file:/var/mail/vmail/sieve/%d/%n/scripts;active=/var/mail/vmail/sieve/%d/%n/active-script.sieve

    imapsieve_mailbox1_name = Spam
    imapsieve_mailbox1_causes = COPY
    imapsieve_mailbox1_before = file:/var/mail/vmail/sieve/global/report-spam.sieve

    imapsieve_mailbox2_name = *
    imapsieve_mailbox2_from = Spam
    imapsieve_mailbox2_causes = COPY
    imapsieve_mailbox2_before = file:/var/mail/vmail/sieve/global/report-ham.sieve

    sieve_pipe_bin_dir = /usr/bin
    sieve_global_extensions = +vnd.dovecot.pipe
    ....
}

保存并关闭文件。

为筛选脚本创建目录:

mkdir -p /var/mail/vmail/sieve/global

创建全局筛选筛选器以将标记为垃圾邮件的电子邮件移动到Spam目录:

/var/mail/vmail/sieve/global/spam-global.sieve

require ["fileinto","mailbox"];

if anyof(
    header :contains ["X-Spam-Flag"] "YES",
    header :contains ["X-Spam"] "Yes",
    header :contains ["Subject"] "*** SPAM ***"
    )
{
    fileinto :create "Spam";
    stop;
}

每当您将电子邮件移入或移出Spam目录时,都会触发以下两个筛选脚本:

/var/mail/vmail/sieve/global/report-spam.sieve

require ["vnd.dovecot.pipe", "copy", "imapsieve"];
pipe :copy "rspamc" ["learn_spam"];

/var/mail/vmail/sieve/global/report-ham.sieve

require ["vnd.dovecot.pipe", "copy", "imapsieve"];
pipe :copy "rspamc" ["learn_ham"];

重新启动Dovecot服务以使更改生效:

sudo systemctl restart dovecot

编译筛选脚本并设置正确的权限:

sievec /var/mail/vmail/sieve/global/spam-global.sievesievec /var/mail/vmail/sieve/global/report-spam.sievesievec /var/mail/vmail/sieve/global/report-ham.sievesudo chown -R vmail: /var/mail/vmail/sieve/

创建DKIM密钥

DomainKeys Identified Mail(DKIM)是一种电子邮件身份验证方法,用于向出站邮件头添加加密签名。它允许接收方验证声称来自特定域的电子邮件确实是由该域的所有者授权的。这样做的主要目的是防止伪造的电子邮件。

我们可以为所有域提供不同的DKIM密钥,甚至可以为单个域提供多个密钥,但为了简化本文,我们将使用单个DKIM密钥,以后可以用于所有新域。

创建一个新目录以存储DKIM密钥并使用rspamadm程序生成新的DKIM密钥对:

sudo mkdir /var/lib/rspamd/dkim/rspamadm dkim_keygen -b 2048 -s mail -k /var/lib/rspamd/dkim/mail.key | sudo tee -a  /var/lib/rspamd/dkim/mail.pub

在上面的示例中,我们使用mailDKIM选择器

您现在应该在/var/lib/rspamd/dkim/目录中有两个新文件,mail.key即我们的私钥文件和mail.pub包含DKIM公钥的文件。我们稍后会更新我们的DNS区域记录

设置正确的所有权和权限:

sudo chown -R _rspamd: /var/lib/rspamd/dkimsudo chmod 440 /var/lib/rspamd/dkim/*

现在我们需要告诉Rspamd在哪里查找DKIM密钥,选择器的名称和最后一行将启用DKIM签名别名发件人地址。为此,请创建一个包含以下内容的新文件:

/etc/rspamd/local.d/dkim_signing.conf

selector = "mail";
path = "/var/lib/rspamd/dkim/$selector.key";
allow_username_mismatch = true;

Rspamd还支持签名认证接收链(ARC)签名。您可以在此处找到有关ARC规范的更多信息

Rspamd正在使用DKIM模块处理ARC签名,因此我们可以简单地复制以前的配置:

sudo cp /etc/rspamd/local.d/dkim_signing.conf /etc/rspamd/local.d/arc.conf

重新启动Rspamd服务以使更改生效:

sudo systemctl restart rspamd

DNS设置

我们已经创建了一个DKIM密钥对,现在我们需要更新我们的DNS域。DKIM公钥存储在mail.pub文件中。该文件的内容应如下所示:

cat /var/lib/rspamd/dkim/mail.pub
mail._domainkey IN TXT ( "v=DKIM1; k=rsa; "
	"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqdBRCqYzshc4LmmkxUkCH/rcIpSe/QdNIVmBrgqZmZ5zzWQi7ShdFOH7V32/VM1VRk2pkjDV7tmfbwslsymsfxgGhVHbU0R3803uRfxAiT2mYu1hCc9351YpZF4WnrdoA3BT5juS3YUo5LsDxvZCxISnep8VqVSAZOmt8wFsZKBXiIjWuoI6XnWrzsAfoaeGaVuUZBmi4ZTg0O4yl"
	"nVlIz11McdZTRe1FlONOzO7ZkQFb7O6ogFepWLsM9tYJ38TFPteqyO3XBjxHzp1AT0UvsPcauDoeHUXgqbxU7udG1t05f6ab5h/Kih+jisgHHF4ZFK3qRtawhWlA9DtS35DlwIDAQAB"
) ;

如果您运行自己的绑定DNS服务器,则只需将记录直接复制并粘贴到域区域文件中即可。如果您使用的是DNS Web界面,则需要创建一个新的TXT记录mail._domainkey作为名称,而对于需要删除引号的值/内容,将所有三行连接在一起。在我们的例子中,TXT记录的值/内容应如下所示:

v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqdBRCqYzshc4LmmkxUkCH/rcIpSe/QdNIVmBrgqZmZ5zzWQi7ShdFOH7V32/VM1VRk2pkjDV7tmfbwslsymsfxgGhVHbU0R3803uRfxAiT2mYu1hCc9351YpZF4WnrdoA3BT5juS3YUo5LsDxvZCxISnep8VqVSAZOmt8wFsZKBXiIjWuoI6XnWrzsAfoaeGaVuUZBmi4ZTg0O4ylnVlIz11McdZTRe1FlONOzO7ZkQFb7O6ogFepWLsM9tYJ38TFPteqyO3XBjxHzp1AT0UvsPcauDoeHUXgqbxU7udG1t05f6ab5h/Kih+jisgHHF4ZFK3qRtawhWlA9DtS35DlwIDAQAB

我们还将创建基于域的消息身份验证(DMARC),旨在告知接收服务器是否接受来自特定发件人的电子邮件。基本上它会保护您的域免受域欺骗并提高您的域名声誉

如果您从一开始就按照系列进行操作,那么您应该已经拥有了SFP域名记录。要设置DMARC记录,发送域需要发布SPF和DKIM记录。DMARC策略作为TXT记录发布,并定义接收方在验证失败时如何处理来自您的域的邮件

在本文中,我们将实现以下DMARC策略:

_dmarc  IN  TXT  "v=DMARC1; p=none; adkim=r; aspf=r;"

让我们分解上面的DMARC记录:

  • v=DMARC1 - 这是DMARC标识符
  • p=none - 这告诉接收器如何处理DMARC失败的消息。在我们的例子中,它被设置为none,这意味着如果消息未通过DMARC,则不采取任何操作。你也可以使用'拒绝'或quarantine
  • adkim=raspf=r- DKIMSPF对齐,r对于轻松和s严格,在我们的例子中,我们使用轻松对齐DKIM和SPF

如果您运行自己的绑定DNS服务器,您只需要将记录复制并粘贴到域区域文件中,如果您使用其他DNS提供程序,则需要创建_dmarc一个名称和v=DMARC1; p=none; adkim=r; aspf=r;值的TXT记录/内容。

DNS更改可能需要一段时间才能传播。您可以使用dig命令检查记录是否已传播:

dig mail._domainkey.myfreax.com TXT +short
"v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqdBRCqYzshc4LmmkxUkCH/rcIpSe/QdNIVmBrgqZmZ5zzWQi7ShdFOH7V32/VM1VRk2pkjDV7tmfbwslsymsfxgGhVHbU0R3803uRfxAiT2mYu1hCc9351YpZF4WnrdoA3BT5juS3YUo5LsDxvZCxISnep8VqVSAZOmt8wFsZKBXiIjWuoI6XnWrzsAfoaeGa" "VuUZBmi4ZTg0O4ylnVlIz11McdZTRe1FlONOzO7ZkQFb7O6ogFdepWLsM9tYJ38TFPteqyO3XBjxHzp1AT0UvsPcauDoeHUXgqbxU7udG1t05f6ab5h/Kih+jisgHHF4ZFK3qRtawhWlA9DtS35DlwIDAQAB"
dig _dmarc.myfreax.com TXT +short
"v=DMARC1; p=none; adkim=r; aspf=r;"

您还可以在此处检查域当前的DMARC策略或创建自己的DMARC策略

至此,你已完成Rspamd的配置并集成到之前配置邮件服务中。