Postfix XCLIENT Howto


XCLIENT SMTP拡張の目的

XCLIENT コマンドは次の問題を目標にしています:

  1. アクセス制御のテスト。SMTP サーバアクセスルールは、決定が リモートクライアントによってのみ引き起こされる場合は確認するのが 困難です。アクセスルールのテストを容易にするために、認証された SMTP クライアントテストプログラムには、SMTP セッションで流される SMTP クライアントのホスト名、ネットワークアドレス、およびその他の クライアント情報といった、SMTP サーバが持つ情報を上書きする機能が必要です。

  2. メールを上流メールサーバからダウンロードして SMTP でローカルの MTA に入れるクライアントソフトウェア。ローカル MTA の SMTP サーバ アクセスルールの利点を得るため、クライアントソフトウェアはリモートクライアント名やクライアントアドレスなどの SMTP サーバが持つ情報を上書きする機能が必要です。このような情報はたいてい上流サーバの Received: メッセージヘッダから抜き出せます。

  3. フィルタ後のアクセス制御とロギング。インターネット-> フィルタ->MTA 形式のコンテンツフィルタアプリケーションでは、 メール中継およびその他のアクセス制御を MTA に委譲できれば、フィルタを 簡単にすることが可能です。これは特にフィルタが SMTP コマンドの透過型 プロキシとして働く場合に便利です。これには SMTP クライアントホスト 名やネットワークアドレス、その他の MTA が持つ情報をフィルタが 上書きできる必要があります。

XCLIENT コマンドの文法

クライアント-サーバ間の対話例がこのドキュメントの最後にあります。

SMTP サーバの EHLO 応答における、この拡張に関するキーワードが XCLIENT です。続いて XCLIENT 実装がサポートしている属性の名前が続きます。

XCLIENT コマンドはメール配送トランザクションの途中 (つまり、MAIL と DOT の間や MAIL と RSETの間) を除いて、いつでも送れます。サーバが ESMTP コマンドパイプライニングをサポートしていれば、XCLIENT コマンドをパイプラインさせることもできます。スパイウェア感知のトリガーとなるのを避けるため、コマンドはコマンドグループの最後に送るべきです。

XCLIENT 要求の文法を以下に示します。大文字と引用符の付いた文字列は終端記号 (terminals) を、小文字の文字列はメタ終端記号 (meta terminals) を、 SP は空白を表します。コマンドや属性名は大文字で書かれていますが、実際には小文字でも構いません。

xclient-command = XCLIENT 1*( SP attribute-name"="attribute-value )

attribute-name = ( NAME | ADDR | PROTO | HELO )

attribute-value = xtext

注意1: 文法的に有効な NAME および HELO の属性値の要素の長さは最大255文字です。クライアントは SMTP コマンドの制限である 512 文字を超える XCLIENT コマンドを送ってはいけません。制限を越えないようにするため、クライアントは情報を複数の XCLIENT コマンドで送るべきです; 例えば、NAME と ADDR を最初に贈り、それから HELO と PROTO を送ります。

注意2: [UNAVAILABLE]、[TEMPUNAVAIL] および IPV6: は大文字でも小文字でも、混在したものでも指定できます。

注意3: バージョン2.3より前のPostfixの実装では、属性値を xtext エンコードしません。これらの古い実装を解釈しようとするサーバでは、エンコードされていない情報を受け取る準備をしておくべきです。

XCLIENT サーバの応答

書式が正しい XCLIENT コマンドを受け取ると、サーバは最初のSMTPグリーティングプロトコルの場面に状態をリセットします。オプションのアクセス決定の結果次第で、サーバは 220 もしくは適切な拒否コードで応答します。

実用上の理由から、サーバの状態を完全に最初のSMTPグリーティングプロトコルの場面にリセットすることがいつも可能とは限りません:

注意: バージョン2.3より前のPostfixの実装では、最初のSMTPグリーティングプロトコルの場面には戻りません。これらの古い実装は条件によっては正しく接続レベルのアクセス決定をシミュレートしないことがあります。

XCLIENT サーバ応答コード

コード 意味
220 成功
421 続行不能、切断中
501 コマンドパラメータ文法の間違い
503 メール処理実行中
550 不十分な認証
その他 接続レベルのアクセス決定で接続が拒否された

XCLIENT の例

この例では、XCLIENTコマンドを通してSMTPクライアント情報をすべて渡すことで、クライアントはメール生成システムのふりをします。クライアントによって送られる情報は太字で示されます。

220 server.example.com ESMTP Postfix
EHLO client.example.com
250-server.example.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-XCLIENT NAME ADDR PROTO HELO
250 8BITMIME
XCLIENT NAME=spike.porcupine.org ADDR=168.100.189.2
220 server.example.com ESMTP Postfix
EHLO spike.porcupine.org
250-server.example.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-XCLIENT NAME ADDR PROTO HELO
250 8BITMIME
MAIL FROM:<wietse@porcupine.org>
250 Ok
RCPT TO:<user@example.com>
250 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
...message content...
.
250 Ok: queued as 763402AAE6
QUIT
221 Bye

セキュリティ

XCLIENT コマンドは監査証跡や SMTP クライアントアクセス権限を変えてしまいます。このコマンドの使用は認証された SMTP クライアントに制限しなければいけません。

SMTP接続キャッシュ

XCLIENT 属性は SMTP セッションが終わるまで持続します。1つのセッションが異なる SMTP クライアントを代表してメールを配送するのに使われるのであれば、 XCLIENT 属性はそれぞれの MAIL FROM コマンドの前に適切にリセットされる必要があります。

参考資料

Moore, K, "SMTP Service Extension for Delivery Status Notifications", RFC 1891, January 1996.