安装和集成Rspamd

这是我们设置和配置邮件服务器的第三部分。在本教程中,我们将介绍Rspamd垃圾邮件过滤系统的安装和配置,并将其集成到我们的邮件服务器中,创建DKIM和DMARC DNS记录。您可能会问,为什么我们选择使用Rspamd而不选择Spamassassin。 Rspamd被更积极地维护和用C编写,并且比用Perl编写的Spamassassin快得多。另一个原因是Rspamd带有DKIM签名模块,因此我们不必使用其他软件来签名我们的外发电子邮件。

10 min read
By myfreax
安装和集成Rspamd

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

您可能会问,为什么我们选择使用Rspamd而不选择Spamassassin。 Rspamd被更积极地维护和用C编写,并且比用Perl编写的Spamassassin快得多。另一个原因是Rspamd带有DKIM签名模块,因此我们不必使用其他软件来签名我们的外发电子邮件。

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

先决条件

在继续学习本教程之前,请确保您以个具有sudo特权的用户身份登录。

安装Redis

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

sudo apt install redis-server

安装未绑定

Unbound是一种非常安全的验证,递归和缓存DNS解析器。

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

sudo apt update
sudo apt install unbound

默认的“未绑定”设置对于大多数服务器来说应该足够。

要将未绑定设置为服务器主DNS解析器,请运行以下命令:

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

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

安装Rspamd

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

首先安装必要的软件包:

sudo apt install software-properties-common lsb-release
sudo 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 update
sudo apt install rspamd

配置Rspamd

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

默认情况下,Rspamd的normal worker扫描电子邮件的工作程序会侦听端口11333上的所有接口。创建以下文件以将Rspamd普通工作程序配置为仅侦听本地主机接口:

/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 作为控制器工作人员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标头:

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

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

您可以在此处

中找到有关斜切表头的更多信息。

最后,重新启动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配置为使用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,现在我们将安装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.sieve
sievec /var/mail/vmail/sieve/global/report-spam.sieve
sievec /var/mail/vmail/sieve/global/report-ham.sieve
sudo chown -R vmail: /var/mail/vmail/sieve/

创建DKIM密钥

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

我们可以为所有域使用不同的DKIM密钥,甚至可以为单个域使用多个密钥,但是为了简单起见,我们将使用单个DKIM密钥,以后可以将其用于所有新域。

使用rspamadm实用工具创建一个新目录来存储DKIM密钥并生成一个新的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

在上面的示例中,我们使用mail作为DKIM选择器。

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

设置正确的所有权权限

sudo chown -R _rspamd: /var/lib/rspamd/dkim
sudo 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界面,则需要使用mail._domainkey作为名称来创建新的TXT记录,而对于值/内容,则需要删除所有三行连接在一起的引号。在我们的情况下,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,则不采取任何措施。您还可以使用'reject'或quarantine
  • adkim=raspf=r-DKIMSPF对齐方式,r表示放宽,s表示严格,正在针对DKIM和SPF使用放松对齐。

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

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策略。

结论

仅此部分教程。在本系列的下一部分中,我们将继续进行RoundCube安装和配置

此文章是 设置和配置邮件服务器 系列的一部分。
该系列的其他信息:  

使用PostfixAdmin设置邮件服务器

安装和配置Postfix和Dovecot

•安装和集成Rspamd

安装和配置Roundcube网络邮件