dkim-milterのsrc.rpmを作ってみました。

■説明
specファイルのお勉強がてらにdkim-milterのsrc.rpmを作ってみました。
ここでは、Postfix + DKIMの設定をします。
DKIMの設定は、メール送信時に署名を付与するようにします。
※epelリポジトリを入れるとyumで簡単に入っちゃいます:D
http://download.fedora.redhat.com/pub/epel/6/x86_64/

■OS

CentOS 6 64bit

■MTA
postfix-2.6.6-2.1.el6_0.x86_64

■dkim-milter
dkim-milter-2.8.3-4.el6.src.rpm
MD5(dkim-milter-2.8.3-4.el6.src.rpm)= 5a19ed82ca740bffce6b0bfddc5262cd

(1)必要なパッケージをインストール

[root@example ~]# yum -y install sendmail-devel openssl-devel m4 groff

(2)dkim-milter-2.8.3-4.el6.src.rpmをダウンロード
[root@example ~]# wget http://www.kurobuti.com/download/dkim-milter/dkim-milter-2.8.3-4.el6.src.rpm

(3)dkim-milter-2.8.3-4.el6.src.rpmをインストール
[root@example ~]# rpm -ivh dkim-milter-2.8.3-4.el6.src.rpm

(4)dkim-milterのパッケージを作成
[root@example ~]# cd rpmbuild/SPECS/
[root@example SPECS]# rpmbuild -bb dkim-milter.spec

(5)dkim-milterのインストール
[root@example SPECS]# cd ../RPMS/x86_64/
[root@example x86_64]# rpm -ivh dkim-milter-2.8.3-3.el6.x86_64.rpm
準備中...                ########################################### [100%]
   1:dkim-milter            ########################################### [100%]

(6)dkim-milterの設定
[root@example ~]# cd /etc/mail/
[root@example mail]# vi dkim-filter.conf
Mode    v
↓ # 変更
Mode    s

# Domain         example.com
↓ # 変更
Domain         example.kurobuti.com

# Selector        dkim
↓ # 変更
Selector        kurobuti

# KeyFile       /etc/mail/dkim-milter/dkim.private
↓ # 変更
KeyFile         /etc/mail/dkim-milter/kurobuti.private

[root@example mail]# cd dkim-milter
[root@example dkim-milter]# vi ilist
127.0.0.1
192.168.0.0/24 # 署名を付与する内部アドレスを追加
※デフォルトでは、受信側設定になっています。署名をメールヘッダに付与する場合にのみ設定を行えば大丈夫です。
※ここで言うデフォルトの設定は、黒ぶちが作成したsrc.rpmを利用した場合です。
※上記設定では、署名のみするようになっています。もし、署名+認証をする場合は「Mode sv」にしてください。

(7)DKIMの鍵を作成
[root@example ~]# cd /etc/mail/dkim-milter
[root@example dkim-milter]# dkim-genkey -b 1024 -s kurobuti -d example.kurobuti.com
[root@example dkim-milter]# chown dkim-milter:mail kurobuti.private
[root@example dkim-milter]# chmod 440 kurobuti.private
※kurobuti.txtの中身をDNSに登録します。

DNS登録例
$TTL    86400
@       IN      SOA     dkim-dns.kurobuti.com.  root.dkim-dns.kurobuti.com.(
                        2011101502 ; Serial
                        28800      ; Refresh
                        14400      ; Retry
                        3600000    ; Expire
                        86400 )    ; Minimum

        IN      NS      dkim-dns.kurobuti.com.
        IN      MX 10   example.kurobuti.com.
mx      IN      A       192.168.0.121
*       IN      A       192.168.0.121
@       IN      A       192.168.0.121
_policy._domainkey IN TXT "t=y; o=~"
kurobuti._domainkey IN TXT "v=DKIM1; g=*; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDScHT/jgKrGGoU/wxpyXij5RGAr7XXzazObDMskZ7vsh5pphRYQDdR/dmr0cDL35NYzW2PRbObz2bB3iukSlqxmN4NxIyGBzxWRbqmPGCIVdw3eANofvW7Seue2hbLjtawPDTMGVQcsLRWZUnZgE/6n0gG2wmAbTh1c4NrxSfWdQIDAQAB" ; ----- DKIM kurobuti for example.kurobuti.com
※ハイライト部分がDKIMの設定

(8)dkim-milterの起動
[root@example ~]# service dkim-milter start
Starting dkim-milter:                                      [  OK  ]
[root@example ~]# chkconfig dkim-milter on

