ubuntu 10.04 をメールサーバーに (グレイリスティング – milter-greylist で失敗)

メールサーバーをインターネットに公開して運用していると、好むと好まざるに関わらず多くの spam が送られてくる。
今回は spam の受信を少しでも減らすための工夫をする。

spam を受け取らないようにするための方策では spam フィルターが有名だが、今回は日常の保守に余り手間を掛けないでも済むグレイリスティングを使って spam 対策を行うことにする。
グレイリスティングは、メールサーバーがメールを送信しようとしたときに、送信先のサーバーが一時エラーを返すと、そのメールを一定時間後にもう一度送信し直す仕組みを利用した spam 対策だ。
一時エラーというのは、何らかの理由で一時的にサーバーが利用できないだけで、暫くすれば復旧している可能性を示している。
正規のメールサーバーが送信するメールは、宛先に可能な限り送り届ける必要があるので、一時エラーであればそのサーバーがエラーから復旧したはずの一定時間後に、もう一度送信し直すのようになっている。
それに対して spam を送信する場合は、一時に大量のメールを送りつけなければ意味がないことと、spam は必ず届けなくてはならないメールではないこともあって、spam を送信するサーバーは一時エラーに対してもう一度送信し直すような手間を省いていることが多い。

つまりグレイリスティングとは、他のサーバーがメールを送信するために接続してきたときに、最初の一回目はわざと一時エラーを返しておき、再度接続してきたメールは spam ではないと判断して、受信する方法だ。

Postfix でグレイリスティングを実現するには、ubuntu の標準リポジトリでいくつかのパッケージが提供されているので、それらからひとつを選んで使うのがもっとも手軽だ。
ubuntu 10.04 の標準リポジトリには、postgrey、sqlgrey、milter-greylist の三つのパッケージが提供されている。

前の記事で Postfix にウィルスチェック機能を実装するときに、clamav-milter パッケージを使った。
グレイリスティンでも milter の仕組みを使って実現したいので milter-greylist を使うつもりだったが、どのように設定しても解決しない問題があるために、使用を断念。
結局は、以前から使っていて実績がある Postgrey を採用した。

milter-greylist で生じた問題は、あくまでも推測でしかないが、milter-greylist 自体が Postfix に対して最適化されていない所為だと思われる。
これについては、今後のアップグレードで解消されることを期待しつつ、参考程度に milter-greylist を使おうとしたときの設定を以下に記しておく。

まずは milter-greylist を sudo aptitude update; sudo aptitude instal milter-greylist コマンドでインストールする。
続いて、/etc/init.d/milter-greylist ファイルを編集する。
このファイルは本来編集すべきものではないが、ここに含まれる若干の問題点を解消するために、敢えて編集を行う。
修正箇所は /etc/init.d/milter-greylist ファイルの 47 行目付近にある DOPTIONS から始まる行で、この行の '-u $USER -p $SOCKET' の部分を削除する。
修正した内容をその前後を含めて以下に揚げる。

続いて /etc/milter-greylist/greylist.conf ファイルを編集して、milter-greylist を設定する。
/etc/milter-greylist/greylist.conf ファイルは 157 行もあるので、その編集箇所だけを個々に揚げる。

9 行目付近の socket から始まる行を 'socket /var/spool/postfix/var/run/milter-greylist/milter-greylist.sock 660' に修正する。
これは「Postfix で SMTP 認証」や「ウィルスチェック」の記事でも書いたように、chroot した Postfix から接続できるように、/var/spool/postfix ディレクトリの下に、milter-greylist の UNIX ソケットを作成させるためだ。

13 行目付近の user から始まる行も 'user "greylist"' に修正する。

さらに、33 行目付近の list "my network" addr から始まる行も修正する。
この箇所では milter-greylist が一時エラーを返さない接続元の IP アドレス範囲を指定しているので、以下の様に修正する。

そして /etc/milter-greylist/greylist.conf ファイルの末尾にある一連の racl から始まる行(およびコメントアウトされている行) を以下のように修正する。

さらに、/etc/default/milter-greylist ファイルの 9 行目付近にある 'ENABLED=0' を 'ENAMBLE=1' に書き換える。

そして sudo mkdir –p /var/spool/postfix/var/run/milter-greylist; sudo chown greylist /var/spool/postfix/var/run/milter-greylist コマンドを実行した後に、 sudo service milter-greylist startコマンドを実行して、milter-greylist を起動する。
確認のために ls -l /var/spool/postfix/var/run/milter-greylist コマンドを実行すると、以下の結果が表示されるはずだ。

srwxrwx--- 1 greylist greylist 0 2010-08-22 12:34 var/run/milter-greylist/milter-greylist.sock
ここに表示される日付と時刻は、 sudo service milter-greylist start コマンドを実行して、milter-greylist に設定を読み込ませた日時。

できた UNIX ソケットは、greylist ユーザーと greylist グループにだけ読み書きのアクセス権が与えられているので、Postfix のプログラムが動いているユーザーアカウントを greylist グループに所属させる。
これのために sudo usermod --groups $(echo $(/usr/bin/awk -F ':' '$4 ~ "^postfix$" {print $1}' /etc/group) greylist | /bin/sed 's/[[:space:]]/,/g' -) postfix コマンドを実行する。

続いて、milter-greylist と連携するように Postfix の設定を編集する。
基本的には「ウィルスチェック」の記事で Postfix を Clam AntiVirus の milter システムと連携させたときに行った設定の修正と同じだ。
ただし、ネットワーク越しの接続 (smtpd を経た接続) に対してグレイリスティングが有効になればいいので、milter-greylist の UNIX ソケットのパスを記述するのは smtpd_milters エントリだけでよく、non_smtpd_milters エントリに記述する必要は無い。
ウィルスチェック」の記事で行った Clam AntiVirus の milter システムの連携に、milter-greylist の連携を追加した /etc/postfix/main.cf ファイルは以下の通りだ。

最後に編集した /etc/postfix/main.cf の内容を Postfix に読み込ませるために sudo service postfix restart コマンドを実行すれば、milter-greylist を使ったグレイリスティングが Postfix で動作するはずだ。

ところが、設定を終えた Postfix に対して実際にメールを送って動作を確認してみると、'milter-greylist: smfi_getsymval failed for {i}' といったエラーがログに記録されてしまう。
原因を調べてみたが、どこをどう探してもソースコードを修正しろとしか出てこない。
せっかく ubuntu の標準パッケージからインストールしているのに、ソースコードを直さなければならないのでは、本末転倒になってしまう。

仕方ないので、milter-greylist を使うのを諦め、以前から使っていて実績がある Postgrey を採用することにする。
次の記事で Postgrey の設定について書くつもりだが、その前に milter-greylist をインストール、設定する前の状態の戻しておかなくてはならない。

編集した /etc/postfix/main.cf ファイルを元に戻し、 sudo service postfix restart コマンドを実行して、元の設定を Postfix に読み込ませる。
そして、 sudo aptitude purge milter-greylist コマンドを実行して milter-greylist 関連のファイルを全て削除しておく。

コメントを残す