Linux で自宅サーバ [ Home Server Techncial ]

>>トップページに戻る

 SpamAssassinでスパム対策

独自ドメインでのメールアドレスを運用していると驚くのがスパムメール、つまり迷惑メールの数の多さです。
1日に来るメールの 98% 位は迷惑メールです。

スパムメールは儲かるから減らないと言いますが、うっとうしいだけなので(やっと)対策を講じてみます。

使用するのは「SpamAssassin」という何とも頼もしい名前のアンチ・スパム・ツールを使用します。

なお、前提条件として、以下のメールシステムを前提としています。

Postfix の設定に関しては当サイトの「 Postfix2 で SMTP-AUTH 」で、
Procmail に関しては当サイトの「 Procmail でメールフィルタ 」で、
Postfix で IMAP の利用に関しては当サイトの「 IMAP の導入 」で解説していますので、併せてご覧ください。

ページ内コンテンツ一覧

▲ページの最上部に戻る

 大まかな処理の流れ

大まかにはメールサーバがメールを受信したらメールフィルタを動作させ、その結果によって通常のメールかスパムメールかを判定させるという流れになります。
現状のシステムと今回目標とする SpamAssassin を利用したシステムの処理フローを下に示します。

  1. Postfix ( MTA ) が メールを受信
  2. Postfix が Procmail にメールを渡す
  3. Procmail が SpamAssassin を呼び出し、メールにフィルタリング処理を行う
  4. SpamAssassin の処理結果によって Procmail がメールを処理
  5. スパムと判定されれば Procmail がゴミ箱ディレクトリへメールを格納

といった具合です。
スパムに判定されれば強制的に削除してもいいのですが、誤判定の心配があります。
それと、SpamAssassin にスパムメールを学習させるためにも有効なので、とりあえずはスパムメール用のディレクトリに保存することにします。

▲ページの最上部に戻る

 SpamAssassin のインストールと設定

では早速 SpamAssassin のインストールを行います。
、といっても apt を利用するので、以下のコマンドで一発インストールされます。

apt が利用するデータベースをアップデート
# apt-get update
spamassassin をインストール
# apt-get install spamassassin

これでインストールはオッケーです。

続いて SpamAssassin の設定に入るのですが、Web 上のドキュメントなどを見ていると、「 /etc/mail/spamassassin/local.cf 」があるはずなのですが、ありません。
そのかわり(?)に「 /usr/doc/spamassassin-2.64/sample-japanese-local.cf 」というファイルがあったので、以下のコマンドで名前を変えてコピーします。

# cp /usr/doc/spamassassin-2.64/sample-japanese-local.cf /etc/mail/spamassassin/local.cf

他のサイトでは迷惑メールの判定に日本語対応設定を入れいている場合があるのですが、ファイル名に「 japanese 」とあるので、とりあえず日本語対応できているっぽい感じです。
それから、どうやらこのまま使っても問題ないようなので、このまま特に追加設定をせずデフォルトで使ってみたいと思います。

▲ページの最上部に戻る

 スパムメール保存用 Maildir の作成

スパムメールを保存するためのディレクトリを Maildir 形式で作成します。
これはお使いの環境によってパスとかが異なると思いますので、ご自分の環境に読みかえて作成してください。

スパムメール保存用のディレクトリ「.Spam」を Maildir 形式で作成します。
作成には対象のユーザで行います。(例ではユーザ名を「 username 」とします)

対象のユーザになる
# su username
ホームディレクトリに移動
$ cd ~
「.Spam」という名のディレクトリを作成
$ /usr/sbin/maildirmake -f .Spam Maildir

▲ページの最上部に戻る

 Procmail の設定

この項目は当サイト内の「 Procmail でメールフィルタ 」でも解説しています。

Procmail の設定に入ります。
下記の設定例の環境のパスやディレクトリ名とご自分の環境のパス、ディレクトリ名を間違えずに読み替えてください。

ちなみに Procmail の設定は完了しているものとします。

もう分かりきっているとは思いますが、
これからの設定をメールフィルタの全体をつかさどる「 /etc/procmailrc 」に記述すると全ユーザに適応されます。
各ユーザ個別のメールフィルタファイルである「 /home/username/.procmailrc 」に記述するとそのユーザのみにフィルタが適応されます。

今回は全ユーザに適応させるために「 /etc/procmailrc 」に記述します。
エディタで「 /etc/procmailrc 」を開き、以下のように記述します。

# パスを設定 PATH=/bin:/usr/bin:/usr/local/bin # メールボックスの設定 MAILDIR=$HOME/Maildir DEFAULT=$MAILDIR/ # Procmailのログファイル出力先を指定 LOGFILE=$MAILDIR/procmaillog # ロックファイルのパスを指定 LOCKFILE=$HOME/.lockmail # メールヘッダー中に「 X-Spam-*** 」の記述がなければ spamassassin を起動します :0fw *!^X-Spam.* |spamassassin # メールヘッダー中に「 X-Spam-Status: Yes 」の記述があれば、「 .Spam 」ディレクトリにメールを格納します :0 * ^X-Spam-Status: Yes $MAILDIR/.Spam/

