[[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 よりダウンロードします。 今日現在のバージョンは 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 セレクタ 今回は次のように指定してみました。
# /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. 課題 - 外部からのメール中継(問題解決) †
外部からのメール中継(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.メモ † |