Postgrey はこんな感じ

まぁ、私があれこれ書かなくても、参考になる情報は多いので、そちらをどうぞ。

...なんだけど、自分でいじってみて気が付いた点などを。

インストール

オリジナルをソースを持ってきてても良いけど、やっぱりパッケージで入れた方が圧倒的に楽。

  • 起動時に daemon として起動させるスクリプトが付いてくる。
  • yum や apt でインストールすれば、必要な Perl モジュールを一緒にインストールされる。

CentOS の場合だと、CentOSリポジトリには無いので、rpmforge のリポジトリを追加すれば、「yum install postgrey」で必要なインストールは完了。

ポイントは、postfix 側の設定。

通常は、SMTP の RCPT TO を受け取った時に判断するので、smtpd_recipient_restrictions でチェックをかけるのだが、ここで「S25R に引っかかった場合に Greylisting」とするには、ちょっと工夫が必要。

まず、S25R のパターンに引っかけるために、main.cf 上で、こんな風に書く。

smtpd_recipient_restrictions = permit_mynetworks,
                               check_client_access regexp:/etc/postfix/s25r,
                               reject_noauth_destination

これで、接続してきた相手をチェックするのに、/etc/postfix/s25r 中に記述された正規表現を使いますよ、ということになる。で、/etc/postfix/s25r 側はこんな風に書く。

/^unknown$/                                     check_greylist
/^[^.]*[0-9][^0-9.]+[0-9].*\./                  check_greylist
/^[^.]*[0-9]{5}/                                check_greylist
/^([^.]+\.)?[0-9][^.]*\.[^.]+\..+\.[a-z]/       check_greylist
/^[^.]*[0-9]\.[^.]*[0-9]-[0-9]/                 check_greylist
/^[^.]*[0-9]\.[^.]*[0-9]\.[^.]+\..+\./          check_greylist
/^(dhcp|dialup|ppp|[achrsvx]?dsl)[^.]*[0-9]/    check_greylist

通常なら左の条件に引っかかったら、右側に REJECT とか書いて、拒否するところに、謎の「check_greylist」などという物を書く。で、この「check_greylist」なるものを、また、postfix の main.cf で定義しておく。

smtpd_restriction_classes = check_greylist
check_greylist = check_policy_service unix:/usr/spool/posfix/postgrey

smtpd_restriction_class で、いわば、オリジナルの処理名(check_greylist)を定義しておき、その処理名に対して、処理内容を記述しているのが2行目になる。で、この check_policy_service は別のプログラムに結果を判断してもらう、というもので、指定先に接続して判断を仰ぐ。その接続先で Postgrey が待ち受けている、という寸法になっている*1

後は、check_policy_service で指定先で Postgrey が待ち受けするように動作していれば良い。rpmforge からのパッケージに含まれる起動スクリプトでは、UNIX ドメインソケットで Postgrey が待ち受けるようになっているので、check_policy_service の指定先は、そのパスを指定することになるが、IP ベースで待ち受けるようにするのであれば、「inet:localhost:10023」といった具合になる。

これを応用すれば、

といった事が可能になる。

Postgrey は必要なパラメータをコマンドラインから指定するため、設定ファイルが無い。rpmforge からのパッケージに含まれる起動スクリプト(/etc/rc.d/init.d/postgrey)の場合、最終的には OPTIONS というシェル変数を postgrey に渡す。/etc/sysconfig/postgrey というファイルを作って、「OPTIONS=なんちゃら」と書けば、それがコマンドラインに渡る。

とはいえ、デフォルトをいじらないと、という感じはあまりない。強いて言うと、retry-window の2日間というのは長い感じがする。あと、max-age の 35 日間は、ホワイトリストを Postgrey の自動ホワイトリスト機能に任せて、自分で状況を見てホワイトリストを追加するので無ければ、この期間でも良いと思うが、積極的に状況を観察して、必要なホワイトリストは自分たちで追加するのであれば、max-age は短くした方が良いかなぁ。

*1:改めて、S25R で Postgrey の組み合わせに関して調べてみたら、check_client_access で指定したファイルで、「S25R に引っかからなかったら OK にする」という記述にして、check_client_access の次で check_policy_service を使って Postgrey に渡しているケースが多かった。つまり、Postgrey に処理をさせるのは、他の条件で拒否でも許可でもなく、残った物を Postgrey に渡す、という方法。微妙な違いだが、「このときに Greylisting」というのなら、上記の記述方法になる。