Postfix
の概要 - グローバルアーキテクチャ
上のレベルへ | イントロダクション |
目的と特徴 | グローバルアーキテクチャ |
キューマネージメント |
セキュリティ
イントロダクション
メールシステムには Sendmail のようになんでもこなす一つの大きな
モノシリックプログラムとして実装されているものがあります。
一つの大きなプログラムでは確かにデータをシステムの異なる部分で
共有するのが簡単になります。
不幸なことに、一つの大きなプログラムは致命的な失敗も起こしやすく
なります。qmail のように固定された順番で他のプログラムを動かし、
使い終ったら捨ててしまうプログラムの厳密な階層構造を使う
メーラもあります。このアプローチはプロセス生成のオーバーヘッドと
プロセス内通信を犠牲にして、よりよい絶縁状態をもたらします。
この余分なコストは仕事を賢い方法で分割することで、許容範囲内に
おさめることができます。
Postfix のアーキテクチャ
Postfix は半永続的な、相互に協力する、特定の親子関係を持たずに
お互いに対して特定の仕事をこなすプロセスに基礎を置いている。
ここでも、別々のプロセスがする仕事は一つの大きなプログラムを
使うよりもよい絶縁状態をもたらします。さらに、Postfix の
アプローチにはアドレス書き換えのようなサービスを全ての Postfix
コンポーネントプログラムから、一つのアドレス書き換えだけのために
プロセス生成の負担を招くことなしに使えるという利点があります。
ところで: Postfix がこのアプローチを使う唯一の(メール)プログラムだと
いうつもりはありません。この比較的若い分野であっても、
それ以前に他の誰もしたことがない新しい何かを仕上げることは困難です。
Postfix は Postfix デーモンプロセスを要求によって動かす常駐
マスターサーバとして実装されています: ネットワークメールメッセージの
送受信をするデーモンプロセス、ローカルにメールを配送するデーモン
プロセスなど。これらのプロセスは設定可能な数まで生成され、
設計可能な回数だけ再利用され、設定可能なアイドル時間を経過すると
消滅します。このアプローチは別々のプロセスのよい絶縁状態を
提供しながらも、徹底的にプロセス生成のオーバーヘッドを減らします。
Postfix は Sendmail を置き換えることを意図しています。このため、
現在存在するインフラストラクチャと互換であることを目指します。
しかし、ローカル配送プログラムのように Postfix システムの多くの部分は
inetd ライクな設定ファイルを編集することで容易に
置き換えられます。例えば、シェルにログインすることのなく、
UNIX アカウントさえ持たないかもしれない POP/IMAP ユーザに
低い権限に固定されて走る代わりのローカル配送プログラムを
提供する予定です。
このアーキテクチャの結果として、Postfix はぎりぎり最低限まで
分解することが容易です。停止されたサブシステムは exploit される
ことはありません。ファイアウォールはローカル配送を必要としません。
クライアントワークステーションでは、smtp リスナーとローカル配送
サブシステムを停止できます; もしくはクライアントは maildrop
ディレクトリをファイルサーバからマウントし、Postifix プロセスを
全く常駐させることもないでしょう。
Postfix プロセス間の通信
Postfix システムの核は1ダースの半常駐プログラムによって実装されて
います。秘匿性の理由から、これらの Postfix プロセスは
UNIX ドメインソケットや保護されたディレクトリにある FIFO を通して
通信します。
このような秘匿性にもかかわらず、Postfix プロセスはこの方法で受け取る
データを本当に信頼しません; Postfix キューファイルの内容と
全く同じように、それらを単なる噂話として扱います。
Postfix のプロセス間で渡される情報量は制限されています。多くの場合、
Postfix プロセス間で交換される情報はキューファイル名と受信者の
リストもしくはいくつかの状態情報だけです。一旦 E メールメッセージが
ファイルに保存されると、メール配送プログラムに読まれるまで、
そこに留まります。
Postfix は情報を失うことを避けるために、常に用心しています:
受信を確認する前に全てのデータを flush と fsync() し、エラー状態を
調べるため、全てのシステムコールの結果をチェックします。
このプログラミングスタイルを目新しいと感じる人がいるかもしれませんが、
ここ数年多くの場所で標準になってきているのは確かです。
上のレベルへ | イントロダクション |
目的と特徴 | グローバルアーキテクチャ |
キューマネージメント |
セキュリティ