(本記事は、2007年3月に実施された「NSUG Solaris 10ナイトセミナー(vol.8) ~迷惑メール対策と送信ドメイン認証の実現~ SPFを設定するぞ!!」で使用された資料を再掲したものです)
寿限無株式会社
水越賢治
2008年3月
1. DKIM とは
2. 準備と設定
2.1 dkim-milterソースの入手
2.2 DNSサーバの設定
2.3 コンパイルとインストール
2.4 dkim-milterを動かす
2.5 sendmail.cfを作る
3. 動作確認
4. 補足
4.1. その他のOSについて
4.2. 参考資料
1. DKIM とは
DKIM(DomainKeys Identified Mail)とは、迷惑メール送信の技法のひとつである送信ドメインの偽装に対応するために用意された技術。自分の組織のDNSで送信するメールサーバを宣言することと、受信するメールサーバ側で受信したメールについて送信ドメインの偽装がないかチェックするフィルタからなる。dkim-milterは受信メールサーバ側でチェックに使うSMTPフィルタープログラム。
2. 準備と設定
Solaris 10に付属のsendmailのバージョンは8.13.7または8.13.8で、milterオプション付きでビルドされているため、sendmailを入れ替えることなくそのまま使うことができる。
# /usr/sbin/sendmail -bi -d0 Version 8.13.8+Sun Compiled with: DNSMAP LDAPMAP LOG MAP_REGEX MATCHGECOS MILTER MIME7TO8 MIME8TO7 NAMED_BIND NDBM NETINET NETINET6 NETUNIX NEWDB NIS NISPLUS PIPELINING SCANF STARTTLS TCPWRAPPERS USERDB USE_LDAP_INIT XDEBUG ============ SYSTEM IDENTITY (after readcf) ============ (short domain name) $w = www2 (canonical domain name) $j = www2.mvs.co.jp (subdomain name) $m = mvs.co.jp (node name) $k = www2.mvs.co.jp ======================================================== |
sendmailのコンパイル情報が表示される。“MILTER”オプションがついているので、このsendmailではmilterを使用できる。
2.1 dkim-milterソースの入手
以下のURLから入手する。
http://sourceforge.net/projects/dkim-milter/
バージョンは、0.6.1 (2007年3月13日現在)。dkim-milterは活発に開発されているので、頻繁にバージョンが上がっている。
2.2 DNSサーバの設定
DNSサーバに自分のドメインが使用するメールサーバのホスト情報を書いておく。受信フィルタ側、たとえばsid-milterはこのSPFレコードを受信したメールと照合し、正しいホストから送信されたメールかどうかを判定する。
dkim-milterのソースコードにdomain Keyを生成するスクリプトgentxt.cshが付属しているので、これを利用するのが簡単である。鍵長は1024bitになっているので、変更したい場合はスクリプトを修正する。
# gentxt.csh key1 mvs.co.jp key1._domainkey IN TXT "v=DKIM1; k=rsa; t=y; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBi QKBgQDAH/iZxoc0ltw1gE/uQXYPbUCpq6RQRkWuqojZScDmOXBm2kjTTMZH/WKX7F4MNrj+jXJ4lvQjF 4qDLuEmJJRX8a5eym6ZcrObAh0iSSfvGnAXzIzJHuTy1wsjJRK0DkY5xH/5DQszJtfYjFt8Q2VcxTCIg 26NI+aDiEDOg/CXKQIDAQAB" ; ----- DKIM key1 for mvs.co.jp |
ワーキングディレクトリに鍵ペアkey1.publicとkey1.privateが生成される。これを所定のディレクトリにコピーする。この例では/etc/mailにコピーする。
標準出力にDNSに登録するレコード情報が表示されるので、これをDNSのゾーンに登録する。SPFと同様にTXT属性とする。
key1._domainkey.mvs.co.jp. IN TXT "..... " |
レコードの説明
- “v=DKIM1” DKIM1バージョンの書式
- “k-rsa” 鍵はRSA形式
- “t=y” テストモード yes
DNS の宣言はあくまでも送信側のドメイン公開鍵情報を宣言するのみで、メール送信サーバ側はこの鍵によってメッセージに署名する必要がある。受信側サーバは DNSの公開鍵を入手し、その鍵で受信したメッセージの署名を確認する。これによってメッセージヘッダの改ざんがないか確認できる。
2.3 コンパイルとインストール
Solaris 10をEntire Distributionでインストールすれば、プログラムのコンパイルに必要な開発ツールやライブラリは揃っている。実際にコンパイルするには必要なツールが起動されるように、PATHを正しく設定する。コンパイルはBuildスクリプトを実行するだけでOK。
# PATH=/usr/sfw/bin:/usr/ccs/bin:/usr/local/bin:/usr/bin:/usr/sbin # export PATH # gzcat dkim-milter-0.6.1.tar.gz | tar xvf - # cd dkim-milter-0.6.1 # sh Build # cd obj.SunOS.5.10.sun4/dkim-filter # cp dkim-filter /usr/local/libexec/ |
Buildスクリプトでインストールもできるが、milterプログラム以外もインストールされてしまうので、プログラム本体をコピーしてもよい。
2.4 dkim-milterを動かす
インストールしたdkim-filterを起動する。オプションなしで起動すると、使用できるオプションが表示される。
# /usr/local/libexec/dkim-filter help dkim-filter: usage: dkim-filter -p socketfile [options] -a peerlist file containing list of hosts to ignore -A auto-restart -b modes select operating modes -c canon canonicalization to use when signing -C config configuration info (see man page) -d domlist domains to sign -D also sign subdomains -f don't fork-and-exit -h append identifying header -i ilist file containing list of internal (signing) hosts -I elist file containing list of external domain clients -k keyfile location of secret key file -l log activity to system log -L limit signature limit requirements -m mtalist MTA daemon names for which to sign -M macrolist MTA macros which enable signing -P pidfile file to which to write pid -s selector selector to use when signing -S signalg signature algorithm to use when signing -u userid change to specified userid -v version spec version to use when signing -V print version number and terminate -x conffile read configuration from conffile |
sendmailとの通信はソケットを使用する。
# /usr/local/libexec/dkim-filter -l -D -h -p local:/var/run/dkim-filter -P /var/ sun/dkim-filter.pid -d www2.mvs.co.jp -k /etc/mail/key1.private -s key1 |
-bオプションの指定で、署名のみ確認のみ、両方の指定ができる。きちんと動かすには、rcスクリプトを用意して自動起動する。
rcスクリプトの例
#!/sbin/sh # #ident "@(#)dkim-filter 1.0 2006/11/15 miz" milter="/usr/local/libexec/dkim-filter" milter_domain="www2.mvs.co.jp" milter_sock="local:/var/run/dkim-filter" milter_pid="/var/run/dkim-filter" milter_key="/etc/mail/key1.private" milter_selector="key1" milter_flags="-l -D -h" milter_opt="${milter_flags} -p ${milter_sock} -P ${milter_pid} -d ${milter_domain} -k ${milter_key} -s ${milter_selector}" case "$1" in start) exec $milter $milter_opt ;; stop) pkill dkim-filter rm -f /var/run/dkim-filter ;; *) echo "Usage: $0 { start | stop }" exit 1 ;; esac exit 0 |
2.5 sendmail.cfを作る
SMTPフィルターを呼び出すようにsendmail.cfを作成してインストールする。Solaris10にはm4 cfが付属しているので、簡単に作成できる。
# cd /etc/mail/cf/cf # cat www2.mc divert(-1) # # divert(0)dnl VERSIONID(`@(#)www2.mc 1.0 (miz) 06/21/2004') OSTYPE(`solaris8')dnl DOMAIN(`solaris-antispam')dnl INPUT_MAIL_FILTER(`dkim-filter',`S=local:/var/run/dkim-filter,F=T,T=R:2m')dnl
↑ この行を追加
MAILER(`local')dnl MAILER(`smtp')dnl |
mcファイルを修正したらsendmail.cfを作成し、sendmailを再起動する。
# make www2.cf # cp www2.cf /etc/mail/sendmail.cf # svcadm restart sendmail |
3. 動作確認
すべての設定が完了したら、メールを受信してみる。正しく動くと、以下のように/var/log/syslogにログが記録される。
Mar 11 21:55:39 www2.mvs.co.jp sendmail[28812]: [ID 801593 mail.info] l2BCtdfT02 8812: Milter insert (1): header: Authentication-Results: www2.mvs.co.jp header.F rom=miz@mvs.co.jp; dkim=pass (1024-bit key/testing) Mar 11 21:55:39 www2.mvs.co.jp sendmail[28812]: [ID 801593 mail.info] l2BCtdfT02 8812: Milter insert (1): header: X-DKIM: Sendmail DKIM Filter v0.6.1 www2.mvs.co .jp l2BCtdfT028812 |
受信したメールには以下のヘッダが付く。
X-DKIM: Sendmail DKIM Filter v0.6.1 www2.mvs.co.jp l2BCtdfT028812 Authentication-Results: www2.mvs.co.jp header.From=miz@mvs.co.jp; dkim=pass (102 4-bit key/testing) |
DKIMレコードが定義されていないサイトについては、Authentication-Results:ヘッダが付かない。
4. 補足
4.1 その他のOSについて
dkim- milterはcで書かれたプログラムで、UNIX系では簡単にコンパイルし、稼働させることができる。Linuxではrpmまたはsrpmでより簡単に導入することができるディストリビューションもあるし、FreeBSDではportsから簡単に導入できる。ぜひ積極的に利用して欲しい。
注: FreeBSD/SPARC64ではdkim-milterが正しく動作しない。
4.2 参考資料
・dkim-milter