技術・開発

【Postfix】ClamAVと連携してメールのウイルスチェックを行う方法(clamav-milter)

2012年9月17日

メールサーバーを運用する上で、スパム対策と並んで重要なのがウイルス対策です。
今回は、MTAである「Postfix」とアンチウイルスソフト「ClamAV」を連携させ、メールの送受信時に自動でウイルスチェックを行うための設定手順をまとめました。

連携には clamav-milter という仕組みを利用します。

前提条件

  • ClamAV がインストール済で、手動スキャンが可能な状態であること。
  • Postfix がインストール済で、通常のメール送受信が可能な状態であること。

1. clamav-milter のインストール

まずは連携用のパッケージである clamav-milter をインストールします。

apt-get install clamav-milter

2. 設定ファイルの編集

各種設定ファイルを編集し、PostfixとClamAVがソケット通信できるように連携設定を行います。

① /etc/clamav-milter.conf の編集

clamav-milter の基本設定とソケットのパスを指定します。

# 「Example」という行があればコメントアウト(または削除)する
# Example

# milterのソケットファイルの保存先を指定
MilterSocket /var/clamav/clmilter.socket

# ソケットのパーミッションを指定
MilterSocketMode 660

# 実行ユーザーの指定
User clamav

# clamd.confの「LocalSocket」と同じパスを指定する
ClamdSocket unix:/var/run/clamav/clamd

② /etc/clamd.conf の確認・編集

ClamAV本体(デーモン)側のソケットパスが、先ほど設定したものと一致しているか確認します。

# clamav-milter.confの「ClamdSocket」と同じパスになっていること
LocalSocket /var/run/clamav/clamd

User clamav

③ /etc/postfix/main.cf の編集

Postfix側に、milterを経由してメールを処理させるための設定を追記します。

# ClamAV(clamav-milter)との連携設定
milter_connect_macros = b j _ {daemon_name} {if_name} {if_addr}
milter_rcpt_macros = i j _ {daemon_name} {client_addr} {mail_addr} {rcpt_addr}

# smtpd (外部からの受信時) と non_smtpd (ローカルからの送信時) の両方でmilterを通す
smtpd_milters = unix:/var/clamav/clmilter.socket
non_smtpd_milters = unix:/var/clamav/clmilter.socket

# milterがダウンしている時の動作 (accept=とりあえず通す, reject=拒否する)
milter_default_action = accept

3. 起動スクリプトの修正(パーミッション対策)

ここが一番のハマりポイントです。 ソケットファイル(clmilter.socket)に対して、Postfixグループの書き込み権限がないと連携エラーになります。

/etc/rc.d/init.d/clamav-milter (環境によってはsystemdのユニットファイル等)の起動スクリプトを編集し、起動時に自動で権限が付与されるように追記します。

start() {
    action $"Starting ${prog}:" ${CLAMAV_MILTER} -c ${CLAMAV_MILTER_CONF}
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && touch /var/lock/subsys/clamav-milter
    
    # 以下の2行を追記し、ソケットの所有グループをpostfixに変更して書き込み権限を与える
    chgrp postfix /var/clamav/clmilter.socket
    chmod g+w /var/clamav/clmilter.socket
}

4. サービスの再起動と動作確認

設定が完了したら、関連する3つのサービスをすべて再起動して設定を反映させます。

/etc/init.d/clamd restart
/etc/init.d/clamav-milter restart
/etc/init.d/postfix restart

動作テスト

実際にテストメールを送受信してみて、受信したメールのヘッダー(ソース)を確認します。 以下のような X-Virus-StatusX-Virus-Scanned というヘッダーが追加されていれば、連携は無事に成功しています!

X-Virus-Status: Clean
X-Virus-Scanned: clamav-milter 0.97.5 at xxx.jp

トラブルシューティング

もしメールヘッダーにウイルススキャンの履歴が入っていない場合や、メールの送受信自体が遅延・失敗する場合は、/var/log/maillog などのログを確認してください。

よくあるエラー:Permission denied

warning: connect to Milter service unix:/var/clamav/clmilter.socket: Permission denied

このエラーが出ている場合、Postfixが clmilter.socket にアクセスできていません。 原因はほぼ「ソケットファイルの所有グループが postfix ではない」または「パーミッションが 660 ではない」ことです。(私の場合もグループが clamav のままになっていたため、このエラーが出ました)。

「3. 起動スクリプトの修正」の chgrpchmod が正しく実行されているか、再度確認してみてください。

-技術・開発
-, , , , , ,