SpamAssassin with Postfix2.3 on the FreeBSD5.4R (+ submission port)

このエントリーをはてなブックマークに追加
はてなブックマーク - SpamAssassin with Postfix2.3 on the FreeBSD5.4R (+ submission port)
Share on Facebook
Post to Google Buzz
Bookmark this on Yahoo Bookmark
Bookmark this on Livedoor Clip
Share on FriendFeed

妻がspamメールがウザイとのたまうので、サーバーによく使われているらしいSpamAssassinを使ってみようと思い勢い良くportsでインストール。

# cd /usr/ports/mail/p5-Mail-SpamAssassin
# make
# make install

インストール時のオプションは以下のとおり。SPF_QUERYは現状どんだけ意味があるのかわからないがとりあえず入れておいた。いらなきゃいつでも外せるし。

Options for p5-Mail-SpamAssassin 3.1.7_3
[X] AS_ROOT Run spamd as root (recommended)
[ ] DOMAINKEYS DomainKeys support
[ ] DKIM DomainKeys Identified Mail
[X] SSL Build with SSL support for spamd/spamc
[X] GNUPG Install GnuPG (for sa-update)
[ ] MYSQL Add MySQL support
[ ] PGSQL Add PostreSQL support
[X] RAZOR Add Vipul’s Razor support
[X] SPF_QUERY Add SPF query support
[ ] RELAY_COUNTRY Relay country support
[X] TOOLS Install SpamAssassin tools

/etc/rc.confに下記の2行追記。

# Enable SpamAssassin
spamd_enable=”YES”

“/etc/hosts.allow”におまじないを追加。

# spamd
spamd : localhost : allow
spamd : ALL : deny

下記コマンドで開始。

/usr/local/etc/rc.d/sa-spamd.sh start

と、ここまで勢い良く進めてからPostfixとの連携方法を探る(笑)
あれ?SpamAssassinはユーザー単位でかけるのが普通なの?と思うぐらいサーバー一括型の情報は検索結果の上位に来ない。
サーバー一括でかける方法としてはspamass-milterを使ったsendmailとの連携方法は良く目にする。しかしPostfixではProcmail使えとか、フィルタースクリプト書いて連携しろとかいう方法は見つかるのだが、なんだかいまいち美しくない。
Psotfixの設定だけでいけないのか?と思いさらに検索し続けると、やっとこのpostfix-jp-MLのログを発見した。
早速書かれていたSpamAssassin Wiki:IntegratedSpamdInPostfixへ飛ぶ。
まずは”/usr/local/etc/postfix/master.cf”を編集。smtpdの後に”-o content_filter=spamassassin”と追記。

# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (yes) (never) (100)
# ==========================================================================
#smtp inet n – n – – smtpd
smtp inet n – n – – smtpd -o content_filter=spamassassin

最終行に下記の2行を追記。

spamassassin
unix – n n – – pipe
user=nobody argv=/usr/local/bin/spamc -e /usr/local/sbin/sendmail -oi -f ${sender} ${recipient}

早速”/usr/local/etc/rc.d/postfix.sh reload”でpostfixに設定更新させて、”tail -f /var/log/maillog”でログをながめながらテストメール送受信してみる。

spamd[?]: spamd: setuid to nobody succeeded
spamd[?]: spamd: creating default_prefs: /nonexistent/.spamassassin/user_prefs

と言うエラーが記録された。SpamAssassinの呼び出しに失敗しているようだ。
FreeBSDではユーザーnobodyのホームディレクトリが”/nonexistent/”に設定されている。実際にはそんなディレクトリは存在せず、単にログインさせないユーザーのホームディレクトリという意味である。
仕方がないのでユーザーをpostfixに変更

spamassassin
unix – n n – – pipe
user=postfix argv=/usr/local/bin/spamc -e /usr/local/sbin/sendmail -oi -f ${sender} ${recipient}

今度は

Feb 21 13:25:02 サーバー名 postfix/pipe[プロセスID]: fatal: user= command-line attribute specifies mail system owner postfix

はあ、そう言われれば仰るとおりですね。
気を取り直してSpamAssassin用のアカウントであるspamdへ変更。

spamassassin
unix – n n – – pipe
user=spamd argv=/usr/local/bin/spamc -e /usr/local/sbin/sendmail -oi -f ${sender} ${recipient}

今度は

spamd[?]: spamd: setuid to spamd succeeded
spamd[?]: spamd: creating default_prefs: /var/spool/spamd/.spamassassin/user_prefs
spamd[?]: config: cannot write to /var/spool/spamd/.spamassassin/user_prefs: No such file or directory
spamd[?]: spamd: failed to create readable default_prefs: /var/spool/spamd/.spamassassin/user_prefs
spamd[?]: spamd: processing message for spamd:58

