[[DomainKeys についてはこちら"DomainKeysって何?

1. 必要なシステム構成

 DomainKeys の利用にあたり sendmail が 8.13.0 以上かつ LIBMILTER に対応していなくてはいけません。このあたりは Sendmail への Sender ID 実装 をご覧下さい。

 LIBMILTER の実装が終わったら、いよいよ dk-milter のセットアップです。

2. dk-milter のセットアップ

 さて、sendmail の MILTER 対応を確認したら、いよいよ DomainKeys の利用のため dk-milter を実装します。

 DomainKeys 機能を使うためには sendmail.net で配布されている dk-milter モジュールを用います。

2-1. dk-milter って何??

 dk-milter は DomainKeys の機能を sendmail に実装するものです。 SourceForge で開発が進んでいます。http://sourceforge.net/projects/sid-milter/

3-2. dk-milter のダウンロード

 SourceForge よりダウンロードします。
 ページ半ばにある【 Latest File Releases 】にある【 Download 】をクリックしてダウンロードします。

 今日現在のバージョンは 0.3.0 です。ピンク色で色が付いている箇所が最新リリースのファイルです。Download dk-milter-0.3.0.tar.gz をクリックして、ダウンロード先を選びます。ここの例では wget で取得してみます。

$ cd /usr/local/src
$ wget http://jaist.dl.sourceforge.net/sourceforge/dk-milter/dk-milter-0.3.0.tar.gz

2-3. dk-milter のセットアップ

 既に sid-milter のセットアップをしたことがあれば、ほとんど同じようにセットアップが可能です。

 2-2 項でファイルをダウンロードしたら、アーカイブを展開します。

$ tar xfz dk-milter-0.3.0.tar.gz
$ cd dk-milter-0.3.0

 次に libmilter.a の場所を確認しておきます。標準では /usr/lib/libmilter.a だと思いますが、環境によって異なると思うので、find などで確認が必要です。

$ vi dk-filter/Makefile.m4

 ファイルを開いて、24 行目の confLIBDIRS のパスを必要に応じて書き換えます。libmilter.a が /usr/lib であれば

dnl APPENDDEF(`confLIBDIRS', `-L/usr/local/sendmail/lib')

 こちらを

APPENDDEF(`confLIBDIRS', `-L/usr/lib')

 このように書き換えておきます。(特に必要なければ記述は不要かもしれません)

 ここで dk-milter をコンパイルします。

$ ./Build
# su
# ./Build install

 正常にコンパイルされていれば /usr/bin/dk-filter にファイルがコピーされます。

# ls -l /usr/bin/dk-filter
-r-xr-xr-x    1 bin      bin        165059 Jun 28 18:10 /usr/bin/dk-filter

2-4. sendmail.mc の編集と sendmail.cf 再構築

 sid-milter を sendmail が参照でいるように sendmail.cf を書き換えます。

 sendmail.cf を書き換えるためには、元となる sendmail.m4 ファイルを編集します。念のため、事前に両方バックアップを取っておくと良いでしょう。

# cp -p sendmail.cf sendmail.cf.org
# cp -p sendmail.m4 sendmail.m4.org

 sendmail.mc ファイルを開きます。

# vi /etc/mail/sendmail.mc

 ファイルを開いたら末尾に

INPUT_MAIL_FILTER(`dk-filter', `S=inet:8892@localhost')

 このような記述を追加します。

 なお、dk-filter と sid-filter は共存できます。ポート番号が重複しないよう、それぞれ変えるように注意してください。

 保存後、sendmail.cf を M4 マクロを使って生成します。

# m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
(具体的には sendmail.cf に「O InputMailFilters=sid-filter」が追加されます)

3. dk-milter の運用

3-1. 秘密鍵の設置

 dk-filter のテスト確認は sid-filter より行程が増えます。

 DomainKeys の設定がまだでしたら、gentxt.csh を使うことで比較的簡単にゾーンファイルに記述する TXT レコードが出力されます。

※アーカイブを展開したディレクトリの中に README があります。バイナリファイルがある場合のパフォーマンス向上方法が書かれていました。興味のある方はどうぞ。

 公開鍵作成の前に行った秘密鍵を安全な場所に設置します。README では /var/db/domainkeys/名前.key.pem が例としてあげられていました。

 例にならってディレクトリを作成します。

# mkdir /var/db/domainkeys
# cp 秘密鍵.txt /var/db/domainkeys/server.key.pem

 あわせてパーミッションも変更し、root 以外は参照できなくしておきます。

# chmod 600 -R /var/db/domainkeys

3-2. dk-milter の起動とオプション

 起動は次のような書式です。

# /usr/bin/dk-filter -l -p ソケットスペック -d ドメイン名(ホスト名) -s 秘密鍵の場所 -S セレクタ

 今回は次のように指定してみました。

  • -p = inet:8892@localhost
  • -d = nsx.pocketstudio.jp
  • -s = /var/db/domainkeys/server.key.pem
  • -S = betatest (セレクタって何?という場合はこちらを参照)
# /usr/bin/dk-filter -l -p inet:8892@localhost -d nsx.pocketstudio.jp -s /var/db/domainkeys/server.key.pem -S betatest

 これで dk-milter が起動します。-l オプションはログの記録です。/var/log/maillog には起動した旨のログが残ります。

Jun 28 18:33:22 nsx dk-filter[2871]: Sendmail DomainKeys Filter v0.3.0
starting (args: -l -p inet:8892@localhost -d nsx.pocketstudio.jp 
-s /var/db/domainkeys/server.key.pem -S betatest)

 ほかにもセレクタを用いている場合は複数起動します。

 ※詳しくは man dk-filter

 さらに、sendmail の再起動も必要です。SIGHUP を sendmail に送るか、Red Hat 系でしたら以下のように停止・再起動ができます。

# /etc/rc.d/init.d/sendmail restart
Shutting down sendmail:                                    [  OK  ]
Starting sendmail:                                         [  OK  ]

 これで OK !、とりあえず。

 あとは、実際にメールを送信してみると、ログに次のような情報が記録されます。

Jun 28 18:34:17 nsx sendmail[2907]: j5S9YH0W002907: Milter insert (1):
header: DomainKey-Signature: a=rsa-sha1; s=betatest; d=nsx.pocketstudio.jp;
c=simple; q=dns;\n\tb=QjFh0HvJ9Y(メール固有の情報・以下省略)

 実際に外部に配送されたメールには、ヘッダ情報に DomainKey-Signature: ヘッダが付与されていることが分かります。

DomainKey-Signature: a=rsa-sha1; s=betatest; d=nsx.pocketstudio.jp;
c=simple; q=dns; b=QjFh0HvJ9Y(以下メール固有の情報)

3-3. dk-filter の自動起動設定

 サーバ起動時に自動実行されるよう /etc/rc.d/rc.local ファイルに記述を追加しておきます。

# dk-milter
/usr/bin/dk-filter -l -p inet:8892@localhost -d pocketstudio.jp -s /var/db/domainkeys/server.key.pem -S betatest

(※運用サーバによって情報は異なります。このまま貼り付けても動きません。サーバ環境に応じてホスト名、秘密鍵の場所、セレクタを変更してご利用下さい)

3-4. エラー対策

smfi_opensocket() failed
/var/db/domainkeys/server.key.pem: stat(): No such file or directory

 -s オプションで指定された場所に秘密鍵がありません。パスを再確認する必要があります。

Sendmail DomainKeys Filter: Unable to bind to port xxx Address already in use
Sendmail DomainKeys Filter: Unable to create listening socket on conn

 既に dk-filter プロセスが起動しています。一旦プロセスを終了させた後、再度 dk-filter を実行する必要があります。

Milter (dk-filter): error connecting to filter: Connection refused by localhost
Milter (dk-filter): to error state

 dk-filter が異常動作しているか停止しています。この間 DomainKey の発行はされません。dk-filter の再起動を行えば復帰できます。

3-5 DomainKeys の動作確認

sa-test@sendmail.net 宛に適当なメールを送ると自動で結果が表示されます。
Authentication System:       Domain Keys         
   Result:                   DK signature confirmed GOOD
   Description:              Signature verified, message arrived intact
   Reporting host:           sendmail.net        
   More information:         http://antispam.yahoo.com/domainkeys
   Sendmail milter:          http://www.sendmail.net/dk-milter

 このように【 DK signature confirmed GOOD 】とありますので、設定上は問題がない事が分かります。

4. 実運用時にはどうする?

 正しく DomainKeys 認証されたメールにはヘッダ情報に

Authentication-Results: ホスト名 from=メールアドレス; domainkeys=pass

 このように domainkeys=pass(通過)というヘッダ情報が埋め込まれます。

 正しいメールであるという証拠ですので、たとえば社内のメールのやりとりや、信頼しているサーバ間での通信で、安心だというメールボックスの振り分け、フラグや色づけなどを実施することで活用できそうです。

 まだ DomainKeys を導入しているのは、日本国内では殆どなさそうなので、逆に信頼性を高める役割を持つと思います。

5. 課題 - 外部からのメール中継(問題解決)

調査不足なのですが、サーバ内から mail コマンドなどで通す場合は DomainKey-Signature: ヘッダが付与されます。ですが、外部から中継(Relay)させた場合にはDomainKey-Signature: ヘッダが付きません。この点、要調査です。

 外部からのメール中継(Relay)の場合でも自動で DomainKeys を割り当てることが出来ました。通常の SMTP ポート 25 番を経由すると dk-filter はスルーしてしまいます。ですが、サブミッション・ポート(Mail Submission Agent)の TCP 587 番を使用してメール送信をすると、自動で DomainKey が作成(メールのヘッダ中に DomainKey-Signature: が自動挿入)されました。

 変更点は sendmail.mc の追加・修正です。

DAEMON_OPTIONS(`Port=smtp, Name=MTA')dnl
DAEMON_OPTIONS(`Port=587, Name=MSA, M=Ea')dnl

 上記2点、ポートについての記述を書き換え sendmail.cf を再構築したところ、うまくいきました。

6.メモ


トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: Sun, 19 Sep 2010 14:58:43 JST (2347d)