スパム対策(「Procmail」+「SpamAssassin」)

スパムメール対策の為、「Procmail」と「SpamAssassin」を導入します。
なお、「SpamAssassin」はスパムメールの判定を行うのみであり、振り分けは「Procmail」が行います。
その為、「Procmail」のみでもきちんとレシピ(ルール)を作成すればスパム対策は出来ますので、その方法も記述します。

「Procmail」の設定

「.procmailrc」ファイルの設定

メールを振り分けるルールを決める為にレシピを設定します。
なお、ここでは簡単なレシピのみ記述しています。
詳しくはネット等で調べて下さい。

Solaris% vi ~/.procmailrc <= 設定ファイルの作成
PATH=/bin:/usr/bin:/usr/local/bin:/opt/sfw/bin <= パスの設定
MAILDIR=$HOME/Maildir <= メールディレクトリへのパス
DEFAULT=$MAILDIR/ <= 下記配送条件にマッチしなかった時の配送先
LOGFILE=$MAILDIR/procmail.log <= ログの保存先を指定
BLACKLIST=$HOME/.blacklist <= ブラックリストファイルを指定
SPAM=$MAILDIR/.spam <= スパムメールの保存先を指定

# 未承諾広告対策
:0
* ^Subject:.*iso-2022-jp
* ^Subject:\/.*
* ? echo "$MATCH" | nkf -meZ2 | grep '未承諾広告'
$SPAM

# 特定のアドレスからの迷惑メール対策
:0
* ^From:.*hoge@hogehoge.com
$SPAM

# ブラックリスト対策
:0
* ? test -s $BLACKLIST
* ? formail -x From: -x Reply-To: -x Sender: -x From | fgrep -iqf $BLACKLIST
/dev/null

スパムメール保存用のディレクトリを作成します。

Solaris% mkdir ~/Maildir/.spam

新規ユーザ作成時もディレクトリが作成されるようにします。

Solaris# mkdir /etc/skel/Maildir/.spam

ブラックリストファイルの作成

ブラックリストファイルは拒否したいアドレスを、1つに付き1行に記述します。

Solaris% vi ~/.blacklist <= ブラックリストファイルの作成
foo@hogehoge.com
foo@hoge.com

「.forward 」ファイルの設定

ローカルユーザに届いたメールを「Procmail」に渡すようにします。

Solaris% vi ~/.forward <= 設定ファイルの作成
"|IFS=' ' && exec /opt/sfw/bin/procmail -f- || exit 75 #username<= usernameにはユーザ名を指定
「SpamAssassin」のインストール

「SpamAssassin」を「CPAN」からインストールします。
なお、初めて「CPAN」を実行すると初期設定を行うことになります。
「CPAN」の設定についてはこちらを参照して下さい。

必要なモジュールのインストール

まず、「SpamAssassin」のインストールに必要なモジュールをインストールします。

Solaris# perl -MCPAN -e shell <= 「CPAN」の実行
Terminal does not support AddHistory.

cpan shell -- CPAN exploration and modules installation (v1.7601)
ReadLine support available (try 'install Bundle::CPAN')

「Digest::SHA1」のインストール
cpan> install Digest::SHA1


「HTML::Parser」のインストール
cpan> install HTML::Parser

「SpamAssassin」のインストール

Solaris# perl -MCPAN -e shell <= 「CPAN」の実行
Terminal does not support AddHistory.

cpan shell -- CPAN exploration and modules installation (v1.7601)
ReadLine support available (try 'install Bundle::CPAN')

cpan> install Mail::SpamAssassin <= 「SpamAssassin」のインストール

What email address or URL should be used in the suspected-spam report
text for users who want more information on your filter installation?
(In particular, ISPs should change this to a local Postmaster contact)
default text: [the administrator of that system] <= 空Enter
「SpamAssassin」の起動

「SpamAssassin」のプロセスIDを格納するディレクトリを作成します。

Solaris# mkdir /var/run/spamd

「SpamAssassin」の起動

「SpamAssassin」の出力するログと、プロセスIDを格納するファイルを指定して起動します。

Solaris# /usr/perl5/bin/spamd -s /var/log/spamd.log -d -r /var/run/spamd/spamd.pid

