qmail+bogofilter+kakasi+maildrop インストールメモ #--------------------------------------------------------------------------------------------- # SPAM メール対策概要 #--------------------------------------------------------------------------------------------- 近年、海外・国内問わず、SPAM メールが大量にインターネット上を行き来しています。これを回避するには通常、SPAM メールをフィルターしますが、過去のメールからの統計情報により、着信したメールをSPAM かNON-SPAM かを判断するベイズ理論によるフォルタリングが注目されています。 今回は、SPAM メールフィルターにbogofilter+kakasi を、実際SPAM メールボックスへの配送にqmail+maildrop を用います。 #--------------------------------------------------------------------------------------------- # メールフィルター概要 #--------------------------------------------------------------------------------------------- bogofilter はベイズ理論によるフィルタープログラムです。 ● 日本語メールのSPAM 判断に関する問題 bogofilter は英語圏で開発されたこともあり、日本語メールはうまくフィルターしてくれません。これは、日本語の分かち書き(文節分割) が正しく行われないことに起因しているようです。 そこで、日本語文章を辞書を基に正しい文節に分割するkakasi が登場する訳です。 kakasi は、辞書を基にして日本語を解析し、単語や文節に分けたり、ひらがなやカタカナなどに変換したりするプログラムです。日本語メールをkakasi によって正しく文節分けし、その後bogofilter を通すことで日本語メールも正しくフィルタリングすることができます。 ● bogofilter の学習機能に関して bogofilter は使う側でなにも設定しないことには本来の良さが発揮されません。というのも、bogofilter はSPAM かどうか判断する材料として、内部的に文節データベースを持っています。そして、bogofilter を初めて使う場合は、このデータベースにあらかじめSPAM である文節、SPAM でない文節を複数登録する必要があるのです。安定した運用にはいると、bogofilter は自動的にメールがSPAM であるかでないかを判断するようになります。つまり、使う側がbogofilter に学習させる必要があるのです。 #--------------------------------------------------------------------------------------------- # SPAM メール振り分け概要 #--------------------------------------------------------------------------------------------- SPAM メールであるか、NON-SPAM メールであるかの判断はbogofilter が行いますが、実際メールボックスに配送するのはqmail のメール配送エージェント(MDA) です。qmail 標準のMDA であるqmail-pop3d は条件によって配送先を変更する機能はついていません。そこで、maildrop が必要となります。 maildrop はメール配送指示言語を持ったローカルメール配送エージェント(MDA) です。既存のローカルメールエージェントに置き換えることができる他、.qmail などのプログラム転送機能経由で実行することもできます。通常、/etc/courier/maildroprc、$HOME/.mailfilter の順にメール配送指示を読み込み、必要に応じて転送、フィルタ、返信を行います。 maildrop は標準的なメールボックスの他、Maildir 形式のメールボックスにも対応できます。また、メール配送のために下記のモードを搭載しています。 ● マニュアルモード - maildrop [ファイルパス] として指定された場合 maildrop が上記方法で指定された場合、[ファイルパス] で指示されたファイルを読み込み、そこに書かれた指示に従います。 もしメッセージが明示的に転送、バウンズ、削除、もしくは指定のメールボックスに配送されない場合、ユーザのメールボックスに配送されます。.qmail からmaildrop を利用する場合はこのモードを利用します。 ※ 注意 ) MailBox 形式のユーザーのメールボックスへ配送されることに注意! ● 配送モード - maildrop として指定された場合 配送モードは既存のローカルメールエージェントに置き換える目的で利用します。maildropは、カレントディレクトリをユーザのホームディレクトリに変更し、/etc/courier/maildroprcを読み込み、次に$HOME/.mailfilterを読み込みます。 ※ 注意 ) maildrop をqmail と連動して利用する場合、ユーザーのホームディレクトリは、通常、qmail のassign ファイルに記載されたUID ユーザーのホームディレクトリをさします。つまり、$HOME = assign ファイルに記載されたUID ユーザーのホームディレクトリとなります。 #--------------------------------------------------------------------------------------------- # bogofilter+kakasi+maildrop インストール方法 #--------------------------------------------------------------------------------------------- bogofilter、kakasi、maildrop のソースをインターネットよりダウンロード後、ソースを解凍します。 # su root # cd /usr/local/src/ # wget kakasi-2.3.4.tar.gz # wget bogofilter-0.93.1.tar.gz # wget maildrop-1.7.0.20041104.tar.bz2 ソースを解凍後、ディレクトリに入りインストール作業を行います。 ↓ kakasi をインストール # tar zxvf kakasi-2.3.4.tar.gz # cd kakasi-2.3.4 # ./configure --prefix=/usr/local/kakasi # make # make install ↓ bogofilter をインストール # tar xzvf bogofilter-0.93.1.tar.gz # cd bogofilter-0.93.1 # ./configure --prefix=/usr/local/bogofilter # make # make install # cd /usr/local/bogofilter/etc # cp bogofilter.cf.example bogofilter.cf ← bogofilter の設定ファイルを作成する ↓ maildrop をインストール # tar jxvf maildrop-1.7.0.tar.bz2 # cd maildrop-1.7.0 # ./configure --prefix=/usr/local/maildrop --with-etcdir=/usr/local/maildrop/etc \ --enable-trusted-users='root' --enable-trusted-groups='root' --enable-restrict-trusted=0 \ --enable-use-dotlock=0 --enable-syslog=1 --enable-maildirquota \ --enable-maildrop-uid=root --enable-maildrop-gid=root # make # make install # make install-configure ※ maildrop のconfigure について ※ maildrop はconfigure オプションによって様々な動作をします。下記のうち、必要なオプションのみを./configure で指定してください。 ● -d オプションの利用に関して --enable-restrict-trusted=[0|1] | -d オプションを利用できるユーザー、グループを制限する | か? | 0:利用しない 1:利用する --enable-restrict-users='...' | -d オプションを利用するユーザーをカンマ区切りで複数記 | 載する --enable-restrict-groups='...' | -d オプションを利用するグループをカンマ区切りで複数記 | 載する maildrop には、別ユーザーで.mailfilter を読む-d オプションが存在するが、qmail では通常qmail-local 経由でmaildrop が利用されるため、セットする必要はない。ただ、セキュリティーも問題を考慮して、maildrop をroot 以外のユーザー権限とし、-d オプションを利用できるユーザーをroot のみに限定する。 ● ロックファイルの扱いについて --enable-use-dotlock=[0|1] | maildrop 利用中、ロックファイルを作成するか? | 0:利用しない 1:利用する maildrop では、MailBox 形式のメールボックスの利用を考慮し、処理中に排他処理を行うためロックファイルを生成する。 ● maildrop プログラムの実効権限について --enable-maildrop-uid | maildrop プログラムの実効ユーザーID --enable-maildrop-gid | maildrop プログラムの実効グループID maildrop では、ケースによっては新規にMailBox 形式のメールボックスを作成したり、ロックファイルを作成する。この時に使われる実効権限をオプションにて指定することができます。 ● maildirsize によるクォータ対応について maildrop では、maildirsize によるクォータに対応しています。--enable-maildirquota オプションをつけることで、maildrop がアカウントメールボックスにメールを配送する際に、maildirsize を更新するようになります。 #--------------------------------------------------------------------------------------------- # bogofilter に学習させよう #--------------------------------------------------------------------------------------------- ● bogofilter のグローバル設定 bogofilter の動作に関する設定は/usr/local/bogofilter/etc/bogofilter.cf に記載します。おおむね次のオプションを設定すれば動作します。 bogofilter_dir | bogofilter の文節データベースを格納するディレクトリパス user_config_file | ユーザーが設定可能なbogofiltger 設定ファイルパス ● 学習機能 SPAM メールを排除する第一歩は、bogofilte にどのようなメールがSPAM メールであるかを学習させることです。以下に、bogofilter にSPAM メール、NON-SPAM メールを学習させるコマンドを列挙します。 ↓ SPAM メールを一度に学習させる方法(spamdir にSPAM メールがあるとする) # cd spamdir # for file in ~/.mail/spam/*; do > cat $file |nkf -Zme | kakasi -w | bogofilter -sNv > done ↓ SPAM メールを単体で学習させる方法 # bogofilter -Ns < spammail ↓ SPAM ではないメールを一度に学習させる方法(spamdir にSPAM メールがあるとする) # cd spamdir # for file in ~/.mail/spam/*; do > cat $file |nkf -Zme | kakasi -w | bogofilter -nSv > done ↓ SPAM でないメールを単体で学習させる方法 # bogofilter -Sn < goodmail また、コマンドライン上でbogofilter にメールを読ませ、SPAM メールチェックを行わせることもできます。 # bogofilter -vI mail X-Bogosity: Ham の場合はSPAM メールでないとして判断されています。 X-Bogosity: Spam の場合はSPAM メールとして判断されています。 上記コマンドによって学習されたbogofilter のデータベースは/usr/local/bogofilter/wordlist/wordlist.db に記憶されます。 ● SPAM フィルターで用いるそれぞれのプログラムの引数について > nkf プログラムの引数 -Z X0208中の英数字と若干の記号をASCIIに変換する。 -m MIME を解読する。 -e EUCコードを出力する。 > kakasi プログラムの引数 -w 分かち書きをします。 ※ kakasi は-w オプションをつけ、実行すると標準入力された内容の分かち書きを実行するようです > bogofilter プログラムの引数 -s 入力されたものをSPAM辞書に登録 -n 入力されたものを普通メール辞書に登録 -S 入力されたものをSPAM辞書から削除 -N 入力されたものを普通メール辞書から削除 -v 詳細情報の表示 -u 判定したメールを自動的に反映(辞書に登録) -l syslog に記憶 -p メールヘッダにX-Bogosity: を付加する -e bogofilter の終了コードを0 とする #--------------------------------------------------------------------------------------------- # メール配送時のフィルター設定 #--------------------------------------------------------------------------------------------- SPAM メールであるか、NON-SPAM メールであるかの判断は、実際にメールがローカルユーザーに配送される際に行います。ローカルユーザーに配送する処理はqmail-pop3d が行うので当然、フィルタールールは.qmail ファイルに記載することになります。 maildrop を.qmail 内で利用するので、maildrop はマニュアルモードで動作させます。.qmail にはmaildrop によるフィルターを行う旨を記載し、.mailfilter にはアカウントごとのフィルター条件を記載します。 ここでは、例として次のドメイン、アカウントによる設定を行います。 ドメイン : spicy-islands.com アカウント : test メールホーム : /var/vpopmail/spicy-islands.com/test ↓ .qmail の中身 ------------------------------------------- |/usr/local/qmail/bin/maildrop /var/vpopmail/spicy-islands.com/test/.mailfilter ------------------------------------------------------------ ※ 注意 ) maildrop の引数に.mailfilter のみを指定してはいけません。この場合はqmail の配送するアカウント(/usr/local/qmail/users/assign に記載されたアカウント) のホームディレクトリの.mailfilter を読み込んでしまいます。 ↓ .mailfilter の中身 -------------------------------------- NKFPRG=/usr/bin/nkf FORMAILPRG=/usr/local/qmail/bin/reformail KAKASIPRG=/usr/local/kakasi/bin/kakasi BOGOFILTERPRG=/usr/local/bogofilter/bin/bogofilter # フィルターログを記憶する logfile "./.filter_log" # bogofilter 実行部を作成する BOGOEXEC=`$NKFPRG -Zme |$KAKASIPRG -w | $BOGOFILTERPRG -ep | $FORMAILPRG -X 'X-Bogosity:'` # SPAM メール判断を行う xfilter "$FORMAILPRG -i '$BOGOEXEC'" # SPAM メールは.spam ボックスに配送する if (/^X-Bogosity: Spam, tests=bogofilter/:h ) { to "./Maildir/.spam/" } # HTML メールは.html ボックスに配送する if ( /content\-type:.*text\/html.*/:w ) { to "./Maildir/.html/" } # 韓国語/中国語のみのメールは.spam ボックスに配送する if ( /content\-type:.*charset=.*(ks_c_5601-1987|euc-kr|gb2312|big5).*/:w ) { to "./Maildir/.spam/" } to "./Maildir/" ------------------------------------------------------------ ↓ maildroprc の中身 --------------------------------------- NKFPRG=/usr/bin/nkf FORMAILPRG=/usr/local/qmail/bin/reformail KAKASIPRG=/usr/local/kakasi/bin/kakasi BOGOFILTERPRG=/usr/local/bogofilter/bin/bogofilter # フィルターログを記憶する logfile "./.filter_log" # bogofilter 実行部を作成する BOGOEXEC=`$NKFPRG -Zme |$KAKASIPRG -w | $BOGOFILTERPRG -ep | $FORMAILPRG -X 'X-Bogosity:'` # SPAM メール判断を行う xfilter "$FORMAILPRG -i '$BOGOEXEC'" # SPAM メールは.spam ボックスに配送する if (/^X-Bogosity: Spam, tests=bogofilter/:h ) { to "./Maildir/.spam/" } ------------------------------------------------------------