mixiユーザー(id:646942)

2016年01月26日18:15

2295 view

【メモ】SpamAssassin

うっかりインストールドキュメントを書き損ねたことで私の中で有名なSAですが、
今回グリグリいじくり倒したのでメモを書きます。
※FreeBSD基準です

環境整備について。

単純です。普通に

/usr/ports/japanese/spamassassin

からmake configしてmake install cleanします。
configの状態は添付の状態とします。

PostfixからSpamAssassinを利用する方法は何種類かあるようですが
私はprocmailに投げる方法を利用するのでそちらもインストールします

cd /usr/ports/mail/procmail
make config
make install clean
※既にpkgに移行済みなのでpkgdb -uは不要なのです(なのです!)

configは両方ともチェック入ってますがDOCSとEXAMPLESなので入れなくても良いでしょう

vim /usr/local/etc/postfix/main.cf

main.cfを弄ります。

## main.cf
mailbox_command = /usr/local/bin/procmail
##

↑の行を加えます。

vim /usr/local/etc/procmailrc

/usr/local/etc/procmailrcを作ります。

## procmailrc
PATH=/bin:/usr/bin:/usr/local/bin
MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/
SPAM=$MAILDIR/.spam/
LOCKFILE=$HOME/.lockmail
#LOGFILE=$HOME/procmail.log
#VERBOSE=ON

# メールヘッダー中に「 X-Spam-*** 」の記述がなければ spamassassin を起動する
:0fw
*!^X-Spam.*
|spamc
##

/etc/rc.confを弄ります。

## rc.conf
spamd_enable="YES"
spamd_flags="-u spamd -H /var/spool/spamd"
##

/usr/local/etc/rc.d/postfix restart
/usr/local/etc/rc.d/sa-spamd start

はいこれで終わり〜、としても、とりあえず動く時は動きますし動かない時は動きません。


そしてここからがググっても出てこないお話。


spamassassin --lint


と打つと


1月 25 16:50:22.895 [17801] warn: plugin: failed to parse plugin (from @INC): Can't locate MeCab.pm in @INC (you may need to install the MeCab module) (@INC contains: lib /usr/local/lib/perl5/site_perl /usr/local/lib/perl5/site_perl/mach/5.20 /usr/local/lib/perl5/5.20/mach /usr/local/lib/perl5/5.20 /usr/local/lib/perl5/site_perl/5.20 /usr/local/lib/perl5/site_perl/5.20/mach) at /usr/local/lib/perl5/site_perl/Mail/SpamAssassin/Plugin/Tokenizer/MeCab.pm line 44.
1月 25 16:50:22.895 [17801] warn: BEGIN failed--compilation aborted at /usr/local/lib/perl5/site_perl/Mail/SpamAssassin/Plugin/Tokenizer/MeCab.pm line 44.
1月 25 16:50:22.895 [17801] warn: Compilation failed in require at (eval 91) line 1.

あるあるですね、Can't locateから始まる「このモジュール無いんですけどぉ!」というエラー。
ここで私はよくcpanまたはcpanm(最近使い始めました)を使います。
※cpanmは~/.cpan/を作らずに作業してくれるし近いミラーサイトを自動的に選んでくれるのでオススメです

cpanm -f Text::MeCab

しかしこれは今回の場合は正解ではありません。
と言うのはSpamAssassinもまたcpanに登録されておりまして、例えばcpanでupgradeと打つとSpamAssassinも(更新という形で)入れようとしてきます。
これはportsからインストールする場合の

/usr/local/etc/mail/spamassassin/local.cf

ではなく、

/etc/mail/spamassassin/local.cf