「SpamAssassin」の自動起動

「SpamAssassin」用の起動スクリプトを作成し、ランレベル2,3の時に自動起動するようにします。

Solaris# vi /etc/init.d/spamassassin <= 起動スクリプトファイルの作成
#!/sbin/sh

PIDDIR='/var/run/spamd'
PIDF='/var/run/spamd/spamd.pid'
PID=`/usr/bin/ps -aef | /usr/bin/grep spamd | /usr/bin/grep -v grep | /usr/bin/awk '{print $2}'`
TMPPID=`/usr/bin/echo $PID | /usr/bin/awk '{print $1}'`

case "$1" in
'start')
        if [ -f /usr/perl5/bin/spamd ]; then
            if [ $TMPPID ]; then
                echo "SpamAssassin has started"
            else
                if [ ! -d $PIDDIR ]; then
                    /usr/bin/mkdir -p $PIDDIR
                fi
                /usr/perl5/bin/spamd -d -c -H -s /var/log/spamd.log -r $PIDF
                echo "Running: SpamAssassin"
            fi
        fi
        ;;

'stop')
        if [ $TMPPID ]; then
            if [ -f $PIDF ]; then
                kill `/usr/bin/cat $PIDF`
                echo "Stopping: SpamAssassin"
            else
                /usr/bin/echo "$PID" | while read LINE
                do
                    kill $LINE > /dev/null 2>&1
                done
                echo "Stopping: SpamAssassin"
            fi
        else
            echo "SpamAssassin has stopped"
        fi
        ;;

'restart')
        $0 stop
        sleep 3
        $0 start
        ;;

'status')
        if [ $TMPPID ]; then
            echo "SpamAssassin starts"
        else
            echo "SpamAssassin stopped"
        fi
        ;;

*)
        echo "Usage: $0 { start | stop | restart | status}"
        exit 1
        ;;

esac
exit 0


Solaris# chmod 744 /etc/init.d/spamassassin <= 起動スクリプトに実行権限付加
Solaris# ln /etc/init.d/spamassassin /etc/rc2.d/S89spamassassin <= ランレベル2で起動する
Solaris# ln /etc/init.d/spamassassin /etc/rc3.d/S89spamassassin <= ランレベル3で起動する
Solaris# ln /etc/init.d/spamassassin /etc/rc0.d/K35spamassassin <= ランレベル0で停止する
「SpamAssassin」の設定

「SpamAssassin」の設定

「SpamAssassin」はデフォルトでは日本語のスパムメールには対応していませんので、 TLECさんが作成された定義ファイルを利用させて頂きます。
なお、定義ファイルは全ユーザに適用されるものは
/etc/mail/spamassassin/local.cf
になり、ユーザごとに適用されるものは
~/.spamassassin/user_prefs
になります。
ここでは、ユーザごとに設定するようにしていますが、学習結果を共有する設定も記述しています。
また、ユーザごとに適用される定義ファイルの格納ディレクトリは、最初に「SpamAssassin」が機能したときに作成されます。
その為、もしディレクトリが無い場合は作成する必要があります。

Solaris# mkdir /etc/mail/spamassassin
Solaris# vi /etc/mail/spamassassin/local.cf <= 設定ファイルの作成
allow_user_rules 1 <= 追加(ユーザごとのルールを有効にする)


Solaris# exit <= 一般ユーザになる
Solaris% wget http://tlec.linux.or.jp/docs/user_prefs <= 定義ファイルのダウンロード
Solaris% mv user_prefs ~/.spamassassin/user_prefs <= ダウンロードした定義ファイルの移動

Solaris% vi ~/.spamassassin/user_prefs <= 設定ファイルの編集
required_score 13.0 <= スパムと判断する閾値を指定

report_safe 0 <= 追加(スパムメールを添付形式にしない)

ホワイトリストの設定(必要なだけ記述)
whitelist_from *@hoge.com
whitelist_from *@fuga.com
ここまで

ブラックリストの設定(必要なだけ記述)
blacklist_from *@hoge.org
blacklist_from *@fuga.org
ここまで

