Postfix SMTP リレーおよびアクセス制御


はじめに

Postfix SMTP サーバはネットワークからのメールを受信するので、ジャンク Eメールやウィルスのような大きな悪い世界に晒されています。このドキュメントは Postfix が受け取る SMTP メールを制御するビルトインの手法および外部手法、 避けるべき間違い、そして設定をテストする方法を紹介します。

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

リレー制御、ジャンクメール制御、およびユーザごとの ポリシー

はるか昔、インターネットは友好的な環境でした。メールサーバは誰かの 代わりにどの配送先へも喜んで転送していました。今日のインターネットでは、 スパマーが任意のシステムからメールを転送するのにサーバを悪用し、 悪用されたシステムはアンチスパマーブラックリストに載ってしまいます。 例えば、http://www.mail-abuse.org/ やその他のウェブサイトの情報を見てください。

デフォルトでは、Postfix はメールのリレーに対して適度に制限するという アプローチを取っています。Postfix は信頼するネットワークからのメールや リレー配送先として認めるように設定されたドメインに対してのみメールを リレーします。デフォルトのポリシーの記述は postconf(5) マニュアルページの smtpd_recipient_restrictions パラメータや、そこで参照している情報を見てください。

ほとんどの Postfix SMTP サーバアクセス制御はジャンクEメールを止める ことを目的としています。

残念ながら、全てジャンクメール制御には正当なメールを拒否してしまう 可能性があります。このことは様々なタイプのユーザがたくさんいるサイトでは 問題になるでしょう。どんなジャンクEメールが入ってくるのも許せないユーザが いる一方で、 1通でも正当なEメールメッセージがブロックされてしまうと世界が 終末をむかえるというユーザがいるでしょう。全てのユーザに "正しい" 単一の ポリシーがあるわけではないので、Postfix はユーザごとに異なる SMTP アクセス制御をサポートしています。これは RESTRICTION_CLASS_README ドキュメントに記述されています。

全ての SMTP メールに適用される制限

次のセクションに書かれているクライアントやユーザごとに設定可能な制限 以外に、 Postfix は全ての SMTP メールに適用される制限をいくつか実装して います。

SMTP アクセス制限リストによる選択

Postfix では SMTP 通信の各ステージごとにアクセス制限のリストを指定する ことができます。個々の制限は postconf(5) マニュアルページに書かれています。

以下は簡単な制限の例です:

/etc/postfix/main.cf:
    # 信頼しているネットワークからの接続のみを許可します。
    smtpd_client_restrictions = permit_mynetworks, reject

    # ホスト名を知らないメールシステムとは話しません。
    # Postfix < 2.3では reject_unknown_hostname を指定してください。
    smtpd_helo_restrictions = reject_unknown_helo_hostname

    # 存在しないドメインからのメールは受け付けません。
    smtpd_sender_restrictions = reject_unknown_sender_domain

    # ホワイトリスティング: ローカルクライアントはどの配送先でも指定でき、
    # それ以外はできません。
    smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination

    # 早口すぎるクライアントをブロックします。
    smtpd_data_restrictions = reject_unauth_pipelining

    # ポリシーサービスを呼び出してメール容量のクォータを強制します。
    smtpd_end_of_data_restrictions = check_policy_service unix:private/policy

それぞれの制限リストは、制限の結果が PERMIT や REJECT、DEFER (後で 試してください) になるまで、左から右へと評価されます。リストの最後は PERMIT という結果と等価です。PERMIT 制限を REJECT 制限の前に置くことで、 特定のクライアントやユーザに対して例外処理することができます。これを ホワイトリスティングといいます; 上の最後の例では、ローカルネットワーク からのメールは許可されますが、それ以外は任意の配送先へのメールは拒否 されます。

以下の表はそれぞれの SMTP アクセス制限リストの目的をまとめています。 リストは全て、全く同じ文法を使います; 評価されるときと REJECT や DEFER と いう結果の影響が異なるだけです。

制限リスト名 状態 REJECT や DEFER の影響
smtpd_client_restrictions オプション 全てのクライアントコマンドを拒否します
smtpd_helo_restrictions オプション HELO/EHLO 情報を拒否します
smtpd_sender_restrictions オプション MAIL FROM 情報を拒否します
smtpd_recipient_restrictions Required RCPT TO 情報を拒否します
smtpd_data_restrictions オプション DATA コマンドを拒否します
smtpd_end_of_data_restrictions Optional END-OF-DATA コマンドを拒否します
smtpd_etrn_restrictions オプション ETRN コマンドを拒否します