うまくいくかと思いきや、もう一歩。ユーザーspamdのホームディレクトリ”/var/spool/spamd/”に.spamassassin/user_prefsを作ってあげなければいけないようだ。ええぃ手間のかかる!

# touch /var/spool/spamd/.spamassassin/user_prefs
# chown spamd:spamd /var/spool/spamd/.spamassassin/user_prefs

これでどないや?

spamd[?]: spamd: clean message (0.0/5.0) for spamd:58 in 5.2 seconds, 17598 bytes.
spamd[?]: spamd: result: . 0 – scantime=5.2,size=17598,user=spamd,uid=58,required_score=5.0,rhost=localhost,raddr=127.0.0.1,rport=61562,mid=,autolearn=ham

お、成功!
喜びもつかの間ふと考えれば、この場合送信メールもスパムチェックしてしまうため、自分の送信するメールにもX-Spamヘッダーがついてしまう。あんま問題はないはずだけど、万が一自分の出したメールが自分のシステムからスパム認定受けたらかっこわるいよなぁ(笑)
どうしたもんかとPsotfixのぺーじのドキュメント類を眺めていたら、Psotfixのぺーじ:Postfix ビルトインコンテンツ検査というドキュメント中に『あるドメイン宛のメールのみをヘッダ/本体チェックするように設定する』と言う項目を発見。
これで自ドメイン宛のメールだけSpamAssassinかければいいじゃんと更に読み進めると、フィルターをかけたいドメインに別のIPアドレスを振って区別するという方法だった…
別にもう一個IPアドレスを用意することぐらい出来るけど、それじゃあ送信用と受信用のSMTPサーバーを用意するようなもんだろ。だったらサブミッションポートを立ち上げてそっちをノーチェックにしても一緒じゃん。
と、思うも今までサブミッションポートを使わなかったのには理由ががあったのだ。
サブミッションポートを開けるときは必ずSMTP-AUTHを使え。という呪文を至る所で目にする。
PostfixでSMTP-AUTHを行う場合のパターンは
1.Unixパスワードで認証、しかしPlain textでしかパスワードをやりとり出来ないためTLSも併用すべき。
2.sasldb等で、別途管理。この場合CRAM-MD5、DIGEST-MD5あたりが使えるため、TLSは必ずしも必要ない。
該当マシンは個人サーバーで小規模のため、最近主流であるメールアカウントの管理をLDAPやらRDBで管理するような大仰な事はせず、古式ゆかしくUnixアカウントとして運用している。と言う条件を加味するとそれぞれの懸念点は
1のパターンでは生でメールアカウントのユーザーネームパスワードが流れてしまう為TLSの使用を強制したいところだが、全ての環境でTLSが使えるクライアントばかりとも限らないためそれは出来ない。
2のパターンではUnixアカウントのパスワードと同期するのも面倒だし、別パスワードにしてもユーザーが混乱する。
財団法人インターネット協会迷惑メール対策委員会のページにIAjapan 3 迷惑メール対策カンファレンスの講演資料のページがある。そこにsubmissionポートの提供 方法と実践という資料が置いてあるのだが、そこを読んでもPOP before SMTPを廃止してSMTP-AUTHを導入すべき理由は、spamerにシステムを悪用された際の
解析が困難になるという理由しか書いていない。(正確にはNATも解析が難しくなる要因とも書いてあるが、ユーザー数が多くなければ問題無し)
例外を想定しまくってシステムを複雑にしても、障害の原因とは成ってもたいしてメリットはない。
というわけで現状のPOP(IMAP) before SMTPで十分と判断。
“/usr/local/etc/postfix/master.cf”の”submission”で始まる行の行頭の”#”を削除。

smtp inet n – n – – smtpd -o content_filter=spamassassin
submission inet n – n – – smtpd

メーラーのSMTPサーバー設定のポートを25から587に変更してテスト。
SpamAssassinが働いていないことを確認して任務完了。
次はTLS有効にしてみるか。
追記
『正確にはNATも解析が難しくなる要因とも書いてあるが、ユーザー数が多くなければ問題無し』と書いたが、この場合『NATの内側からアクセスしているユーザーが居る場合、一人正規ユーザーが電子メールを利用すると他も全員SMTPサーバーをノーチェックで利用できるようになってしまうという問題』の方が大きいかもしれない。だが、上記の通り、該当サーバーのユーザーは非常に限られた人数のため特に問題とは成らない。Webメーラーも提供しているので、外ではそれを使うようにさせば済むのでうちの場合は無問題。
追記その2
TLS導入に関しては”Postfix with TLS“に書いた。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*

Help

WordPress theme: Kippis 1.15