送信ドメイン認証には『SPF』、『SenderID』、『DomainKeys』、『DKIM』などがあるが、今回は『DKIM』を使ってみました。

DKIMについて
http://www.atmarkit.co.jp/fsecurity/special/89dkim/dkim01.html

OS
CentOS 5.5 32bit

MTA
postfix-2.3.3-2.1.el5_2(バーチャル環境無し)

dkim-milter
dkim-milter-2.8.3
http://sourceforge.net/projects/dkim-milter/

dkim-milterインストール

[root@mail1 ~]# yum -y install sendmail-devel openssl-devel
[root@mail1 ~]# wget http://sourceforge.net/projects/dkim-milter/files/DKIM%20Milter/2.8.3/dkim-milter-2.8.3.tar.gz/download
[root@mail1 ~]# tar zxvf dkim-milter-2.8.3.tar.gz
[root@mail1 ~]# cd dkim-milter-2.8.3
[root@mail1 dkim-milter-2.8.3]# cp site.config.m4.dist devtools/Site/site.config.m4
[root@mail1 dkim-milter-2.8.3]# vi devtools/Site/site.config.m4
最終行にでも追加
   ↓
define(`confMANROOT', `/usr/share/man/man')
[root@mail1 dkim-milter-2.8.3]# ./Build
[root@mail1 dkim-milter-2.8.3]# ./Build install

dkim-milterで使用するユーザ作成
[root@mail1 ~]# useradd -g mail -m -d /var/milter -s /sbin/nologin milter

DNSに登録する公開カギ、秘密カギの作成
[root@mail1 ~]# mkdir /etc/pki/dkim-milter
[root@mail1 ~]# cd /etc/pki/dkim-milter/
[root@mail1 dkim-milter]# dkim-genkey -s セレクタ名 -d ドメイン名
例)[root@mail1 dkim-milter]# dkim-genkey -s test -d mail1.com
[root@mail1 dkim-milter]# chmod 440 test.private
[root@mail1 dkim-milter]# chown milter:mail test.private
[root@mail1 dkim-milter]# ls
test.private(秘密カギ)  test.txt(DNSに登録する公開カギ)

dkim-milterで署名を付ける内部アドレスの設定
[root@mail1 ~]# vi /etc/pki/dkim-milter/ilist
127.0.0.1
192.168.0.0/24
[root@mail1 ~]# chmod 440 /etc/pki/dkim-milter/ilist
[root@mail1 ~]# chown milter:mail /etc/pki/dkim-milter/ilist

DNSのゾーンファイルに公開カギ、SSPを追加
zoneファイルの最後にでも、『/etc/pki/dkim-milter/test.txt』の中身と以下を追加する。
_policy._domainkey IN TXT "t=y; o=~"
_domainkey IN TXT "t=y; o=~"
test._domainkey IN TXT "v=DKIM1; g=*; k=rsa; p=公開カギ ; ----- DKIM test for mail1.com

dkim-milterの起動スクリプトを作成
[root@mail1 ~]# vi /etc/rc.d/init.d/dkim-milter
#
#
# dkim-milter:
#
# chkconfig: 2345 75 35
# processname: dkim-milter
# description: dkim milter
source /etc/rc.d/init.d/functions
PROG=/usr/sbin/dkim-filter
PID=/var/milter/dkim-milter.pid
CONF=/etc/mail/dkim-filter.conf
SOCKET=inet:10026
#SOCKET=/var/milter/dkim-milter.socket   #Socketの場合
DOMAINLIST="mail1.com"  #カンマ区切り
SELECTOR="test"       #セレクタ名
KEY="/etc/pki/dkim-milter/${SELECTOR}.private"
ILIST="/etc/pki/dkim-milter/ilist"
RETVAL=0
        start() {
                        echo -n $"Starting dkim-milter: "
                        daemon --user milter \
                        "umask 117; $PROG -p $SOCKET -d $DOMAINLIST -k $KEY -l -P $PID -s $SELECTOR -i $ILIST -x $CONF"
                        #"umask 117; $PROG -p local:$SOCKET -d $DOMAINLIST -k $KEY -l -P $PID -s $SELECTOR -i $ILIST"   #Socketの場合

                        RETVAL=$?
                        echo
                        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/dkim-milter
                        return $RETVAL
                }

        stop() {
                        echo -n $"Shutting down dkim-milter: "
                        killproc $PROG
                        #    rm -f $SOCKET
                        RETVAL=$?
                        echo
                        [ "$RETVAL" = 0 ] && rm -f /var/lock/subsys/dkim-milter
                        return $RETVAL
                }

        restart() {
                        stop
                        start
                }

        case "$1" in
                        start)
                                start
                        ;;

                        stop)
                                stop
                        ;;

                        restart)
                                restart
                        ;;

                        status)
                                status $PROG
                                RETVAL=$?
                        ;;

                        *)
                                echo $"Usage: $0 {start|stop|restart|status}"
                                RETVAL=1
        esac
        exit;

