Postfix ビルトインコンテンツ検査


ビルトインコンテンツ検査の概要

Postfix はキューに入れる前に同時に1行のメッセージヘッダまたは メッセージ本体の内容を調べる、ビルトインフィルタ機能をサポートして います。フィルタは通常、header_checks(5) マニュアルページに書かれている POSIX または PCRE 正規表現で 実装されます。

ビルトインフィルタは特定のEメールワームやウィルスの発生を止める ことが元々の目的であり、これはうまく機能しました。またフィルタは バウンスされたジャンクメール、ワームやウィルスからのバウンスメール、 ウィルス検知システムからの通知をブロックするのにも役立ってきました。 この2番目の応用についての情報は BACKSCATTER_README ドキュメントに 挙げられています。

ビルトインフィルタは特定のワームやウィルスの発生を止めることに 最適化されているため、一般的なジャンクEメールやウィルス検知に 「適さない」ような制限があります。そのためには、 FILTER_READMESMTPD_PROXY_README ドキュメントに 書かれているような、いずれかの外部コンテンツ検査方法を使うべきです。

以下の図は Postfix ビルトインコンテンツ検査がどのように働くかという 概略を示しています:

Postmaster
通知
|
v
ネットワークまたは
ローカルユーザ
-> ビルトイン
フィルタ
-> Postfix
キュー
-> 配送
エージェント
-> ネットワークまたは
ローカルメールボックス
^
|
|
v
配送できないメール
転送されたメール

この絵は Postfix が新しいメールを受け取る際にフィルタが働くことを 明らかにしています。これは Postfix がネットワークからのメールを、 送信者のアドレス (なりすましの場合がよくあります) に配送できない メールを返すことなく拒否できます。しかし、この機能はかなりの高負荷に なります: メールの検査に時間がかかりすぎると、リモートクライアントは タイムアウトしてしまい、クライアントは同じメッセージを繰り返し送る ことになるかもしれません。

このドキュメントがカバーしている話題:

ヘッダ/本体チェックを受けるメール

Postfix ヘッダ/本体チェックは incoming キュー にメールを入れる前の cleanup(8) サーバによって 実装されています。以下の図は cleanup(8) サーバ周辺を拡大し、このサーバが多くの異なるソースからのメールを 扱っていることを示しています。図を読みやすくするため、postmaster 通知の ソースは示されていません。postmaster 通知は多くの Postfix デーモン プロセスが生成する可能性があるためです。

bounce(8)
(配送できない)
smtpd(8)
(ネットワーク)
|
v
qmqpd(8)
(ネットワーク)
-\
-/
cleanup(8) -> incoming
キュー
pickup(8)
(ローカル)
^
|
local(8)
(転送)

効率上の理由で、Postfix の外部から入ってくるメールのみがヘッダ/本体 チェックで検査されます。すでにフィルタリングされたメールを再び フィルタリングするのは非効率ですし、postmaster 通知をブロックするのは 望ましくないことでしょう。以下の表はヘッダ/本体チェックを受ける、 もしくは受けないメールをまとめています。

メッセージの種類 ソース ヘッダ/本体チェック?
配送できないメール bounce(8) No
ネットワークメール smtpd(8) 設定可能
ネットワークメール qmqpd(8) 設定可能
ローカル投函 pickup(8) 設定可能
ローカル転送 local(8) No
Postmaster 通知 many No

どのメールがフィルタリングされる必要があるかを、Postfix はどのように 決めるのでしょうか? cleanup(8) サーバは 非常に多くの異なるソースからメールを受け取るため、このプログラムが 決めるのはよい方法ではありません。代わりに、ヘッダ/本体チェックは ソースによって要求されます。 smtpd(8)qmqpd(8)pickup(8) で受け取るメールのヘッダ/本体チェックを無効にする方法の例が以下の "外部ユーザからのメールのみをヘッダ/本体チェック するように設定する" や "あるドメイン宛の メールのみをヘッダ/本体チェックするように設定する" にあります。

Postfix ヘッダ/本体チェックの制限

日常のメールステータスレポートがブロックされるのを防ぐ

以下は Jim Seymour の http://jimsun.linxnet.com/downloads/pflogsumm-faq.txt にある Pflogsumm FAQ から引用しました。Pflogsumm は拒否されたメールからの ログを含む、Postfix のログを解析するプログラムです。ログに Postfix body_checks パターンで拒否された 文が含まれていると、そのログも同じ body_checks パターンで拒否されて しまうかもしれません。header_checks パターンの場合、メール状態レポート部にある文には適用されないため、 この問題は存在しません。

Postfix が本体チェックをするように設定すると、Postfix はチェックを おこない、 Pflogsumm が報告し、Postfix は Pflogsumm レポートの中の同じ 文字列を受け取ります。この解法はいくつかあります。

Wolfgang Zeikat はこれを提供してくれました:

#!/usr/bin/perl
use MIME::Lite;

### Create a new message:
$msg = MIME::Lite->new(
    From     => 'your@send.er',
    To       => 'your@recipie.nt',
    # Cc     => 'some@other.com, some@more.com',
    Subject  => 'pflogsumm',
    Date     => `date`,
    Type     => 'text/plain',
    Encoding => 'base64',
    Path     => '/tmp/pflogg',
);

$msg->send;

ここで "/tmp/pflogg" は Pflogsumm の出力です。これは Pflogsumm's の 出力を base64 MIME 添付ファイルに入れます。

Wietse からの注意: 信頼できないユーザがアクセス可能なマシン上でこれを 動かす場合、Pflogsumm レポートを誰でも書き込み可能ではないディレクトリに 置く方が安全です。

postfix-users メーリングリストのスレッドへのフォローアップで、Ralf Hildebrandt が次のように指摘しています:

"mpack が同じことをやります。"

確かにそうです。どちらのツールを使うかは好みの問題です。

他の解として、日常のメール状態レポートを除外する body_checks ルールを追加すると いうのもありますが、これは推奨できません。このようなルールは全てのメールを 遅くし、Postfix の管理を複雑にします。

外部ユーザからのメールのみをヘッダ/本体チェックするように設定する

以下の情報は Postfix 2.1 に当てはまります。以前の Postfix のバージョンは receive_override_options 機能をサポートしません。

最も簡単な方法としては、「1つの」Postfix インスタンスで複数の SMTP サーバ IP アドレスを持つよう master.cf に設定します:

あるドメイン宛のメールのみをヘッダ/本体チェックするように設定する

以下の情報は Postfix 2.1 に当てはまります。以前の Postfix のバージョンは receive_override_options 機能をサポートしません。

MX サービスプロバイダで、あるドメインに対してヘッダ/本体チェックを 適用したくないのであれば、「1つの」Postfix インスタンスで複数の SMTP サーバ IP アドレスを持つよう master.cf に設定することができます。それぞれの アドレスは異なるサービスを提供します:

/etc/postfix.master.cf:
    # =================================================================
    # service     type  private unpriv  chroot  wakeup  maxproc command
    #                   (yes)   (yes)   (yes)   (never) (100)
    # =================================================================
    # SMTP service for domains with header/body checks turned on.
    1.2.3.4:smtp  inet  n       -       n       -       -       smtpd

    # SMTP service for domains with header/body checks turned off.
    1.2.3.5:smtp  inet  n       -       n       -       -       smtpd
        -o receive_override_options=no_header_body_checks

セットアップしたら、それぞれのドメインを適切な SMTP インスタンスに 振るように DNS の MX レコードを設定します。