さくら 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 に良い解説がありました。
DKIM(DomainKeys Identified Mail)についての解説や概念を知るには下記のページが参考になりました。
- DKIM (Domainkeys Identified Mail) : 迷惑メール対策委員会
- 電子署名方式の最新技術「DKIM」とは − @IT −
- BIGLOBE迷惑メールへの取り組み - BIGLOBEセキュリティ
さくら 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: [email protected] 250 2.1.0 [email protected]... Sender ok RCPT TO: [email protected] 250 2.1.5 [email protected]... Recipient ok DATA From: [email protected] 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: [email protected], size=48, class=0, nrcpts=1, msgid=<[email protected]>, 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: [email protected], 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 電子署名を付与したいなど様々な要件が他にも考えられます。
それについては個別に技術コンサルのご相談に乗ることも可能です。お気軽にご相談いただければ幸いです。
コメントやシェアをお願いします!