分类:
2009-12-17 17:59:38
目录[] |
以下介绍内容引自互联网,由于国内的网站对于文章引用太不规范,根本不尊重原作者的辛勤劳动,以至于现在我根本分不清这段文字的原作者是谁。在此仅告知大家,这段文字不是我写的。也希望大家引用文章的时候能够同时注明原作者和出处:
DKIM 技术通过在每封电子邮件上增加加密的数字标志,然后与合法的互联网地址数据库中的记录进行比较。当收到电子邮件后,只有加密信息与数据库中记录匹配的电子邮件,才能够进入用户的收件箱。它还能检查邮件的完整性,避免黑客等未授权者的修改。 DKIM 的基本工作原理同样是基于传统的密钥认证方式,他会产生两组钥匙,公钥(public key)和私钥(private key),公钥将会存放在 DNS 中,而私钥会存放在寄信服务器中。私钥会自动产生,并依附在邮件头中,发送到寄信者的服务器里。公钥则放在DNS服务器上,供自动获得。收信的服务器,将会收到夹带在邮件头中的私钥和在DNS上自己获取公钥,然后进行比对,比较寄信者的域名是否合法,如果不合法,则判定为垃圾邮件。 由于数字签名是无法仿造的,因此这项技术对于垃圾邮件制造者将是一次致命的打击,他们很难再像过去一样,通过盗用发件人姓名、改变附件属性等小伎俩达到目的。在此之前,垃圾邮件制造者通过把文本转换为图像等方式逃避邮件过滤,并且使得一度逐渐下降的垃圾邮件数目再度抬头。
注意:Amavisd-new 只有 2.6.0 及以上版本集成了 DKIM 功能。
先使用 amavisd 生成密钥:
Shell 命令: |
# mkdir /var/lib/dkim/ # amavisd genrsa /var/lib/dkim/a.cn.pem # setfacl -m u:amavis:r-- /var/lib/dkim/a.cn.pem |
注意:
出于安全考虑,密钥应该由 root:root 用户、组所有,其它人都没有权限。由于 Amavisd 以 amavis 用户的身份运行,所以这个密钥只需要让 amavis 用户有只读权限即可。
setfacl/getfacl 属于 'acl' 这个软件包提供的,需要先安装。
在 RHEL/CentOS 5.x 中默认的挂载参数(/etc/fstab 里的 'defaults')已经包含 'acl' 挂载参数。具体参看方法:
Shell 命令: |
# # 查看预设的分区挂载信息 # # cat /etc/fstab |grep ext3 /dev/VolGroup00/LogVol00 / ext3 defaults 1 1 LABEL=/boot /boot ext3 defaults 1 2 # # 查看挂载参数。输出中的 'acl' 参数表示已经支持使用 setfacl/getfacl 设置、查看高级 ACL 权限。 # # tune2fs -l /dev/VolGroup00/LogVol00 | grep options Default mount options: user_xattr acl |
如果文件系统为 tmpfs,或使用普通用户使用 setfacl 进行测试,都将导致命令失败。
配置 Amavisd 以启用 DKIM 功能:
Shell 命令: |
# # Part of file: /etc/amavisd.conf # # # 启用 DKIM 校验和签署的功能。 # $enable_dkim_verification = 1; $enable_dkim_signing = 1; # # 为域名 'a.cn' 启用 DKIM 功能。 # dkim_key("a.cn", 'dkim', "/var/lib/dkim/a.cn.pem"); # 如果您有子域名,建议你为每个子域名都设置一个单独的 DKIM,例如: #dkim_key("host1.a.cn", 'dkim', "/var/lib/dkim/host1.a.cn.pem"); #dkim_key("host2.a.cn", 'dkim', "/var/lib/dkim/host2.a.cn.pem"); # 如果这些子域名的邮件确实都来自 'a.cn' 这个域,也可以设置这些子域名 # 都使用相同的 pem 文件。例如: #dkim_key("host1.a.cn", 'dkim', "/var/lib/dkim/a.cn.pem"); #dkim_key("host2.a.cn", 'dkim', "/var/lib/dkim/a.cn.pem"); # # 设置具体的一些参数。 # # 建议使用 rsa-sha256。 # @dkim_signature_options_bysender_maps = ( { # # For domain: a.cn. # # 'd' defaults to a domain of an author/sender address, # 's' defaults to whatever selector is offered by a matching key 'postmaster@a.cn' => { d => 'a.cn', a => 'rsa-sha256', ttl => 7*24*3600 }, #"spam-reporter@a.cn" => { d => 'a.cn', a => 'rsa-sha256', ttl => 7*24*3600 }, # explicit 'd' forces a third-party signature on foreign (hosted) domains "a.cn" => { d => 'a.cn', a => 'rsa-sha256', ttl => 10*24*3600 }, #"host1.a.cn" => { d => 'host1.a.cn', a => 'rsa-sha256', ttl => 10*24*3600 }, #"host2.a.cn" => { d => 'host2.a.cn', a => 'rsa-sha256', ttl => 10*24*3600 }, # catchall defaults '.' => { a => 'rsa-sha256', c => 'relaxed/simple', ttl => 30*24*3600 }, } ); |
接下来要为 DKIM 设置正确的 DNS 记录,DKIM 所用的 DNS 记录和 SPF 一样,也是 TXT 类型。
先使用 amavisd 查看一下需要设置的 DNS 记录是怎样的:
Shell 命令: |
# amavisd showkeys dkim._domainkey.a.cn. 3600 TXT ( "v=DKIM1; p=" "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYArsr2BKbdhv9efugByf7LhaK" "txFUt0ec5+1dWmcDv0WH0qZLFK711sibNN5LutvnaiuH+w3Kr8Ylbw8gq2j0UBok" "FcMycUvOBd7nsYn/TUrOua3Nns+qKSJBy88IWSh2zHaGbjRYujyWSTjlPELJ0H+5" "EV711qseo/omquskkwIDAQAB") |
在 'p=' 这个标识符后的 4 行都是经过 base64 加密后的公钥(Public key)。你不需要关心公钥放在哪里、如何生成,因为我们可以用 amavisd 来查看公钥。
如果你使用的是 Bind 作为 DNS 服务器,则可以直接添加上面的内容到对应域名的 zone 文件中。例如:
Shell 命令: |
dkim._domainkey.a.cn. 3600 TXT ( "v=DKIM1; p=" "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYArsr2BKbdhv9efugByf7LhaK" "txFUt0ec5+1dWmcDv0WH0qZLFK711sibNN5LutvnaiuH+w3Kr8Ylbw8gq2j0UBok" "FcMycUvOBd7nsYn/TUrOua3Nns+qKSJBy88IWSh2zHaGbjRYujyWSTjlPELJ0H+5" "EV711qseo/omquskkwIDAQAB") |
如果是在 Windows 的 DNS 服务器里添加,或者在大部分的域名提供商提供的 web 管理后台添加,则只需要填一行的 TXT 记录,例如:
Shell 命令: |
v=DKIM1; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYArsr2BKbdhv9efugByf7LhaKtxFUt0ec5+1dWmcDv0WH0qZLFK711sibNN5LutvnaiuH+w3Kr8Ylbw8gq2j0UBokFcMycUvOBd7nsYn/TUrOua3Nns+qKSJBy88IWSh2zHaGbjRYujyWSTjlPELJ0H+5EV711qseo/omquskkwIDAQAB |
这里是 iRedMail.org 域名添加的 SPF/DKIM 记录的截图,希望对大家有所帮助:
设置好 DNS 后别忘了让你的新记录生效。生效之后可以使用以下方法进行验证:
Shell 命令: |
# amavisd testkeys TESTING: dkim._domainkey.a.cn => pass |
如果显示为 'pass' 则表示 DNS 设置正确。
也可以通过发送邮件给 Gmail 账户以检测是否设置正确,在 gmail 里接收到的邮件头里应该有类似的信息:
Shell 命令: |
Authentication-Results: mx.google.com; spf=pass (google.com: domain of test@muniao.net designates 61.152.135.177 as permitted sender) smtp.mail=test@muniao.net; dkim=pass header.i=@muniao.net |
注意,这里有一个 'dkim=pass' 标记,表示你的 DKIM 已经设置正确了。