Chinaunix首页 | 论坛 | 博客
  • 博客访问: 585858
  • 博文数量: 129
  • 博客积分: 6240
  • 博客等级: 准将
  • 技术积分: 1765
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-18 15:42
文章分类

全部博文(129)

文章存档

2015年(1)

2012年(3)

2011年(6)

2010年(14)

2009年(105)

我的朋友

分类:

2009-12-17 17:59:38


目录

[]

DKIM

Introduction

以下介绍内容引自互联网,由于国内的网站对于文章引用太不规范,根本不尊重原作者的辛勤劳动,以至于现在我根本分不清这段文字的原作者是谁。在此仅告知大家,这段文字不是我写的。也希望大家引用文章的时候能够同时注明原作者和出处:

DKIM 技术通过在每封电子邮件上增加加密的数字标志,然后与合法的互联网地址数据库中的记录进行比较。当收到电子邮件后,只有加密信息与数据库中记录匹配的电子邮件,才能够进入用户的收件箱。它还能检查邮件的完整性,避免黑客等未授权者的修改。 DKIM 的基本工作原理同样是基于传统的密钥认证方式,他会产生两组钥匙,公钥(public key)和私钥(private key),公钥将会存放在 DNS 中,而私钥会存放在寄信服务器中。私钥会自动产生,并依附在邮件头中,发送到寄信者的服务器里。公钥则放在DNS服务器上,供自动获得。收信的服务器,将会收到夹带在邮件头中的私钥和在DNS上自己获取公钥,然后进行比对,比较寄信者的域名是否合法,如果不合法,则判定为垃圾邮件。 由于数字签名是无法仿造的,因此这项技术对于垃圾邮件制造者将是一次致命的打击,他们很难再像过去一样,通过盗用发件人姓名、改变附件属性等小伎俩达到目的。在此之前,垃圾邮件制造者通过把文本转换为图像等方式逃避邮件过滤,并且使得一度逐渐下降的垃圾邮件数目再度抬头。

Setup DKIM via Amavisd

注意: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 用户有只读权限即可。

Image: Tip.png setfacl/getfacl 属于 'acl' 这个软件包提供的,需要先安装。

Image: Tip.png 在 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

Image: Warning.png 如果文件系统为 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 },
    } );

Setup DNS record for DKIM

接下来要为 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 已经设置正确了。

Resource Links

  • Internet-Drafts:
  • Request For Comments:
阅读(4813) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~