(9)postfixの設定
[root@example ~]# vi /etc/postfix/main.cf
#-- 最終行にでも追加 or 変更 --
# DKIM
smtpd_milters = inet:10026
non_smtpd_milters = $smtpd_milters
milter_default_action = accept

(10)postfixのリロード
[root@example ~]# service postfix reload
postfix を再読み込み中:                                    [  OK  ]
※起動していない場合は、postfixを起動する。

(11)テストメールを送信してみる
受信したメールのヘッダ
Return-Path: <root@example.local>
X-Original-To: testuser@example2.kurobuti.com
Delivered-To: testuser@example2.kurobuti.com
Received: from mx.example.kurobuti.com (example.kurobuti.com [192.168.0.121])
        by mx.example2.kurobuti.com (Postfix) with ESMTP id E5AA02400B
        for <testuser@example2.kurobuti.com>; Sat, 15 Oct 2011 21:30:59 +0900 (JST)
Authentication-Results: mx.example2.kurobuti.com; dkim=pass (1024-bit key)
        header.i=@example.kurobuti.com; x-dkim-adsp=none
Received: from example.local (localhost [127.0.0.1])
        by mx.example.kurobuti.com (Postfix) with ESMTP id D252424BA2
        for <testuser@example2.kurobuti.com>; Sat, 15 Oct 2011 21:30:59 +0900 (JST)
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=example.kurobuti.com;
        s=kurobuti; t=1318681859;
        bh=bj74/rslR0bn/dJ9cdn2gpaxFeMo+U6NOpehHz71RU4=;
        h=Date:Message-Id:To:From:Subject;
        b=HnFt0GcS1Q7VHv077E8201og3J+iuznoqIRcoLTXxxFkNinZ+sVd49lyFK7sBfjLm
         UO3UjrNvCr16jFFKDiHfQnH+Im0gPnKsI5uHlt3bd6e0cNaWho9JCkoZIVYRdGP3Ga
         FR31o3kkr2A8neZRdgOLEuW4TkEt11iNfJDfqUkY=
Received: (from root@localhost)
        by example.local (8.14.4/8.14.4/Submit) id p9FCUxvH003337;
        Sat, 15 Oct 2011 21:30:59 +0900
Date: Sat, 15 Oct 2011 21:30:59 +0900
Message-Id: <201110151230.p9FCUxvH003337@example.local>
To: testuser@example2.kurobuti.com
From: root@example.kurobuti.com
Subject: testmail

testmail

上記ヘッダの解説は参考文献「1.」に詳しく書かれています。

ざっくり説明すると

DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=example.kurobuti.com;
        s=kurobuti; t=1318681859;
        bh=bj74/rslR0bn/dJ9cdn2gpaxFeMo+U6NOpehHz71RU4=;
        h=Date:Message-Id:To:From:Subject;
        b=HnFt0GcS1Q7VHv077E8201og3J+iuznoqIRcoLTXxxFkNinZ+sVd49lyFK7sBfjLm
         UO3UjrNvCr16jFFKDiHfQnH+Im0gPnKsI5uHlt3bd6e0cNaWho9JCkoZIVYRdGP3Ga
         FR31o3kkr2A8neZRdgOLEuW4TkEt11iNfJDfqUkY=
ハイライト(DKIM-Signatureのhタグ)で指定されているヘッダ + メール本文で電子署名を作成します。
※「Date、Message-Id、To、From、Subject」

「From」のドメイン(dタグ、sタグ)を元に公開鍵をDNSへ取得して、電子署名のハッシュを取得します。

そして、電子署名から取得したハッシュと受信したメールから作成したハッシュを比較して同じであれば「Authentication-Results:」ヘッダの「dkim=」にpassが付きます。
※偽装されている可能性がある場合は、fail

ちなみに、ここでは偽装されている場合(failが付く場合)メールを拒否します。
その他の設定は
[root@example ~]# man dkim-filter.conf
に詳しくかいてあります。

参考文献

1. http://www.atmarkit.co.jp/fsecurity/special/89dkim/dkim03.html
2. http://www.postfix-jp.info/trans-2.3/jhtml/MILTER_README.html
3. http://vinelinux.org/docs/vine5/manuals/making-rpm.html
4. http://salt.iajapan.org/wpmu/anti_spam/admin/tech/explanation/dkim/

補足
ソースでいれた時の記録
http://www.kurobuti.com/blog/?p=2386


10月 15, 2011 at 9:46 pm by 黒ぶちメガネ
Category: Linux, Postfix, spam対策