POPFile をメールサーバ側で運用する1つの方法
POPFile は最初にがんばって学習させると、以降かなり正確にスパムをより分けてくれます。
惜しむらくは一人のユーザが自分しか使わない環境で使うのに適しており、サーバでマルチユーザで使うには適していないという点です。
今まで spamassassin を使って選り分けていたのですが、いかんせん(私には)設定がわかりにくいこともあり、以前から POPFile をサーバ側で使えないかと思っていました。
クライアント側で POPFile を動かせばいいという話もありますが、procmail でメールの転送をしているのでサーバ側で spam をより分けたかったのです。
そのような状況の中、POPFile on Mail Server というページを見つけたので、さっそく試してみました。
概要
外-(SMTP)->ユーザ1-(POP3)->POPFile-(POP3)->fetchmail->procmail->ユーザ2
ということをしています。
POPFile のインストール
gentoo なので、
emerge popfile
で終わってしまいました。のはずだったのですが・・・。
/usr/share/popfile 下のファイルのパーミッションが軒並み 700 か 600 になっていたため、一般ユーザから読み出せず、755、644 に直してまわりました。
一人で使うシステムであれば、700、600 で良いのでしょうが、今回は複数のユーザで使えるようにするため、755、644 にする必要があります。
ユーザの準備
まずは外からのメールを受けるユーザが1つ必要です。
次に、POPFile を動かし、メールをとってくるユーザが必要です。
以下、前者を foo、後者を fwdfoo というユーザとして書いています。
foo 側の環境準備
foo 側は、普通にメールがメールスプールに溜まるようにします。
また、foo のメールを pop3 で読み出せるようにしておきます。(うちは dovecot を使用中)
fwdfoo 側の環境準備
fwdfoo 側ですることは以下の通りです。
- POPFile を fwdfoo 専用で起動できるようにする。
- fetchmail を使い POPFile 経由で、foo のメールを定期的に読み出す。
- procmail で、X-Text-Classification ヘッダをみて、スパムならばスパムなりの対処をする。
- 後は、(procmailのレシピで)転送するなりメールスプールに残すなりの処置をする。
fwdfoo 専用の POPFile を起動できるようにする。
普通に POPFile を起動してしまうと設定や学習結果が複数のユーザで共有されてしまうため、POPFile on Mail Serverの記述を参考にしてユーザ毎に分離できるようにしました。
% cd ~fwdfoo % mkdir .popfile % cd .popfile % cp -p /usr/share/popfile/popfile.cfg . % vi popfile.cfg
popfile.cfg の編集箇所は、
html_port pop3_port
の2つです。
複数ユーザで起動することを考えていますので、例えば、
- 1ユーザ目
- html_port 10080
- pop3_port 10110
- 2ユーザ目
- html_port 10081
- pop3_port 10111
- 3ユーザ目
- html_port 10082
- pop3_port 10112
といった形でユーザ毎に異なる値を指定します。
続いて、起動用のシェスクリプトを作ります。
% vi popfile.sh
中では、環境変数のセットと popfile を起動して裏に回すことをやってます。
POPFILE_USER= のディレクトリは 先ほど作った ~fwdfoo/.popfile ディレクトリです。
export POPFILE_ROOT=/usr/share/popfile export POPFILE_USER=/home/fwdfoo/.popfile /usr/share/popfile/popfile.pl &
最後に popfile.sh を起動できるようにします。
% chmod 700 popfile.sh
以上で終わり。
./popfile.sh
とすると、POPFile が fwdfoo ユーザで起動します。
http://localhost:10080/ で、POPFile コントロールセンターが出てきたらOK。
POPFile は、デフォルトでは localhost しか http での接続を受け付けてくれませんが、設定をいじれば、ネットワーク経由でも受け付けてくれるようになります。
その場合、パスワードを忘れずに設定しておく必要があります。
fetchmail を使い POPFile 経由で foo のメールを読み出せるようにする。
まずは、.fetchmailrc を作成。
poll localhost proto pop3 port 10110 user "localhost:foo" pass password
POPFile を経由するので、user の記述が、[POP3サーバ]:[POP3ユーザ] になっています。
% fetchmail -c
で、接続できているかどうかがわかります。*1
procmail で処置する。
X-Text-Classification: spam
のヘッダがあれば適切な処置をする procmail のレシピを書きます。
例えば、
:0 *^X-Text-Classification: spam spam/
のような感じです。
残りのレシピは必要なものを正しい書式で追加してやります。
実際にメールを配信してみる。
実際に、foo 宛にメールを送り、fwdfoo 側で、fetchmail を行い、正しく fwdfoo 側で処理されるかを確認します。
うまく処置されているようであれば、fetchmail を fwdfoo 側の cron に登録します。
起動時に POPFile も起動するようにする。
うちは gentoo なため、/etc/init.d/popfile を作成
#!/sbin/runscript # Copyright 1999-2005 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Header: $ depend() { need net } start() { ebegin "Starting POPFile" su - fwdfoo -c "~/.popfile/popfile.sh" > /dev/null 2>&1 eend $? } stop() { ebegin "Stopping POPFile" start-stop-daemon --stop --quiet --pidfile ~fwdfoo/.popfile/popfile.pid eend $? }
以上で完了です。
2ユーザ分ほど起動してみたのですが、今のところは*ほぼ*快調です。
*ほぼ*というのは、片方のユーザで、たまに POPFile が落ちてしまっているからです。
Nagios で POPFile のポートを監視しているので、落ちたことはわかるのですが、今のところ原因不明です。
*1:-c, –check check for messages without fetching