▲ページの最上部に戻る

 Postfix の設定

この項目も当サイト内の「 Procmail でメールフィルタ 」でも解説しています。
具体的には Postfix の設定ファイルである「 /etc/postfix/main.cf 」に以下の記述を追加します。

mailbox_command = /usr/bin/procmail

▲ページの最上部に戻る

 設定の反映と起動と動作確認

ここまでで、設定は終了です。

設定を反映させるために Postfix の再起動と、SpamAssassin の起動を行います。

SpamAssassinの起動
# /etc/rc.d/init.d/spamassassin start

Postfixの再起動
# /etc/rc.d/init.d/postfix reload

ここまでで SpamAssassin、Procmail、Postfix の設定は終了です。
ここで一度自分のドメイン宛にメールを送信してみましょう
そしてメールのヘッダーに以下のような記述があれば設定が正常に行われています
もし必要な記述がされていない場合にはもう一度設定を見直してください。

以下のヘッダーはスパムメールと判定された場合の記述です。

・・・省略・・・ X-Spam-Flag: YES X-Spam-Checker-Version: SpamAssassin 2.64 (2004-01-11) on mail.example.com X-Spam-Report: * 0.1 HTML_60_70 BODY: Message is 60% to 70% HTML * 0.0 HTML_MESSAGE BODY: HTML included in message ・・・省略・・・ X-Spam-Status: Yes, hits=8.2 required=5.5 tests=CLICK_BELOW, FORGED_RCVD_NET_HELO,HTML_60_70,HTML_FONTCOLOR_UNSAFE, HTML_IMAGE_ONLY_08,HTML_LINK_CLICK_HERE,HTML_MESSAGE,QENCTXT autolearn=no version=2.64 X-Spam-Level: ******** ・・・省略・・・

メールヘッダー中に上記の「X-Spam-***」の記述があればSpamAssassinは正常に動作しています。
X-Spam-Status: Yes 」があれば、そのメールはスパムメールだと判定されています。
逆に「 X-Spam-Status: No 」ならば通常のメールとして判定されています。

▲ページの最上部に戻る

 スパムメールの学習

SpamAssassin にはメールの学習機能があり、判定の精度を高めることができます。
というか、学習させなければ判定が甘くて使い物になりません。

以下のコマンドですべてのユーザの「.Spam」ディレクトリの中身を全てスパムメールとして学習させます。

スパムメールの学習
# /usr/bin/sa-learn --spam /home/*/Maildir/.Spam/cur
Learned from 89 message(s) (89 message(s) examined).    <-- 89通のメールをスパムメールとして学習

そして、「これはスパムメールじゃないよ」ということも、以下のコマンドで学習させてやることができます。

通常のメールの学習
# /usr/bin/sa-learn --ham /home/*/Maildir/cur
Learned from 157 message(s) (157 message(s) examined).    <-- 157通のメールを普通のメールとして学習

毎回これらのコマンドを実行するのは面倒なので、以下の簡単なスクリプトを記述し、Cron に登録します。
保存場所は「 /usr/local/bin 」などのそれっぽい場所がいいと思います。 ファイル名は適当に「 sa-learns.sh 」などにしておきましょう。
スクリプトを保存した後は、「 chmod 750 sa-learns.sh 」として実行可能なアクセス権を与えましょう。

#! /bin/sh # スパムメールの学習 /usr/bin/sa-learn --spam /home/*/Maildir/.Spam/cur # 通常のメールを学習 /usr/bin/sa-learn --ham /home/*/Maildir/cur # スパムメール保存ディレクトリの中身を強制的に消去してよいのなら以下の記述を追加 /bin/rm -f /home/*/Maildir/.Spam/cur


以下のコマンドでviエディタが起動するので、学習スクリプトを登録します
# crontab -e

例として毎日午前4時に学習スクリプトを実行します。

0 4 * * * /usr/local/bin/sa-learns.sh

最後に以下のコマンドを実行し、システム起動時に SpamAssassin を自動的に起動するように設定します。

# /sbin/chkconfig spamassassin on



以上で設定は終了です。
毎日学習させてやることにより、精度の高い判定を行ってくれることでしょう。

これで、SpamAssassin によりスパムメールに判定されたメールは全て「 Spam 」フォルダに格納されます。
一晩すれば Cron による学習コマンドも自動実行されるので、1日1回 Spam フォルダの中身を全消去してやればオッケーなわけです。
スパムメールが通常のメールと判定されても Spam フォルダに入れておけば Cron によりスパムとして学習されるという寸法です。

SpamAssassin にも通常のメールをスパムと判定してしまうことが無きにしも非ずらしいので、スパム判定後に強制的に削除するのは少々危険です。
一度目を通してから手動で削除することをおすすめいたします。

▲ページの最上部に戻る

Copyright© Home Server Technical. All Right Reserved.
webmaster@miloweb.net