POPFile をメールサーバ側で運用する1つの方法

2018年2月18日

この記事は最初の投稿日から18年経過しています。内容が古い可能性があります。

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

gentoo

Posted by toshyon