を参照するportsとは別のconfigオプションなし、日本語対応なしの生のSpamAssassinなんですね。
この方法でインストールすると既存の/usr/local/bin/spamassassinも上書きされてしまいますからportsのを再度上書きインストールしなければならなくなります。
そしてSpamAssassinのみportsから上書きインストールをしても再び「このモジュール(ry」と言われます。
【備考】
その後pkgの方でchecksum....mismuch!を乱発してくれました。恐らくcpanでのupdateの結果だと思います。その場でPortsツリーを更新せずにそのままportupgrade -rf lang/perl5.20として依存関係含め全て再インストール、これを解決しました。

どうすれば良いか。

そう、基本的なことをすれば良いだけです。

cd /usr/ports && make search name="mecab"

と言うように必要なportsを探します。Perl5.xをインストールしているなら、頭にp5-と付いているものですね。

/usr/ports/japanese/p5-MeCab
/usr/ports/japanese/p5-Text-MeCab

この2つをインストールしましょう。文字コードはもちろんUTF-8で。
これらはperlでのmecabインターフェイスで、mecab本体ではありませんから

前提として

/usr/ports/japanese/mecab
/usr/ports/japanese/mecab-dic

と本体&辞書をインストールしておく必要があります。
【備考】
このエラーの根本原因としてはportsとcpanからではMeCab.pmのインストール先が違うこと、またportsのSpamAssassinから呼び出しているMeCabにはMeCab::Taggerが必要で、cpanからインストールされるMeCab.pmにはそれが含まれていないということです。つまりインストール先の差異を埋めるシンボリックリンクを張る程度では解決しない問題でした。


この辺spamassassinを入れる時に自動で入れてくれれば助かるんですけどね、
私の環境はサーバ環境更新の課程でいくつかのperlバージョンに対応したモジュールが入っていますから、誤検知されて入らなかったのかな、とも思います。

そして

spamassassin --lint

ではなく、

spamassassin --lint -D 2>&1 | grep "Can't locate"

と打つと更に良いです。この方法でないとp5-Mail-DKIM等のDKIM関連のモジュールが入っていないことを検知出来ませんでした。

また「RELAY_COUNTRY」オプションについてですが、p5-Geo-IPとGeoIPをportsからインストールするだけではGeoIP.datがインストールされず、IP::Country::Fastを使うことになってしまいます。
これは

https://wiki.apache.org/spamassassin/RelayCountryPlugin

にあるように、少なくとも3年前のデータベースですから古く、正確に判定されない可能性があります。
GeoIP.datは

geoipupdate.sh

と打つことで/usr/local/share/GeoIP/にGeoIP.datとGeoIPv6.datが生成されますから、まず最初にこのコマンドを打つよう忘れずに(それとcronへの登録もね!)

最後にprocmailrcを一行修正します

## procmailrc
|spamc

|spamc --max-size=20480000
##

spamcは、初期設定で500KBを超えるサイズのメールを無視してしまいます。
業務のメールなんて画像の添付が1つ2つあるものですから、↑では20MBまで許容するようにしています。

RELAY_COUNTRYは以下のように利用しています。

## /usr/local/etc/mail/spamassassin/local.cf
# Relay-Countryヘッダをメールに加える
add_header all Relay-Country _RELAYCOUNTRY_ (`**' is local IP address)
# 国内からのメールは信頼する
header COUNTRY_TRUSTED X-Relay-Countries =~ /JP/
describe COUNTRY_TRUSTED Relayed via trusted country
score COUNTRY_TRUSTED -1.0
##

SPFやDKIMについてはこのような形で

## /usr/local/etc/mail/spamassassin/local.cf
# SPF付いていたらちょっと信頼する
score SPF_PASS -0.5
# DomainKeys or DKIM 付いてたら少し信頼する
score DKIM_VALID -1.5
score DKIM_VALID_AU -0.5
##

ウチのサーバはDomainKeys署名とDKIM署名両方付けているのですが、DK_SIGNED等がもう使えなくなってしまっているので少し寂しいです。

■ おまけ

ローカルで

spamassassin -t -D dkim < test.eml
spamassassin -t -D spf < test.eml

とするとDKIMとSPFの有効性テストが出来ます。

2 0

コメント

mixiユーザー

ログインしてコメントを確認・投稿する