[root@mail1 ~]# chmod 755 /etc/rc.d/init.d/dkim-milter

dkim-milterの受信拒否ルールを設定
[root@mail1 ~]# vi /etc/mail/dkim-filter.conf
(例)
# On-BadSignature
On-BadSignature         reject ← メールが改竄されている可能性があるものは拒否する
# On-NoSignature
On-NoSignature          accept ← 署名が無くてもメールを受信する
)詳しくは、『man dkim-filter.conf』を参照してください。

Postfixの設定
[root@mail1 ~]# vi /etc/postfix/main.cf
一番最後にでも追加
#DKIM
smtpd_milters = inet:10026
#smtpd_milters = unix:/var/milter/dkim-milter.socket  #Socketの場合
non_smtpd_milters = $smtpd_milters
milter_default_action = accept
)今回は、メールスキャンとかしないので『/etc/postfix/master.cf』は弄りません。他のポートへ転送したりする場合は、設定が必要です。参考文献(*1を参照してください。

dkim-milterを起動
[root@mail1 ~]# /etc/rc.d/init.d/dkim-milter start
Starting dkim-milter:                                      [  OK  ]
[root@mail1 ~]# ps -ef | grep dkim
milter    6319     1  0 16:55 ?        00:00:00 /usr/sbin/dkim-filter -p inet:10026 -d mail1.com -k /etc/pki/dkim-milter/test.private -l -P /var/milter/dkim-milter.pid -s test -i /etc/pki/dkim-milter/ilist -x /etc/mail/dkim-filter.conf
root      6328  4270  0 16:56 pts/1    00:00:00 grep dkim

Postfixを再起動(又はリロード)
[root@mail1 ~]# /etc/rc.d/init.d/postfix restart
postfix を停止中:                                          [  OK  ]
postfix を起動中:                                          [  OK  ]

DNSに登録したDKIMのTXTレコードが見えるか確認
[root@mail1 new]# dig _policy._domainkey.mail1.com txt

; <<>> DiG 9.3.6-P1-RedHat-9.3.6-4.P1.el5_4.2 <<>> _policy._domainkey.mail1.com txt
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29833
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;_policy._domainkey.mail1.com.  IN      TXT

;; ANSWER SECTION:
_policy._domainkey.mail1.com. 86400 IN  TXT     "t=y\; o=~"

;; AUTHORITY SECTION:
mail1.com.              86400   IN      NS      dns.com.

;; ADDITIONAL SECTION:
dns.com.                86400   IN      A       192.168.0.15

;; Query time: 2 msec
;; SERVER: 192.168.0.15#53(192.168.0.15)
;; WHEN: Sun Jul 25 16:58:15 2010
;; MSG SIZE  rcvd: 101

[root@mail1 new]# dig _domainkey.mail1.com txt

; <<>> DiG 9.3.6-P1-RedHat-9.3.6-4.P1.el5_4.2 <<>> _domainkey.mail1.com txt
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34397
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;_domainkey.mail1.com.          IN      TXT

;; ANSWER SECTION:
_domainkey.mail1.com.   86400   IN      TXT     "t=y\; o=~"

;; AUTHORITY SECTION:
mail1.com.              86400   IN      NS      dns.com.

;; ADDITIONAL SECTION:
dns.com.                86400   IN      A       192.168.0.15

;; Query time: 1 msec
;; SERVER: 192.168.0.15#53(192.168.0.15)
;; WHEN: Sun Jul 25 16:58:45 2010
;; MSG SIZE  rcvd: 93

[root@mail1 new]# dig test._domainkey.mail1.com txt

; <<>> DiG 9.3.6-P1-RedHat-9.3.6-4.P1.el5_4.2 <<>> test._domainkey.mail1.com txt
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34284
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;test._domainkey.mail1.com.     IN      TXT

;; ANSWER SECTION:
test._domainkey.mail1.com. 86400 IN     TXT     "v=DKIM1\; g=*\; k=rsa\; p=公開カギ"

;; AUTHORITY SECTION:
mail1.com.              86400   IN      NS      dns.com.

;; ADDITIONAL SECTION:
dns.com.                86400   IN      A       192.168.0.15

;; Query time: 1 msec
;; SERVER: 192.168.0.15#53(192.168.0.15)
;; WHEN: Sun Jul 25 16:59:09 2010
;; MSG SIZE  rcvd: 329

無事にTXTレコードが見えればDNS側の設定は問題ないです。

DKIMのヘッダ
以下のように、『dkim=pass』になっていれば認証が問題なく通ったと言う事です。
Authentication-Results: mail.mail1.com; dkim=pass (1024-bit key)
        header.i=@mail2.com; x-dkim-adsp=none
Received: from mail2.com (localhost.localdomain [127.0.0.1])
        by mail.mail2.com (Postfix) with ESMTP id 72F1468166
        for <test@mail1.com>; Sun, 25 Jul 2010 17:01:20 +0900 (JST)
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=mail2.com; s=test;
        t=1280044880; bh=g3zLYH4xKxcPrHOD18z9YfpQcnk/GaJedfustWU5uGs=;
        h=Date:From:Message-Id:To:Subject;
        b=AWj5r+JAat9lzslYDXsnofKODKxeZsJzjHS44XaJArwVXwcWEhhJyyEJoZ6NvUMeA
         uW5uEXSXFwFsGsfx1SuOOQx8HmH6139B6JDB12sU38TazfVzp8A0KEf8dddODC3+Rg
         zgWRl5W/uhH0mECIM/tKlrnr6IcYEVcWYHASVG7Q=

また、『dkim=fail』などになっていると、偽装されている可能性があります。

今回の設定では、『dkim=fail』になっている場合はメールの受信を拒否します。

ただ、いまいちよく分からないのがSSP。

dkim-milter側でメールのヘッダをチェックした際に受信拒否や破棄の設定が出来る事を確認したけど、署名が無いバージョンのメールを受け取った時にきちんとDNSのpolicyを見に行っているのかが分からない・・・。

policyの設定で、例えば『t=y; o=!』とかにしても普通に受信する。

ん~、もうすこし弄ってみたいとSSPは分からないなぁ(’~’)

ちなみに、今回は『DKIM』しかインストールしませんでしたが、本番で使用する場合は『Domainkeys』も入れておくのがベストです。

後、『Postfix』の『header_checks』で『/dkim=pass/ REJECT』とかしてみたけど、このヘッダーは『header_checks』の処理より後に付くのかうまいこと拒否してくれませんでした。

参考文献

(*1 http://tkoshima.net/wp/archives/348
(*2 http://www.forwhom.jp/dkim.html
(*3 http://www.moritox.jp/centos/dkim_2
(*4 http://groups.google.co.jp/group/jlug.ml.users/browse_thread/thread/e3099eaa05d5a414
(*5 http://www.dkim.jp/faq.html
(*6 http://tosaka.org/tips/centos5-mail.html


7月 25, 2010 at 5:24 pm by 黒ぶちメガネ
Category: Linux, Postfix, spam対策