ubuntu 10.04 をメールサーバーに (ウィルスチェック)

今回は Postfix で送受信するメールをウィルスチェックをするようにしたい。
ウィルスチェックソフトにも色々な種類があるが、ubuntu の標準リポジトリで提供されている Clam AntiVirus を入れることにする。

Clam AntiVirus を Postfix と連携させて、Postfix が送受信するメールをチェックするには、amavisd-new パッケージと clamav-daemon パッケージを組み合わせる方法や、clamsmtp パッケージを使う方法などがある。
ここでは、最近とみに流行の milter というシステムを利用した clamav-milter パッケージを使って、Postfix にウィルスチェックを実装する。

milter が何かについては、「milter managerによる柔軟なメールフィルタリング」の Web ページで平易に説明されているので、そちらを参照されたい。

まずは sudo aptitude update; sudo aptitude install clamav-milter コマンドを実行して、clamav-milter をインストールする。
clamav-milter を動かすのに必要で、まだインストールされていないパッケージが表示され、一緒にインストールするこか確認されたら 'y' を入力する。

続いて、milter システムの Clam AntiVirus と Postfix を連携させるために、それぞれの設定を修正する。

Clam AntiVirus と Postfix の間の通信には UNIX ソケットを使うことにする。
Postfix が chroot 環境で動くことを考慮すると、UNIX ソケットは /var/spool/postfix ディレクトリ以下に作成しなくてはならない。

Postfix が chroot したときのルートディレクトリの位置は postconf -d queue_directory コマンドで調べられる。

clamav-milter パッケージをインストールした最初の設定では、Clam AntiVirus の milter システムで使う UNIX ソケットのパスは /var/run/clamav/clamav-milter.ctl になっている。
これを /var/spool/postfix/var/run/clamav/clamav-milter.ctl に変更する。
そのため /etc/clamav/clamav-milter.ctl ファイルの 4 行目の 'MilterSocket /var/run/clamav/clamav-milter.ctl' を 'MilterSocket /var/spool/postfix/var/run/clamav/clamav-milter.ctl' に修正する。
修正した /etc/clamav/clamav-milter.ctl ファイルの内容を以下に揚げる。

もうひとつ、/etc/default/clamav-milter ファイルも編集する。
修正箇所は /etc/default/clamav-milter ファイルの最後の行 (13 行目) で、 #SOCKET_RWGROUP=postfix の行頭の '#' を削除してアンコメントする。
修正した /etc/default/clamav-milter ファイルの内容を以下に揚げる

/etc/clamav/clamav-milter.ctl ファイルと /etc/default/clamav-milter ファイルの二つのファイルを編集したら、設定を反映させるために sudo service clamav-milter restart コマンドを実行する。
続いて ls -l /var/spool/postfix/var/run/clamav/clamav-milter.ctl コマンドを実行して、以下の結果が表示されることを確認する。

srw-rw-rw- 1 clamav postfix 0 2010-08-09 11:30 /var/spool/postfix/var/run/clamav/clamav-milter.ctl
ここに表示される日付と時刻は、 sudo service clamav-milter restart コマンドを実行して、clamav-milter に設定を読み込ませた日時。

次は Postfix が送受信のために受け取ったメールを、Clam AntiVirus の milter システムに渡すように、Postfix の設定を修正する。
このためには /etc/postfix/main.cf に以下の 3 行を追加する。

milter_default_action エントリは、Postfix が milter システムを使って呼び出したプログラムが、何らかのエラーを起こしたときにの動作を指定する。
Postfix の初期値では、milter システムで呼び出したプログラムがエラーになったときは、それを一時的なエラーとして、対象となったメールを時間をおいてもう一度送り直すよう、送信元にステータスを返すようになっている。
ここでは milter_default_action エントリに 'accept' を指定して、milter システム経由で呼び出したプログラムがエラーになったときでもエラーを無視して、処理を続行するようにする。
milter システム経由で呼び出すプログラムの動作を監視して、エラーが生じたときに速やかにその原因を取り除いて復旧できる体制が取れるのでなら 'accept' ではなく、Postfix 2.6 から導入された 'quarantine' か初期値の 'tempfail' を指定する方がいいかもしれない。

smtpd_milters エントリや non_smtpd_milters エントリには、連携する milter システムのソケットを指定する。
ソケットには UNIX ソケットと INET ソケットの 2 種類があり、UNIX ソケットを使って連携するときは 'unix:' に続けて UNIX ソケットのパスを、INET ソケットを使って連携するときは 'inet:' に続けてホスト名と INET ソケットのポート番号を指定する。

Clam AntiVilrus の milter システム (clamav-milter) の設定で、UNIX ソケットを使って Postfix と連携するようにしたので、'unix:' に続けてそのパスをここに指定する。
Clam AntiVilrus では UNIX ソケットに /var/spool/postfix/var/run/clamav/clamav-milter.ctl と指定したが、ここから Postfix の chroot ルートである /var/spool/postfix を除いた /var/run/clamav/clamav-milter.ctl の頭に 'unix:' を付けた 'unix:/var/run/clamav/clamav-milter.ctl' を指定する。

smtpd_milters エントリと non_smtpd_milters エントリでは、smtpd_milters エントリは Postfix の smtpd モジュールを経て受け付けたメールに適用する milter システムを指定し、non_smtpd_milters エントリはそれ以外の方法で受け付けたメールに適用する milter システムを指定するという違いがある。

最後に /etc/postfix/main.cf ファイルに施した修正を読み込ませるために sudo service postfix reload コマンドを実行すれば、Postfix で送受信するメールのウィルスチェックがされるようになる。

コメントを残す