SPF(发件人策略框架)是一种向邮件服务器标识允许哪些主机为给定域发送电子邮件的系统。设置SPF有助于防止您的电子邮件被归类为垃圾邮件。
DKIM(DomainKeys Identified Mail)是一个系统,可让您的官方邮件服务器向外发电子邮件的标头添加签名,并识别您的域的公钥,以便其他邮件服务器可以验证签名。与SPF一样,DKIM有助于防止您的邮件被视为垃圾邮件。它还允许邮件服务器检测您的邮件何时在传输过程中被篡改。
DMARC(域消息身份验证,报告和一致性)允许您向邮件服务器通告您的域的策略与SPF和/或DKIM验证失败的邮件有关。它还允许您从接收邮件服务器请求有关失败消息的报告。
用于设置SPF,DKIM和DMARC的DNS指令是通用的。在对包工具进行相应的代码调整并确定Unix套接字文件的确切路径之后,将SPF策略代理和OpenDKIM配置为Postfix的说明应适用于任何分发。
注意本指南中所需的步骤需要root权限。请务必以root身份或使用
sudo
前缀运行以下步骤。有关权限的更多信息,请参阅我们的用户和组指南。 警告您必须已经安装,配置和工作Postfix。请参阅Linode Postfix指南以获取帮助。 在没有在Postfix中配置SPF策略代理的情况下发布SPF DNS记录是安全的; 但是,在Postfix中没有OpenDKIM正常工作的情况下发布DKIM DNS记录会导致您的电子邮件被收件人的电子邮件服务器丢弃。
apt-get install opendkim opendkim-tools postfix-policyd-spf-python postfix-pcre
2.将用户添加postfix
到opendkim
组中,以便Postfix可以在需要时访问OpenDKIM的套接字:
adduser postfix opendkim
SPF DNS记录中的值类似于以下示例。完整语法位于SPF记录语法页面。
示例1 允许来自域的MX记录中列出的所有主机的邮件:
v=spf1 mx -all
示例2 允许来自特定主机的邮件:
v=spf1 a:mail.example.com -all
v=spf1
标签是必需的,必须是第一个标签。-all
表示来自您的域的邮件应该只来自SPF字符串中标识的服务器。来自任何其他来源的任何东西都在伪造您的域名。另一种方法是~all
,指示相同的事情,但也指示邮件服务器应接受该消息并将其标记为伪造而不是完全拒绝它。-all
使垃圾邮件发送者更难成功打造您的域名; 这是推荐的设置。~all
由于使用了错误的邮件服务器来发送邮件,因此减少了电子邮件丢失的可能性。~all
如果你不想冒险,可以使用。标识符合条件的服务器之间的标记,从中可以发送到您的域的电子邮件。
mx
是您域中MX记录中列出的所有主机的简写。如果你有一个单独的邮件服务器,mx
可能是最好的选择。如果您有备份邮件服务器(第二个MX记录),使用mx
不会导致任何问题。您的备份邮件服务器将被识别为电子邮件的授权来源,尽管它可能永远不会发送任何邮件。a
标签可以让你通过名称或IP地址来标识一个特定的主机,让你指定哪些主机授权。您可以使用,a
如果您想阻止备份邮件服务器发送外发邮件,或者您想要识别您自己的邮件服务器以外的主机可以从您的域发送邮件(例如,将您的ISP的外发邮件服务器放在列表中,以便当你不得不通过它们发送邮件时,它们会得到认可。现在,我们将坚持使用该mx
版本。对于大多数基本配置,包括处理多个域的配置,它更简单,更正确。要添加记录,请转到DNS管理界面,并为您的域本身添加TXT类型的记录(即空白主机名),其中包含以下字符串:
v=spf1 mx -all
如果您使用的是Linode的DNS管理器,请转到所选域的域区域页面并添加新的TXT记录。一旦填写完毕,屏幕看起来就像这样:
如果您的DNS提供商允许(DNS管理器不允许),您还应该添加SPF类型的记录,以与TXT记录相同的方式填写它。
注意上面的DNS记录的值 - 以及本指南的其余部分 - 以Linode的DNS管理器需要它们的样式完成。如果您使用的是其他提供程序,则相应的系统可能需要不同样式的值。例如,freedns.afraid.org要求以BIND区域文件中找到的样式写入值。因此,上述SPF记录的值需要用双引号括起来:
"v=spf1 mx -all"
。您需要查阅DNS提供商的文档,了解所需的确切样式。
Python SPF策略代理将SPF策略检查添加到Postfix。将检查发件人域的传入邮件的SPF记录,如果存在,则将相应地处理邮件。Perl有自己的版本,但它缺乏Python策略代理的全部功能。
/etc/postfix-policyd-spf-python/policyd-spf.conf
以将更改HELO_reject
和Mail_From_reject
设置更改为False
。此编辑将导致SPF策略代理运行其测试并添加包含结果的消息头,同时不拒绝任何消息。如果要查看检查结果但实际上不将它们应用于邮件处理,您可能还希望进行此更改。否则,只需使用标准设置即可。/etc/postfix/master.cf
并在末尾添加以下条目:
/etc/postfix/master.cf1 2
policyd-spf unix - n n - 0 spawn user=policyd-spf argv=/usr/bin/policyd-spf/etc/postfix/main.cf
并添加此条目以增加Postfix策略代理超时,这将阻止Postfix在事务运行缓慢时中止代理:
/etc/postfix/main.cf中1
policyd-spf_time_limit = 3600smtpd_recipient_restrictions
条目以添加check_policy_service
条目:
/etc/postfix/main.cf中1 2 3 4 5
smtpd_recipient_restrictions = ... reject_unauth_destination, check_policy_service unix:private/policyd-spf, ...确保添加的check_policy_service
条目后的reject_unauth_destination
条目,以避免您的系统成为一个开放的中继。如果reject_unauth_destination
是限制列表中的最后一项,请在其后面添加逗号,并省略check_policy_service
上面项目末尾的逗号。systemctl restart postfix
您可以通过查看SPF结果标头的传入电子邮件的原始标头来检查策略代理的操作。策略代理添加到消息的标头应如下所示:
Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=127.0.0.1; helo=mail.example.com; envelope-from=text@example.com; receiver=tknarr@silverglass.org
此标头表示成功检查发送域的SPF策略。如果您将步骤1中的策略代理设置更改为不拒绝未通过SPF检查的邮件,则可能会在此标头中看到“失败”结果。您不会在传出或本地邮件上看到此标头。
SPF策略代理也会记录到/var/log/mail.log
。在mail.log
文件中,您将从策略代理中看到这样的消息:
Jan 7 06:24:44 arachnae policyd-spf[21065]: None; identity=helo; client-ip=127.0.0.1; helo=mail.example.com; envelope-from=test@example.com; receiver=tknarr@silverglass.org
Jan 7 06:24:44 arachnae policyd-spf[21065]: Pass; identity=mailfrom; client-ip=127.0.0.1; helo=mail.example.com; envelope-from=test@example.com; receiver=tknarr@silverglass.org
第一条消息是HELO命令的检查,在这种情况下,表明没有任何与HELO匹配的SPF信息(完全没问题)。第二条消息是对信封发件人地址的检查,并指示通过检查的地址,并且来自发件人的域所说的应该为该域发送邮件的其中一个外发邮件服务器。冒号后的第一个字段中可能还有其他状态指示失败,临时或永久错误等。
DKIM涉及设置OpenDKIM包,将其挂钩到Postfix,以及添加DNS记录。
/etc/opendkim.conf
需要如下所示:
/etc/opendkim.conf 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38This is a basic configuration that can easily be adapted to suit a standard # installation. For more advanced options, see opendkim.conf(5) and/or # /usr/share/doc/opendkim/examples/opendkim.conf.sample. # Log to syslog Syslog yes # Required to use local socket with MTAs that access the socket as a non- # privileged user (e.g. Postfix) UMask 002 # OpenDKIM user # Remember to add user postfix to group opendkim UserID opendkim # Map domains in From addresses to keys used to sign messages KeyTable /etc/opendkim/key.table SigningTable refile:/etc/opendkim/signing.table # Hosts to ignore when verifying signatures ExternalIgnoreList /etc/opendkim/trusted.hosts InternalHosts /etc/opendkim/trusted.hosts # Commonly-used options; the commented-out versions show the defaults. Canonicalization relaxed/simple Mode sv SubDomains no #ADSPAction continue AutoRestart yes AutoRestartRate 10/1M Background yes DNSTimeout 5 SignatureAlgorithm rsa-sha256 # Always oversign From (sign using actual From and a null From to prevent # malicious signatures header fields (From and/or others) between the signer # and the verifier. From is oversigned by default in the Debian package # because it is often the identity key used by reputation systems and thus # somewhat security sensitive. OversignHeaders From/etc/opendkim.conf
使用上面的内容编辑和替换它的内容,或者下载opendkim.conf的副本,将其上传到您的服务器并将其复制/etc/opendkim.conf
。chmod u=rw,go=r /etc/opendkim.conf
3.创建目录以保存OpenDKIM的数据文件,为opendkim
用户分配所有权,并限制文件权限:
mkdir /etc/opendkim mkdir /etc/opendkim/keys chown -R opendkim:opendkim /etc/opendkim chmod go-rw /etc/opendkim/keys
4.创建签名表/etc/opendkim/signing.table
。它需要为您处理电子邮件的每个域都有一行。每行应如下所示:
/etc/opendkim/signing.table1
*@example.com example替换example.com
为您的域名并example
使用域名的简称。第一个字段是匹配电子邮件地址的模式。第二个字段是密钥表条目的名称,应该用于对来自该地址的邮件进行签名。为简单起见,我们将为域中的所有地址设置一个密钥。
5.创建密钥表/etc/opendkim/key.table
。它需要在签名表中为每个短域名提供一行。每行应如下所示:
/etc/opendkim/key.table1
example example.com:YYYYMM:/etc/opendkim/keys/example.private替换example
为example
您在签名表中用于域的值(确保在末尾捕获第二个匹配项,然后跟随它.private
)。替换example.com
为您的域名,并将其替换为YYYYMM
当前的4位数年份和2位数月份(这称为选择器)。第一个字段连接签名表和密钥表。
第二个字段分为3个以冒号分隔的部分。
- 第一部分是使用密钥的域名。
- 第二部分是在DNS中查找关键记录时使用的选择器。
- 第三部分命名包含域签名密钥的文件。
注意DKIM查找的流程从发件人的地址开始。扫描签名表,直到找到其模式(第一项)与地址匹配的条目。然后,第二个项的值用于定位将使用其密钥信息的密钥表中的条目。对于传入邮件,域和选择器然后用于在DNS中查找公钥TXT记录,并且该公钥用于验证签名。对于外发邮件,将从指定文件中读取私钥,并用于在邮件上生成签名。
6.创建可信主机文件/etc/opendkim/trusted.hosts
。其内容需要是:
/etc/opendkim/trusted.hosts1 2 3 4 5 6
127.0.0.1 ::1 localhost myhostname myhostname.example.com example.com创建文件时,请更改myhostname
为服务器名称并替换example.com
为您自己的域名。我们正在识别用户将通过邮件提交的主机,并且应该签署外发邮件,基本配置将是您自己的邮件服务器。
7.通过运行以下命令,确保所有权和权限/etc/opendkim
及其内容正确(opendkim
应该拥有所有内容,keys
目录应该只能由所有者访问):
chown -R opendkim:opendkim /etc/opendkim chmod -R go-rwx /etc/opendkim/keys
8.为每个域生成密钥:
opendkim-genkey -b 2048 -h rsa-sha256 -r -s YYYYMM -d example.com -v
替换YYYYMM
为密钥表中的当前年份和月份。这将为您提供两个文件,YYYYMM.private
其中包含密钥并YYYYMM.txt
包含您设置DNS所需的TXT记录。重命名文件,使它们的名称与域的密钥表的第二个字段的第三个部分相匹配:
mv YYYYMM.private example.private mv YYYYMM.txt example.txt
对于密钥表中的每个条目,在此步骤中重复这些命令。它-b 2048
指示用于签名和验证的RSA密钥对中的位数。1024位是最小的,但使用现代硬件2048位更安全。(在某些时候可能需要4096位。)
9. 通过运行以下命令,确保所有权,权限和内容正确无误:
cd /etc chown -R opendkim:opendkim /etc/opendkim chmod -R go-rw /etc/opendkim/keys
10.检查OpenDKIM是否正确启动:
systemctl restart opendkim
您不应该收到错误消息,但如果您这样做,请使用:
systemctl status -l opendkim
获取状态和未截断的错误消息。
与SPF一样,DKIM使用TXT记录来保存有关每个域的签名密钥的信息。如上所述使用YYYYMM,您需要为YYYYMM._domainkey
您处理邮件的每个域为主机创建TXT记录。它的值可以example.txt
在域的文件中找到。这些文件看起来像这样:
example.txt文件
1 2 3 | 201510._domainkey IN TXT ( "**v=DKIM1; h=rsa-sha256; k=rsa; s=email; " "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu5oIUrFDWZK7F4thFxpZa2or6jBEX3cSL6b2TJdPkO5iNn9vHNXhNX31nOefN8FksX94YbLJ8NHcFPbaZTW8R2HthYxRaCyqodxlLHibg8aHdfa+bxKeiI/xABRuAM0WG0JEDSyakMFqIO40ghj/h7DUc/4OXNdeQhrKDTlgf2bd+FjpJ3bNAFcMYa3Oeju33b2Tp+PdtqIwXR" "ZksfuXh7m30kuyavp3Uaso145DRBaJZA55lNxmHWMgMjO+YjNeuR6j4oQqyGwzPaVcSdOG8Js2mXt+J3Hr+nNmJGxZUUW4Uw5ws08wT9opRgSpn+ThX2d1AgQePpGrWOamC3PdcwIDAQAB**" ) ; ----- DKIM key 201510 for example.com |
---|
括号内的值是您想要的。选择并复制整个区域(但不包括)v=DKIM1
双引号,然后在结束括号前的最终双引号之前(但不包括)。然后编辑复制文本中的双引号和它们之间的空格。也h=rsa-sha256
改为h=sha256
。从上面的文件中得到的结果是:
例如-copied.txt
1 | v=DKIM1; h=sha256; k=rsa; s=email; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu5oIUrFDWZK7F4thFxpZa2or6jBEX3cSL6b2TJdPkO5iNn9vHNXhNX31nOefN8FksX94YbLJ8NHcFPbaZTW8R2HthYxRaCyqodxlLHibg8aHdfa+bxKeiI/xABRuAM0WG0JEDSyakMFqIO40ghj/h7DUc/4OXNdeQhrKDTlgf2bd+FjpJ3bNAFcMYa3Oeju33b2Tp+PdtqIwXRZksfuXh7m30kuyavp3Uaso145DRBaJZA55lNxmHWMgMjO+YjNeuR6j4oQqyGwzPaVcSdOG8Js2mXt+J3Hr+nNmJGxZUUW4Uw5ws08wT9opRgSpn+ThX2d1AgQePpGrWOamC3PdcwIDAQAB |
---|
将其粘贴到TXT记录的值中。
如果你正在使用Linode的DNS管理器,那么当你填写它时,这就是添加TXT记录屏幕的样子:
使用该.txt
域的文件对您处理邮件的每个域重复此操作。
使用以下opendkim-testkey
命令测试密钥以进行正确的签名和验证:
opendkim-testkey -d example.com -s YYYYMM
如果一切正常,你不应该得到任何输出。如果要查看更多信息,请添加-vvv
到命令的末尾。这会产生详细的调试输出。最后一条消息应该是“key OK”。就在此之前,您可能会看到“密钥不安全”消息。这是正常的,并不表示错误,它只是意味着您的域尚未设置为DNSSEC。
mkdir /var/spool/postfix/opendkim chown opendkim:postfix /var/spool/postfix/opendkim
2. 在OpenDKIM默认文件中为Postfix设置正确的套接字/etc/default/opendkim
:
在/ etc /默认/ opendkim 1 2 3 4 5 6 7 8 9 10Command-line options specified here will override the contents of # /etc/opendkim.conf. See opendkim(8) for a complete list of options. #DAEMON_OPTS="" # # Uncomment to specify an alternate socket # Note that setting this will override any Socket value in opendkim.conf SOCKET="local:/var/spool/postfix/opendkim/opendkim.sock" #SOCKET="inet:54321" # listen on all interfaces on port 54321 #SOCKET="inet:12345@localhost" # listen on loopback on port 12345 #SOCKET="inet:12345@192.0.2.1" # listen on 192.0.2.1 on port 12345
取消注释第一个SOCKET行并对其进行编辑,使其与上述文件中的未注释行匹配。套接字的路径与默认路径不同,因为在Debian 8上,处理邮件的Postfix进程在chroot jail中运行并且无法访问正常位置。
3.编辑/etc/postfix/main.cf
并添加一个部分以通过OpenDKIM守护程序激活电子邮件处理:
/etc/postfix/main.cf中1 2 3 4 5 6 7
#Milter configuration # OpenDKIM milter_default_action = accept # Postfix ≥ 2.6 milter_protocol = 6, Postfix ≤ 2.5 milter_protocol = 2 milter_protocol = 6 smtpd_milters = local:/opendkim/opendkim.sock non_smtpd_milters = local:/opendkim/opendkim.sock
你可以把它放在文件的任何地方。通常的做法是在smtpd_recipient_restrictions
入境后提出。您会注意到套接字的路径与文件中的路径不同/etc/defaults/opendkim
。这是因为Postfix的chroot jail,这里的路径是文件系统的受限视图内的路径,而不是实际的文件系统。
4.重新启动OpenDKIM守护程序,以便为Postfix设置正确的套接字:
systemctl restart opendkim
5.重新启动Postfix,以便在处理邮件时开始使用OpenDKIM:
systemctl restart postfix
验证一切正常的最简单方法是check-auth@verifier.port25.com
使用配置为将邮件提交到邮件服务器上的提交端口的电子邮件客户端发送测试电子邮件。它将分析您的消息并向您发送一份报告,指出您的电子邮件是否已正确签名。它还报告了许多其他内容,例如您的域的SPF配置和SpamAssassin标记。如果出现问题,它会报告问题所在。
作为最终项目,您可以向您的域添加ADSP策略,说明您域中的所有电子邮件都应该是DKIM签名的。像往常一样,它是通过_adsp._domainkey
您域中主机的TXT记录完成的,其值为dkim=all
。如果您使用的是Linode的DNS管理器,则新文本记录的屏幕将如下所示:
您无需进行此设置,但这样做会使任何人更难从您的域中伪造电子邮件,因为收件人邮件服务器将看到缺少DKIM签名并拒绝该邮件。
可以添加DMARC DNS记录,以便向邮件服务器建议您认为应该使用声称来自您的域的未通过SPF和/或DKIM验证的电子邮件。DMARC还允许您请求有关未通过一次或多次验证检查的邮件的报告。只有在SPF和DKIM设置并成功运行的情况下才应设置DMARC。如果您添加DMARC DNS记录而不同时使用SPF和DKIM,则来自您的域的邮件将无法通过验证,这可能导致它们被丢弃或降级为垃圾邮件文件夹。
DMARC记录是_dmarc
您域中主机的TXT记录,包含以下建议值:
v=DMARC1;p=quarantine;sp=quarantine;adkim=r;aspf=r
这要求邮件服务器隔离(不丢弃,但与常规邮件分开)任何未通过SPF或DKIM检查的电子邮件。不要求报告。很少有邮件服务器实现该软件来生成失败消息的报告,因此通常不需要请求它们。如果您确实希望请求报告,则该值与此示例类似,添加为单个字符串:
v=DMARC1;p=quarantine;sp=quarantine;adkim=r;aspf=r;fo=1;rf=afrf;rua=mailto:user@example.com
更换user@example.com
的mailto:
网址与自己的电子邮件,或者你自己的专用接收报告(地址,如电子邮件地址dmarc@example.com
)。这会以XML格式请求聚合报告,显示传递和失败结果的每个组合以及发送它们的邮件服务器地址的消息数量。如果您使用的是Linode的DNS管理器,则新文本记录的屏幕将如下所示:
DMARC记录有许多可用的标签和选项。这些标记用于控制您的身份验证设置:
v
在这种情况下,指定协议版本DMARC1
。p
确定根域的策略,例如“example.com”。可用选项:quarantine
指示如果电子邮件验证失败,收件人应将其放在一边进行处理。reject
请求接收邮件服务器拒绝验证失败的电子邮件。none
如果电子邮件未通过验证,则请求接收方不采取任何措施。sp
确定子域的策略,例如“subdomain.example.com”。它采用与p
标记相同的参数。adkim
指定DKIM的对齐模式,它确定DKIM记录的验证严格程度。可用选项包括:r
轻松对齐模式,DKIM身份验证不太严格执行。s
严格的对齐模式。只有与根域的DKIM条目完全匹配才会被视为已验证。aspf
确定SPF验证的对齐模式。它采用相同的论点adkim
。如果您希望收到身份验证失败报告,DMARC会提供许多配置选项。您可以使用以下标记自定义报告的格式以及报告创建的条件。
rua
指定将接收汇总报告的电子邮件地址。这使用mailto:user@example.com
语法,并接受以逗号分隔的多个地址。汇总报告通常每天生成一次。ruf
指定将接收详细身份验证失败报告的电子邮件地址。这与...相同rua
。使用此选项,每次身份验证失败都会生成单独的报告。fo
允许您指定将报告哪些失败的身份验证方法。可以使用以下一个或多个选项:0
如果所有身份验证方法都失败,将请求报告。例如,如果SPF检查失败但DKIM身份验证成功,则不会发送报告。1
如果任何身份验证检查失败,请求报告。d
如果DKIM检查失败,则请求报告。s
如果SPF检查失败,则请求报告。rf
确定用于身份验证失败报告的格式。可用选项:YYYYMM格式用于选择器的原因是最佳实践要求每隔一段时间更改DKIM签名密钥(建议每月一次,不超过每6个月一次)。要在不中断传输中的邮件的情况下执行此操作,请使用新选择器生成新密钥。过程是:
/etc/opendkim/keys
。使用当前年份和月份作为YYYYMM选择器值,因此它与当前使用的选择器不同。.txt
文件将新密钥添加到DNS,如在DKIM 设置DNS部分中,使用主机名中的新YYYYMM选择器。请勿删除或更改现有的DKIM TXT记录。完成此操作后,使用以下命令验证新密钥数据(将example.com,example和YYYYMM替换为适当的值):opendkim-testkey -d example.com -s YYYYMM -k example.private
-vvv
如果需要它来诊断任何问题,请添加开关以获取调试输出。在继续之前纠正任何问题,当opendkim-testkey
没有表明验证成功时将开始使用新的私钥文件和选择器将导致您的电子邮件出现问题,包括未收到邮件。
3.停止Postfix和OpenDKIM,systemctl stop postfix opendkim
以便在更换密钥时不会处理邮件。
4.将新生成的.private
文件复制到位,并通过从生成密钥文件的目录中运行这些命令,确保其所有权和权限正确:
cp *.private /etc/opendkim/keys/ chown opendkim:opendkim /etc/opendkim/keys/* chmod go-rw /etc/opendkim/keys/*
使用上述opendkim-testkey
命令确保在继续之前传播新记录。
5.编辑/etc/opendkim/key.table
旧YYYYMM值并将其更改为新选择器,以反映当前年份和月份。保存文件。
6.通过以下方式重新启动OpenDKIM和Postfix:
systemctl start opendkim systemctl start postfix
确保它们都没有任何错误地启动。
7.几周后,所有传输中的电子邮件都应该已经发送或退回,并且不再需要DNS中的旧DKIM密钥信息。删除YYYYMM._domainkey
每个域中的旧TXT记录,只留下最新的(最近一年和一个月)。如果您忘记并将旧钥匙放在比预定时间更长的时间,请不要担心。没有安全问题。删除过时的记录更多的是保持整洁和整洁。
有关此主题的其他信息,您可能需要参考以下资源。虽然提供这些是希望它们有用,但请注意,我们无法保证外部托管材料的准确性或及时性。