メールサーバーを運用する上で、スパム対策と並んで重要なのがウイルス対策です。
今回は、MTAである「Postfix」とアンチウイルスソフト「ClamAV」を連携させ、メールの送受信時に自動でウイルスチェックを行うための設定手順をまとめました。
連携には clamav-milter という仕組みを利用します。
前提条件
- ClamAV がインストール済で、手動スキャンが可能な状態であること。
- Postfix がインストール済で、通常のメール送受信が可能な状態であること。
1. clamav-milter のインストール
まずは連携用のパッケージである clamav-milter をインストールします。
apt-get install clamav-milter2. 設定ファイルの編集
各種設定ファイルを編集し、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 = accept3. 起動スクリプトの修正(パーミッション対策)
ここが一番のハマりポイントです。 ソケットファイル(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-Status や X-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. 起動スクリプトの修正」の chgrp と chmod が正しく実行されているか、再度確認してみてください。