SMTP アクセス制御リストの評価を遅らせる

初期のバージョンの Postfix は SMTP アクセス制限リストを出来るだけ早く 評価していました。クライアント制限リストは Postfix が SMTP クライアントに "220 $myhostname..." グリーティングバナーを送る前に評価し、helo 制限リストは Postfix が HELO (EHLO) コマンドに応答する前に、送信者制限リストは Postfix が MAIL FROM コマンドに応答する前に、というように評価していました。この方法は 使うのが難しいということがわかってきました。

現在のバージョンの Postfix はクライアントや helo、送信者制限リストの 評価を RCPT TO または ETRN コマンドまで遅らせます。この振る舞いは smtpd_delay_reject パラメータによって制御されます。それでも制限リストは (クライアント、helo、 etrn) または (クライアント、helo、送信者、受信者、data、end-of-data) 制限という、適切な順序で評価されます。制限リスト (例: クライアント) が REJECT または DEFER と評価されると、他の制限リスト (例: helo、送信者など) は 飛ばされます。

smtpd_delay_reject が 導入された頃、Postfix はクライアントや helo、送信者、受信者、etrn コマンドの 情報を組み合わせた、混合制限リストをサポートするようにも変わりました。

制限の評価を遅らせたり、制限を混ぜることでの利点:

smtpd_recipient_restrictions の危険な利用法

ここまでで、smtpd クライアント、helo、送信者または受信者の制限が RCPT TO や ETRN コマンドまで遅らされるときに、なぜ必要なのかわからない かもしれませんね。アクセス制限を「全て」 smtpd_recipient_restrictions リストに置くことを薦める人たちもいます。残念ながら、これはアクセスを 過度に許可する設定にしてしまうかもしれません。どうしてそうなるのでしょう?

smtpd_recipient_restrictions 機能の目的は Postfix が RCPT TO コマンドへの対応方法を制御します。 制限リストが REJECT や DEFER と評価されると、受信者アドレスは拒否されます; これには何も驚くことはありません。結果が PERMIT であると、受信者アドレスは 受け入れられます。ここに驚くことがあり得ます。

これは PERMIT という結果が過度にアクセスを許可してしまう例です:

1 /etc/postfix/main.cf:
2     smtpd_recipient_restrictions = 
3         permit_mynetworks
4         check_helo_access hash:/etc/postfix/helo_access
5         reject_unknown_helo_hostname
6         reject_unauth_destination
7 
8 /etc/postfix/helo_access:
9     localhost.localdomain PERMIT

5行目は HELO コマンドで正しいホスト名を指定しないホストからのメールを 拒否します Postfix < 2.3では reject_unknown_hostname を 指定します)。4行目と9行目は自分を "HELO localhost.localdomain" と告げる マシンからのメールを受け入れる例外を作ります。

この設定の問題は、smtpd_recipient_restrictions が 自分自身を "localhost.localdomain" と主張するホスト「全て」を PERMIT と 評価してしまうことで、そのような全てのホストに対して Postfix をオープン リレーにしてしまいます。

smtpd_recipient_restrictions で このような驚きを避けるには、受信者ではない制限を reject_unauth_destination 制限の前ではなく「後に」置かなければいけません。上の例では、HELO に基づく 制限 reject_unauth_destination の 「後に」置くべきであり、もしくは副作用のない smtpd_helo_restrictions 以下に置けばよりよいでしょう。

SMTP アクセスルールのテスト

Postfix には SMTP アクセスルールをテストするのに役立つ機能がいくつか あります:

soft_bounce

これは SMTP サーバ REJECT アクションを DEFER (後で試してください) アクションに 変える、安全ネットです。これはメールをキューにとどめておきますが、 そうしないとメールは送信者に返されてしまいます。5xx SMTP 応答コードを 全て 4xx に変えることで Postfix SMTP サーバがメールを恒久的に拒否しない ようにするために、main.cf ファイルで "soft_bounce = yes" を指定して ください。

warn_if_reject

これは SMTP サーバ REJECT アクションを警告に変える、別の安全ネットです。 コマンドを拒否する代わりに、Postfix は拒否しようとしたものをログに記録 します。実際にメールを拒否せずにテストしたい SMTP アクセス制限リストの 制限の前に、"warn_if_reject" を指定します。

XCLIENT

この Postfix 2.1 の機能で、許可された SMTP クライアントは他のシステムのふりをすることができます。そうすることで、 実際に近い SMTP アクセスルールテストができます。アクセスルールのテストで 他のシステムのふりをする方法の例は XCLIENT_README ドキュメントの最後にあります。