さくら VPS に dkim-milter をインストールして DKIM 対応する

2008 年に個人的にホットな話題として、迷惑メール判定されないための回避テクニックについて解説してきました。当初の思惑として、OP25B(Outbound Port25 Blocking)→ SPF(Sender Policy Framework) → DomainKeys とエントリは続く予定だったのですが力尽きて SPF 止まりとなってしまっていました。

最近になって再び迷惑メール回避テクニックについて個人的にホットになる機会がありました。ホットになった詳細は次のエントリで記述するとして、このエントリでは、さくら VPS に標準インストールされている sendmail を DKIM 電子署名付与に対応させるためのインストール手順に的を絞って解説をします。

- スポンサーリンク -

そもそも最初は 2008 年で止まった僕の知識をもとに DomainKeys 対応を考えていたのですが、調査を進めてみると世の中的には、DomainKeys とIIM(Identified Internet Mail)の良いとこ取りをした DKIM という技術がスタンダードになっているようです。ちょっと調べてみたところ wikipedia に良い解説がありました。

DomainKeysとは、電子メールの認証技術である。その他の方法と異なり、DomainKeysは署名するメール転送エージェント(MTA: Mail Transfer Agent)から検証するMTAまで、ほぼエンド・ツー・エンドの完全性を提供する。多くの場合、署名するMTAが発信者に代わり、また検証するMTAが受信者に代わり機能する。DomainKeysは、Historic(歴史的) RFC 4870に定められている。RFC 4870はStandards Track(標準化過程) RFC 4871「DomainKeys Identified Mail (DKIM) Signatures」によって廃止された。


DKIM(DomainKeys Identified Mail)についての解説や概念を知るには下記のページが参考になりました。

さくら VPS に dkim-milter をインストールして DKIM 対応する手順

それではサーバへのソフトウェアのインストールについての解説です。さくら VPS で標準インストールされている sendmail に対して dkim-milter, dk-milter を使って DKIM, DomainKeys に対応させる手順を説明します。参考にした情報は下記ページですが、そのままではうまく動作しなかった部分があるので適宜修正しています。

1. dk-milter, dkim-milter のソースコードの取得とコンパイルのための前準備を行います。

cd /usr/local/src/
sudo yum -y install sendmail-devel

tar xfvz dk-milter-1.0.2.tar.gz 
tar xvfz dkim-milter-2.8.3.tar.gz

cd /usr/local/src/dkim-milter-2.8.3
ln -s ../dk-milter-1.0.2/libdk/ .

cd /usr/local/src/dkim-milter-2.8.3
cp site.config.m4.dist devtools/Site/site.config.m4

