前記事: Server: CentOS 5.2 になったら Amavisd-new が起動しなくなった

根本的には Compress::Zlib や amavisd-new のバージョン依存関係をどうにかするべきなのですが、最近公私ともども忙しく、一刻も早くセカンダリメールサーバによる片肺飛行の状態を脱出して、とりあえずでいいからプライマリメールサーバを復旧させないといけません。さてどうしたものか。

よし、amavisd-new 自体を使うのをやめよう!

というわけで、メールサーバ postfix から amavisd を呼んでいる部分をコメントアウトし、

# content_filter = smtp-amavis:[127.0.0.1]:xxxxx

postfix を再起動 (/etc/init.d/postfix restart) した後、2つの方法を取りました。

amavisd-new の代わりに procmail 経由で clamscan をかける (おすすめ度: 中)

procmail はメールプロセッサで、ありがちな例では、メールの内容に従ってサーバサイドで IMAP フォルダに振り分けたり、簡単な Spam 処理をしたり、spamassassin と連携させたりするのに使われています。

で、これを使って受信時に有無を言わさず clamscan でウィルスチェックさせてしまおうと。

/etc/procmailrc に次の行を挿入します。

:0 HB
*? /usr/bin/clamdscan –log=$HOME/clamscan.log –quiet – ;test $? = “1”
/dev/null

得てして、Spam フォルダへの下記のような振り分けルールなどが書いてあると思うので、それよりもに入れる必要があります。

  • :0 HB … ヘッダとボディ両方ともチェックする
  • /usr/bin/clamdscan … clamd が動いていることが前提。無い場合は clamscan でも問題はないが、遅くなります。
  • ? … 指定したプログラムの終了コードを利用する
  • –quiet … エラー情報のみ出力
  • –log … ログファイルを指定。各ユーザのホームディレクトリ上にとりあえず。/var/log/clamav 以下に残すとか、管理上のことを考えて “らしく” したかったのですが、まずは無難に動く路線で 🙂
  • test $? = “1” … 戻り値が 1 の時に真を返す。clamav は戻り値が 1 のとき、1つ以上のエラーを見つけたという意味になります。
  • /dev/null … 該当するメールを削除する。他にも消さずに特定のフォルダに分けるなど、その辺はお好みで。

こちらのページを参考にさせていただきました。

ndiki Clam AntiVirus + procmail でウイルス除去 (2004-12-11) 

定期的に Maildir のみウィルスチェックする (おすすめ度: 微妙)

力業です。数分おきにメールの受信フォルダや Spam フォルダだけを、10分おきなどに集中的にウィルスチェックするスクリプトを組んでおく、というものです。当然ですが、次にウィルスチェックされるまでの隙にウィルスを含むメールを受信してしまったらアウトです。さらに、IMAP フォルダが大きくなればなるほど重いです。

実はこのスクリプト、amavisd-new がまともに動作しているときにもフェイルセーフとして動かしていたりします。amavisd-new でどうもフィッシング関連のメール ((例: HTML.Phishing.Bank, Phishing.Heuristics.Email.SpoofedDomain)) は除外できないようなので。