SYSTEM,WEB,MOBILE and DESIGN
お知らせ,サーバー・インフラ,技術ログ

はじめまして。サーバ初心者が会社のメールサーバを触わる機会をいただきまして、スパムメール対策の設定を加えることになったので、その記録を残したいと思います。

メールサーバと環境

社内の環境をAWSに移行してからEC2上でAmazonLinuxを利用しています。メールサーバはpostfixを利用しており、postfixにバーチャルドメインを構築し、バーチャルメールボックスによって作成した仮想的なアカウントに、メールをポストしています。受信メールサーバがPOPなので、IMAPと設定が異なる部分があることに注意が必要です。

 

Procmail+SpamAssassin

procmailはメールの配送をしてくれるアプリケーションです。postfixとprocmailを連携することで、メールの配送をprocmailに任せることができます。 SpamAssassinはメールを読み込みスパムメールかどうかを判定してくれるアプリケーションです。スパム判定を受けたメールの件名に「SPAM」のような文字列を加えてprocmailに返し、procmailに「SPAM」の文字列の入った件名のメールを削除、または別の受信BOXに配送するような処理を加えます。 今回の目的は、postfixからメールの配送をprocmailに任せ、SpamAssassinによるフィルタを通してスパムを撃退し、必要なメールだけ配送されるように設定することです。

 

インストール手順

procmailのパスを確認をします。

# which procmail

 

今回はprocmailがインストールされていましたが、インストールされていない場合は、

# yum -y install procmail

 

次にSpamAssassinをインストールします。

# yum -y install spamassassin

 

 

SpamAssassinの設定

初期設定では日本語のスパムメールには対応していないので、日本語に対応した設定ファイルをセットアップします。

[root@centos ~]# vi /etc/mail/spamassassin/v310.pre
# TextCat – language guesser
#
loadplugin Mail::SpamAssassin::Plugin::TextCat ←コメントアウトを外してTextCatを有効化

 

SpamAssassinの設定ファイルの最新化スクリプトを作成します。

[root@centos ~]# vi spamassassin-update
#!/bin/bash
#SpamAssassinの最新版の設定ファイルをダウンロード
cd /etc/mail/spamassassin
wget -qN http://www.flcl.org/~yoh/user_prefs
#設定ファイルの更新時にSpamAssassinを再起動するように設定
diff user_prefs user_prefs.org > /dev/null 2>&1
if [ $? -ne 0 ]; then
cp user_prefs local.cf
# スパムと判断したメールを添付形式にしないように設定
echo “report_safe 0” >> local.cf
# スパムと判断したメールの件名に「***SPAM***」を付加するように設定※受信メールサーバーがPOPの場合のみ
echo “rewrite_header Subject ***SPAM***” >> local.cf
# SpamAssassinを再起動
if [ -f /etc/rc.d/init.d/spamassassin ]; then
/etc/rc.d/init.d/spamassassin restart > /dev/null
else
systemctl restart spamassassin > /dev/null
fi
fi
cp user_prefs user_prefs.org

 

SpamAssassinの設定ファイル最新化スクリプトへ実行権限を付加します。

# chmod +x spamassassin-update

 

SpamAssassinの設定ファイル最新化スクリプトを実行します。

# ./spamassassin-update

 

SpamAssassinの設定ファイル最新化スクリプトを毎日自動実行されるディレクトリへ移動します。

# mv spamassassin-update /etc/cron.daily/

 

SpamAssassinのルールを自動更新するcronを設定します。

# vi /etc/cron.d/sa-update
10 4 * * * root /usr/share/spamassassin/sa-update.cron 2>&1 | tee -a /var/log/sa-update.log ←行頭のコメントアウトをはずす

 

 

postfixとprocmailの設定

postfixとprocmailの連携させるための設定を行います。※ここからは設定にミスがあると、メールが届かなくなる恐れがありますので、必ず設定ファイルのバックアップを取っておきます。

[root@centos~]# cp /etc/postfix/main.cf /etc/postfix/main.cf.bak

 

procmailの設定

procmailrcを新規作成します。ここで重要なのは、配送するメールの保存先として、正しいディレクトリを指定することです。保存先を間違えてしまうとメールが届かなくなる恐れがあるので、環境に合った保存先を指定する必要があります。

[root@centos ~]# vi /etc/procmailrc
SHELL=/bin/bash
PATH=/usr/bin:/bin
DROPPRIVS=yes
MAILDIR=/var/spool/virtual/$DOMAIN/$USER ←環境にあったディレクトリの指定が必要
DEFAULT=$HOME/var/spool/virtual/$DOMAIN/$USER ←環境にあったディレクトリの指定が必要
SPAM=$MAILDIR/.Spam/
LOGFILE=$HOME/.procmail.log # ログ出力先
VERBOSE=ON # 詳細ログ出力
# SpamAssassinによるスパムチェック
:0fw
|/usr/bin/spamc
# SpamAssassinにより判定されたSpam-Levelが一定値(ここでは20)以上の場合は削除
# ※20の設定値は高いので必要なメールまで削除されてしまうことに留意すること
# 最後に動作テストを行う関係で以下をコメントアウトしています
#:0 
#* ^X-Spam-Level: 20
#/dev/null

 

procmailのログローテーションの設定ファイルを作成し、ログの肥大化を防ぎます。

[root@centos ~]# vi /etc/logrotate.d/procmail
/home/*/.procmail.log {
missingok
nocreate
notifempty
}

 

 postfixの設定

ここからは、バーチャルドメイン、バーチャルメールボックスの設定に合わせて、procmailとの接続とメールの配送先を指定する必要があります。まずはmain.cfを編集します。

# vi /etc/postfix/main.cf
# virtual_transport = virtual  ←コメントアウト
virtual_transport = procmail ←追記
procmail_destination_recipient_limit = 1 ←追記

 

次にmaster.cfを編集します。

# vi /etc/postfix/master.cf
#以下を追記
procmail unix – n n – – pipe
flags=R user=vuser argv=/usr/bin/procmail -t -m USER=${user} DOMAIN=${nexthop} /etc/procmailrc

 

postfixを再起動します。

# /etc/rc.d/init.d/postfix restart

 

■ 動作テスト

自分自身宛にスパムメールを送ってみます。メール本文に「XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X」という文字列を記載して送ります。 postfixとprocmailが連携していて、SpamAssassinが正常に動作していれば、メールの件名の先頭に、「***SPAM***」の文字列が追加されているはずです。procmailの設定ファイルのSPAMを削除するための設定からコメントアウトを外せば、実際にスパムメールは削除されます。  

 

 

SpamAssassinの学習機能

SpamAssassinは稀にスパムメールの誤認識をします。大切なメールをスパム判定したり、スパム判定してほしいメールをスパム判定しなかったり。そこで残したいメールやスパムメールを読み込むことで、SpamAssassinに学習させることができます。

 

spamを学習させる

sa-learn –spam [ファイル又はフォルダ]

 

non-spamを学習させる

sa-learn –ham [フォルダ又はフォルダ]

 

 

【まとめ】

procmailにメール振り分けのロジックを加えると、特定ユーザにはスパムメールが届かないようにすることもできました。正規表現で件名に「SPAM」の文字列の入ったメール以外のメールを配送するようにします。環境に合わせたカスタマイズで上手にフィルタリングをすることで、必要なメールだけ受け取ることが可能です。

今回メールサーバを触ってみて、設定ミスによるメールが配送されなくなる怖さと、設定ファイルのバックアップの大切さを学ぶことができ、便利な反面、落とし穴も多い、、、良い経験になりました。