2. コンパイルのためのコンフィグを設定します。
DomeinKeys 認証の有効化と man コマンドのディレクトリ設定として、site.config.m4.dist の最終行に下記を追記します。設定の際に気をつけることは、文字列の区切り記号が、` 文字列 ' となっている点です。なんとも変態的です。

vi site.config.m4.dist
define(`bld_VERIFY_DOMAINKEYS', `true')
define(`confMANROOT', `/usr/share/man')

僕の環境では上記ファイルのみの変更では正常に設定が反映されなかったので、他の設定ファイルに対しても同様の設定を行います。赤色部分のように編集を行います。

vi devtools/OS/Linux
dnl define(`confMANROOT', `/usr/man/man')
define(`confMANROOT', `/usr/share/man')
define(`bld_VERIFY_DOMAINKEYS', `true')

3. dkim-milter のコンパイルを行いインストールします。

make
sudo make install

4. dkim-milter で付与する電子署名のための認証キーペア作成を行います。
キーペア作成には dkim-genkey コマンドを用います。基本的な使い方は下記の通りになります。

dkim-genkey -s セレクタ名 -d ドメイン名

セレクタ名 : 任意の文字列(ドメイン名に関連する文字列が管理しやすいです)
ドメイン名 : 証明書を作成するドメイン名

作成されるキーペアは下記のようなファイル名で出力されます。

セレクタ名.private : 秘密キーファイル
セレクタ名.txt : 公開キーファイル

送信するメールサーバのドメイン名を下記の www8030uf.sakura.ne.jp ドメインの例にならってキー作成を行います。

mkdir /etc/pki/dkim-milter
cd /etc/pki/dkim-milter
dkim-genkey -s swww8030uf_sakura_ne_jp -d www8030uf.sakura.ne.jp

5. DNS レコードに公開キーファイルの内容を追加します。
普通の DNS 設定のサービスならば、公開キーファイルを cat した内容をそのままコピペして設定追加するだけです。

swww8030uf_sakura_ne_jp._domainkey IN TXT "v=DKIM1; g=*; k=rsa; p=MIGfMA0GCS・・・DAQAB" ; ----- DKIM swww8030uf_sakura_ne_jp for www8030uf.sakura.ne.jp

ValueDomain の場合はフォーマット形式が異なるため下記のような形で記述を行います。

txt swww8030uf_sakura_ne_jp._domainkey.www8030uf.sakura.ne.jp. v=DKIM1; g=*; k=rsa; p=MIGfMA0GCS・・・DAQAB

DNS の設定変更が伝搬するまでの間にサーバ側の設定を続けます。秘密キーファイルをセレクタ名でコピーして、アクセス権限を変更しておきます。

cp swww8030uf_sakura_ne_jp.private swww8030uf_sakura_ne_jp
chmod 444 swww8030uf_sakura_ne_jp

6. dkim-milter を実行するユーザを作成します。グループは既存の mail を指定します。

useradd -g mail -m -d /var/milter -s /sbin/nologin milter
chmod 755 /var/milter

7. dkim-milter の各種設定ファイルの設定を行います。

/etc/mail/dkim-filter.conf を下記のように設定します。

cp /usr/local/src/dkim-milter-2.8.3/dkim-filter/dkim-filter.conf.sample /etc/mail/dkim-filter.conf

vi /etc/mail/dkim-filter.conf 
#Domain                 example.com
InternalHosts   /etc/mail/dkim-hosts
#KeyFile                        /var/db/dkim/example.private
KeyList         /etc/mail/dkim-keys
#Selector               my-selector-name
Socket          local:/var/milter/dkim-milter.socket

/etc/mail/dkim-hosts を下記のように設定します。
ここで指定した IP アドレスやホスト名と一致する接続元からのメール送信に対して、メールヘッダーに DKIM 電子署名を付与します。基本的に localhost から送信するメールしか存在しない場合には設定変更不要ですが、SMTP を外部から利用する場合に、接続元の IP アドレスなりを記述する必要があります。

vi /etc/mail/dkim-hosts
127.0.0.1
www8030uf.sakura.ne.jp

/etc/mail/dkim-keys を下記のように設定します。
ここで DKIM Signature の付与ルールの設定します。「適用するアドレス:ドメイン名:秘密キーファイル」の順序で設定を記述します。

vi /etc/mail/dkim-keys
*@www8030uf.sakura.ne.jp:www8030uf.sakura.ne.jp:/etc/pki/dkim-milter/swww8030uf_sakura_ne_jp

8. dkim-milter の起動スクリプトを作成します。

#!/bin/bash
#
#
# 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/run/milter/dkim-milter.pid
SOCKET=/var/milter/dkim-milter.socket   # Socketの場合
CONF="/etc/mail/dkim-filter.conf"
RETVAL=0
start() {
        echo -n $"Starting dkim-milter: "
        daemon --user milter \
        "umask 117; $PROG -p local:$SOCKET -x $CONF -P $PID"
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/dkim-milter
        return $RETVAL
}
stop() {
        echo -n $"Shutting down dkim-milter: "
        killproc $PROG
        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;

9. 作成した起動スクリプトをサービスとして登録します。

chmod 755 /etc/init.d/dkim-milter 
chkconfig --add dkim-milter
chkconfig --list dkim-milter

10. sendmail 側で dkim-filter と連携する設定の追加を行います。

vi /etc/mail/sendmail.mc
INPUT_MAIL_FILTER(`dkim-filter', `S=unix:/var/milter/dkim-milter.socket, F=T')

変更を加えた設定を反映させて、dkim-milter の起動および sendmail の再起動を行います。

cp /etc/mail/sendmail.cf /etc/mail/sendmail.cf.org
m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

/etc/init.d/dkim-milter start
/etc/init.d/sendmail restart

設定が全て正常で、各種ファイルに対して適切なパーミッションが与えられている場合には、正常にサービスが起動されるはずです。ちなむに僕の失敗として設定ファイルに対する milter ユーザのパーミッションがない場合には下記エラーが出力されました。

[root@www3443uf dkim-milter]# /etc/init.d/dkim-milter start
Starting dkim-milter: dkim-filter: /etc/pki/dkim-milter/sdrk7_jp: open(): Permission denied
dkim-filter: /etc/mail/dkim-filter.conf: key load from /etc/mail/dkim-keys failed
                                                           [失敗]

11. localhost から Yahoo! メールアドレス宛に telnet コマンドでメールを送信してみる。
赤文字の部分が入力文字列になります。

[drk@localhost ~]$ telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 localhost.localdomain ESMTP Sendmail 8.13.8/8.13.8; Wed, 15 Aug 2012 00:07:53 +0900
HELO www8030uf.sakura.ne.jp
250 localhost.localdomain Hello localhost.localdomain [127.0.0.1], pleased to meet you
MAIL FROM: drk@www8030uf.sakura.ne.jp
250 2.1.0 drk@www8030uf.sakura.ne.jp... Sender ok
RCPT TO: drk7jp@yahoo.co.jp
250 2.1.5 drk7jp@yahoo.co.jp... Recipient ok
DATA
From: drk@www8030uf.sakura.ne.jp
Subjet: test
Hello world.
.
QUIT354 Enter mail, end with "." on a line by itself
250 2.0.0 q7EF7rPw020673 Message accepted for delivery

221 2.0.0 localhost.localdomain closing connection
Connection closed by foreign host.

12. /var/log/maillog を確認して sendmail の挙動を確認する。
正常に DKIM が付与されている場合にのみ、赤文字のレコードが出力されます。出力されていない場合には何かが間違えております。

Aug 15 00:08:41 localhost sendmail[20673]: q7EF7rPw020673: from=drk@www8030uf.sakura.ne.jp, size=48, class=0, nrcpts=1, msgid=<201208141508.q7EF7rPw020673@localhost.localdomain>, proto=SMTP, daemon=MTA, relay=localhost.localdomain [127.0.0.1]
Aug 15 00:08:41 localhost sendmail[20673]: q7EF7rPw020673: Milter insert (1): header: DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=www8030uf.sakura.ne.jp;\n\ts=swww8030uf_sakura_ne_jp; t=1344956921;\n\tbh=TJnoB+ZgA8hH5kDk0sHkyILr0qoHt1QABzXsd9yItT4=; h=From;\n\tb=WhQn2VRHpv8uAL/0DceSax2FX2oqwLsg2IajHTWu3j7EoXl6tDwnmT90X/3bVodeP\n\t V15Ek7chV5nm5y8S5hVIvA0NvpEQTBejFrKsNqh38IPViRDy7O3JKq92fkf7MQLpxc\n\t 9dMCQzJNBB+xwMJKJV/PO9HDqRTwIRIb7lI3KsbY=
Aug 15 00:08:41 localhost sendmail[20676]: q7EF7rPw020673: to=drk7jp@yahoo.co.jp, delay=00:00:13, xdelay=00:00:00, mailer=esmtp, pri=120048, relay=mx5.mail.yahoo.co.jp. [183.79.57.236], dsn=2.0.0, stat=Sent (ok dirdel)

以上の手順で、さくら VPS の sendmail を通じて送信する特定のエンベロープ(envelope)From のメールに対して、DKIM 電子署名を付与することが可能となります。ただし、実運用を考えていくと、外部のメールクライアントから SMTP に接続して送信するメールにも DKIM 電子署名を付与したいなど様々な要件が他にも考えられます。

それについては個別に技術コンサルのご相談に乗ることも可能です。お気軽にご相談いただければ幸いです。

- スポンサーリンク -