Postfix の設定に関しては当サイトの「 Postfix2 で SMTP-AUTH 」で、
Procmail に関しては当サイトの「 Procmail でメールフィルタ 」で、
Postfix で IMAP の利用に関しては当サイトの「 IMAP の導入 」で解説していますので、併せてご覧ください。
SpamAssassinでスパム対策
独自ドメインでのメールアドレスを運用していると驚くのがスパムメール、つまり迷惑メールの数の多さです。
1日に来るメールの 98% 位は迷惑メールです。
スパムメールは儲かるから減らないと言いますが、うっとうしいだけなので(やっと)対策を講じてみます。
使用するのは「SpamAssassin」という何とも頼もしい名前のアンチ・スパム・ツールを使用します。
なお、前提条件として、以下のメールシステムを前提としています。
Postfix の設定に関しては当サイトの「 Postfix2 で SMTP-AUTH 」で、
Procmail に関しては当サイトの「 Procmail でメールフィルタ 」で、
Postfix で IMAP の利用に関しては当サイトの「 IMAP の導入 」で解説していますので、併せてご覧ください。
ページ内コンテンツ一覧
大まかにはメールサーバがメールを受信したらメールフィルタを動作させ、その結果によって通常のメールかスパムメールかを判定させるという流れになります。
現状のシステムと今回目標とする 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 形式で作成します。
これはお使いの環境によってパスとかが異なると思いますので、ご自分の環境に読みかえて作成してください。
スパムメール保存用のディレクトリ「.Spam」を Maildir 形式で作成します。
作成には対象のユーザで行います。(例ではユーザ名を「 username 」とします)
対象のユーザになる
# su username
ホームディレクトリに移動
$ cd ~
「.Spam」という名のディレクトリを作成
$ /usr/sbin/maildirmake -f .Spam Maildir
この項目は当サイト内の「 Procmail でメールフィルタ 」でも解説しています。
Procmail の設定に入ります。
下記の設定例の環境のパスやディレクトリ名とご自分の環境のパス、ディレクトリ名を間違えずに読み替えてください。
ちなみに Procmail の設定は完了しているものとします。
もう分かりきっているとは思いますが、
これからの設定をメールフィルタの全体をつかさどる「 /etc/procmailrc 」に記述すると全ユーザに適応されます。
各ユーザ個別のメールフィルタファイルである「 /home/username/.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/
この項目も当サイト内の「 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 にも通常のメールをスパムと判定してしまうことが無きにしも非ずらしいので、スパム判定後に強制的に削除するのは少々危険です。
一度目を通してから手動で削除することをおすすめいたします。