学習結果を共有する場合、以下を追加
bayes_path /etc/mail/spamassassin/bayes/bayes
bayes_file_mode 0666
auto_whitelist_path /etc/mail/spamassassin/bayes/auto-whitelist
auto_whitelist_file_mode 0666
ここまで

学習結果を共有する場合は、必要なディレクトリを作成してから「SpamAssassin」を再起動し、設定を反映させます。

Solaris# mkdir -p /etc/mail/spamassassin/bayes <= 学習結果を共有するディレクトリを作成
Solaris# chmod 777 /etc/mail/spamassassin/bayes <= 学習結果を共有するディレクトリの権限を変更

Solaris# /etc/init.d/spamassassin restart <= 「SpamAssassin」の再起動

「Procmail」の設定

「SpamAssassin」用の設定を「Procmail」の上記で設定したファイルに追加します。
なお、ここではスパムメール受信専用のユーザを作成し、スパムメールを配送しています。

Solaris% vi ~/.procmailrc <= 設定ファイルの編集
# 「SpamAssassin」対応
:0 fw
| /usr/perl5/bin/spamc

:0
* ^X-Spam-Status: Yes
!spam@crimson-snow.net

スパムメール受信専用ユーザの作成

Solaris# groupadd spam
Solaris# useradd -g spam -d /export/home/spam -m spam
「SpamAssassin」の学習

spamユーザでメールを確認し、スパムメールかどうかの判定を行います。
誤認識された正常メールがある場合、指定したディレクトリに移動させ、学習させます。
その為、IMAPで受信するか、POP3で受信するならサーバ側にメールを残すようにします。
また、スパムメールがユーザに配送された場合、スパムメールとして学習させますが、 クライアント側に取り込んでしまいますと学習出来ません。
その為、こちらもIMAPで受信するか、POP3で受信するならサーバ側にメールを残すようにします。

正常メールをスパムメールと判定した場合

正常メールを格納する為のディレクトリを作成します。

Solaris# mkdir /export/home/spam/Maildir/.ham

上記で作成したディレクトリに正常メールを移動させます。
移動は普通にmvコマンドで移動させます。
その後、正常メールであることを学習させます。

Solaris# /usr/perl5/bin/sa-learn --ham /export/home/spam/Maildir/.ham <= 誤認識された正常メールの学習
Solaris# /usr/perl5/bin/sa-learn --sync <= ジャーナルをDBに反映させる

スパムメールを正常メールと判定した場合

スパムメールを格納する為のディレクトリを作成します。
なお、このディレクトリは「Procmail」の設定時に作成したディレクトリを使用していますので、 すでに作成されている場合、この作業は必要ありません。

Solaris# mkdir /export/home/spam/Maildir/.spam

上記で作成したディレクトリにスパムメールを移動させます。
移動は普通にmvコマンドで移動させます。
その後、スパムメールであることを学習させます。

Solaris# /usr/perl5/bin/sa-learn --spam /export/home/spam/Maildir/.spam <= 誤認識されたスパムメールの学習
Solaris# /usr/perl5/bin/sa-learn --sync <= ジャーナルをDBに反映させる
データベースの肥大化対策

「SpamAssassin」を運用しているとデータベースの容量が日々増えていきますが、 マシンの性能によっては容量の増加により処理が追いつかなくなり、タイムアウトになって正しく処理が行われないケースが発生します。
また、容量が大きくなった場合に自動でエクスポートが行われますが、マシンの負荷とは無関係に行われるので、これらの対策を行います。

「SpamAssassin」の設定

Solaris% vi ~/.spamassassin/user_prefs <= 設定ファイルの編集
以下を追加
bayes_expiry_max_db_size 1000000 <= データベースの最大値(この値の75%を越えると自動的にエクスポートが行われる)
bayes_auto_expire 0 <= データベースのエクスポートを自動で行わない

エクスポートプロセスの実行

エクスポートプロセスを実行したい「SpamAssassin」のデータベースの所有ユーザで実行します。

Solaris% /usr/perl5/bin/sa-learn --sync --force-expire

cronに登録してマシンの負荷の少ない時間に実行します。

Solaris% crontab -e <= cronの編集
0 5 * * * /usr/perl5/bin/sa-learn --sync --force-expire > /dev/null 2>&1 <= 追加
▲ページのトップへ