1 - このドキュメントの目的 ========================== このドキュメントには Postfix システムの作成・インストール・設定の仕方が 書いてあります。これにより、次のうち一つが出来るようになります。 - すでにインストールされている sendmail を変更せずにメールを送信の のみを行なう。 - すでにインストールされている sendmail を変更せずに、 バーチャルホストインターフェースを通してメールを送受信する。 - sendmail を完全に置き換える。 2 - 表記方法 ============ 以下の説明で # command と書かれたコマンドはスーパーユーザで実行します。 % command のように書かれたコマンドは一般ユーザとして実行します。 3 - ドキュメント類 ================== ドキュメント類は HTML 形式( html/index.html をブラウザでみて下さい)と UNIX 形式の manpage (MANPATH 環境変数に man サブディレクトリを 絶対パスで加えて下さい)で提供されています。 conf ディレクトリにある設定ファイルのサンプルには多くのコメントが ありますが、全ての特徴・機能の全てのニュアンスを記述したものでは ありません。 多くのファイルには、それ自身にマニュアルページが含まれています。 mantools ディレクトリにはそのように埋め込まれたマニュアルページを 取り出すツールがあります。 4 - サポートされたシステムでのビルド ==================================== 以下のシステム、もしくはそれによく似たシステムがサポートされています。 AIX 3.2.5 AIX 4.1.x AIX 4.2.0 BSD/OS 2.x BSD/OS 3.x BSD/OS 4.x FreeBSD 2.x FreeBSD 3.x FreeBSD 4.x HP-UX 9.x HP-UX 10.x HP-UX 11.x IRIX 5.x IRIX 6.x Linux Debian 1.3.1 Linux Debian 2.x Linux RedHat 4.x Linux RedHat 5.x Linux RedHat 6.x Linux Slackware 3.5 Linux Slackware 4.0 Linux Slackware 7.0 Linux SuSE 5.x Linux SuSE 6.x Mac OS X server NEXTSTEP 3.x NetBSD 1.x OPENSTEP 4.x OSF1.V3 (Digital UNIX) OSF1.V4 aka Digital UNIX V4 OSF1.V5 aka Digital UNIX V5 OpenBSD 2.x Reliant UNIX 5.x Rhapsody 5.x SunOS 4.1.x SunOS 5.4..5.7 (Solaris 2.4..7) Ultrix 4.x ビルド中に "make: don't know how to ..." というようなメッセージが 出る場合、Postfix の一番上のディレクトリに行き、次のコマンドを 実行することで回復できます。 % make -f Makefile.init makefiles 他のマシンでビルドした後に Postfix をコピーしてきた場合、 まず一番上のディレクトリで次のコマンドを実行するのがよいでしょう。 % make tidy これは他でコンパイルした時に残されたシステムに依存する部分を 除去します。 GCC を用いてビルドする場合や、ネイティブのコンパイラの方がよいと 報告されているシステムについてはそのコンパイラを使ってコンパイル する場合、Postfix のソースツリーの一番上のディレクトリに cd し、 次のコマンドを実行するだけです。 % make デフォルトではないコンパイラを使用するには、コンパイラの名前を 以下のように指定する必要があります: % make makefiles CC=/opt/SUNWspro/bin/cc (Solaris) % make % make makefiles CC="/opt/ansic/bin/cc -Ae" (HP-UX) %make % make makefiles CC="purify cc" % make 最適化は自動的にオフになる場合があります。 デフォルト以外の設定でビルドする場合、例えば /etc/postfix 以外に 設定ファイルのディレクトリを作る場合には、次のコマンドを使います。 % make makefiles CCARGS=-DDEF_CONFIG_DIR=\\\\\\\"/some/where\\\\\\\" % make バックスラッシュが7つありますが :-) これで少なくとも sh でも csh でも 動作します。 次のコマンド % make でコンパイラエラーメッセージが出る場合は、FAQ を調べて下さい。 5 - 未サポートシステムへのポーティング ======================================= - 新しいシステムの SYSTEMTYPE 名を選んで下さい。違うリリースの 同じシステムが混乱なくサポートできるように、名前にはオペレーティング システムのメジャーバージョンを含むように (SUNOS4 や LINUX2 のように) して下さい。 - トップディレクトリにある "makedefs" シェルスクリプトに 新しいシステムが確実に認識されるように条件文を付け加え、 正しいシステム依存の情報を出すようにしてください。 コードはユーザの PATH 設定に robust であることを確認してください; もしシステムが様々な UNIX の環境(例えば BSD と SYSV)を提供できる ならば、エミュレートされたものではなく、ネイティブな形式であることを 確認して下さい。 - util/sys_defs.h インクルードファイルの中に #ifdef SYSTEMTYPE セクションを付け加えます。新しいマクロを作る必要があるかもしれません。 マクロは HAS_DBM や FIONREAD_IN_SYS_FILIO_H のようなわかりやすい 名前にして下さい。それぞれのソースファイルで #ifdef SYSTEMTYPE に依存性を書かないことを強く推奨します。これは最も速い解決法に 見えますが、時間が経つと保守が難しくなっていきます。さらに、 次のポーティングの際に全てのソースコードに再び #ifdef を書く 必要性が生じてしまいます。 6 - コンパイルが成功した後のソフトウェアのインストール ====================================================== 重要: もし現在インストールされている sendmail を Postfix で 置き換えるのであれば、古い sendmail をしばらくの間走らせておいて、 メールキューを消す必要があります。スーパーユーザで次のコマンドを 実行して下さい (sendmail, newaliases や mailq コマンドは別の場所に あるかもしれません)。 # mv /usr/sbin/sendmail /usr/sbin/sendmail.OFF # mv /usr/bin/newaliases /usr/bin/newaliases.OFF # mv /usr/bin/mailq /usr/bin/mailq.OFF # chmod 755 /usr/sbin/sendmail.OFF /usr/bin/newaliases.OFF \ /usr/bin/mailq.OFF Postfix のインストールやアップグレードをするために: - ユニーク(他のユーザが使用していない)なユーザIDとグループIDを持った ユーザ "postfix" を作成します。できればこれは誰もログインできない アカウントにします。このアカウントにはログインシェルやホーム ディレクトリは必要ありません。私のパスワードファイルエントリは 次のようになっています。 postfix:*:12345:12345:postfix:/no/where:/no/shell - 次のようなエイリアスが /etc/aliases にあることを確認します。 postfix: root - このファイルの12章を参照し、誰でも書き込み可能(world-writable)な maildrop を利用するか、set-gid されたポスト用エージェントを利用するか 決定します。 - INSTALL.sh スクリプトをスーパーユーザで実行します。 # sh INSTALL.sh パス名の上書きは、INSTALL.sh スクリプトの編集や、インタラクティブに 指定することで可能です。INSTALL.sh はその設定を Postfix 設定 ディレクトリに保存し、将来のインストールを容易にします。 - Postfix を走らせたい方法によって、以下のセクションから選んで  進んで下さい。 - インストールされた sendmail はそのまま変更せずに Postfix で  メールの送信のみを行なう。(section 7) - バーチャルインターフェースを通してメールの送受信を行なうが、  インストールされた sendmail はそのまま変更しない。(section 8) - sendmail を完全に置き換える。(section 9) 7 - メール送信専用の Postfix の設定 =================================== Postfix をメールの送信のみに使用するのであれば、インストールされた sendmail の設定を変更する必要はありません。かわりに、mail user agent (MUA, メーラ)が直接 Postfix の sendmail プログラムを呼び出すように 設定します。 section 10 の "必要な設定ファイルの編集" に従い、 section 11 の "chroot すべきか chroot せざるべきか" 文章を再検討し、 section 12 にあるセキュリティモデルを選択します。 本物の sendmail と衝突しないために、/etc/postfix/master.cf の `smtp inet' はコメントアウトしなければなりません。 Postfix を起動するには、 # postfix start とするか、 Postfix の sendmail コマンドを or, if you feel nostalgic, use the Postfix sendmail command: # sendmail -bd -qwhatever として郷愁にふけり、syslog ファイルでエラーメッセージをチェックします。 初めて起動する時には、Postfix スタートアップシェルスクリプトが Postfix のスプールディレクトリ以下にサブディレクトリ群を作成します。 メールキューを調べるには、次のコマンドを使います。 % sendmail -bp section 13 の "メンテナンス" も参照してください。 8 - メールを送受信する Postfix の設定 (バーチャルインターフェース) ================================================================== それ以外に、バーチャルなインタフェースアドレスで Postfix を走らせる ことによって、sendmail の設定には手をつけずに Postfix システムを メールの送信および受信に使うことが出来ます。単に mail user agent が Postfix の sendmail プログラムを直接呼び出すように設定するだけです。 examples/virtual-setup ディレクトリには様々な UNIX のバージョンに対する バーチャルインターフェースの設定の説明があります。 /etc/postfix/main.cf ファイルに、次のように設定します。 myhostname = virtual.host.name inet_interfaces = $myhostname mydestination = $myhostname section 10 の "必要な設定ファイルの編集" に従い、 section 11 の "chroot すべきか chroot せざるべきか" 文章を再検討し、 section 12 にあるセキュリティモデルを選択します。 メールシステムを起動するには、 # postfix start とするか、Postfix の sendmail プログラムを # sendmail -bd -qwhatever として郷愁にふけり、syslog ファイルでエラーメッセージをチェックします。 初めて起動する時には、Postfix スタートアップシェルスクリプトが Postfix のスプールディレクトリ以下にサブディレクトリ群を作成します。 メールキューを調べるには、次のコマンドを使います。 % sendmail -bp section 13 の "メンテナンス" も参照してください。 9 - 永久に sendmail を止める ============================ Postfix のインストールに先立ち、現在動いている sendmail のプログラム ファイルを6章に記載したように保存します。 未配送メールを全て送るために、最低数日間は古い sendmail を動かし 続けるよう気をつけて下さい。そうするために、sendmail を止めて、 次のようにリスタートします。 # /usr/sbin/sendmail.OFF -q 下にある"Mandatory configuration file の編集"を行なった後、 次のように Postfix システムを起動します。 # postfix start またなつかしい sendmail の方法でも同様に動きます。 # sendmail -bd -qwhatever そしてメールシステムからの文句をシスログで眺めて下さい。 初めて起動する時には、Postfix スタートアップシェルスクリプトが Postfix のスプールディレクトリ以下にサブディレクトリ群を作成します。 section 13 の "メンテナンス" も参照してください。 10 - 必要な設定ファイル編集 =========================== デフォルトでは Postfix の設定ファイルは /etc/postfix にあり、 root が所有する必要があります。誰か他の人に main.cf もしくは master.cf の書き込み権を与えることは、その人に root の特権を与えることを 意味します。 設定ファイルを書き換えたら、次のコマンドを実行して走っているメール システムに更新を伝える必要があります。 # postfix reload 最低限のパラメータを /etc/postfix/main.cf にする必要があります。 Postfix の設定パラメータはシェル変数と似たものです。変数は次のように 設定します。 parameter = value 変数名の前に $ をつけて、その変数を使うことが出来ます。 other_parameter = $parameter $parameter は設定する前に使うことも出来ます。Postfix の設定言語は lazy な評価方法を使い、パラメータの値は実行中にそれが必要となる時まで 値を参照しません。 まず第一に、どのドメイン名をローカルアドレスに付け加えるか設定します。 "myorigin" パラメータのデフォルトはローカルのホスト名ですが、 非常に小さなサイトでは十分でしょう。 いくつか例示します。 myorigin = $myhostname myorigin = $mydomain 上の場合、ローカルメールは user@$myhostname として送信されます。 下の場合の送信者は user@$mydomain となります。 次にどのメールアドレスが Postfix のシステムにとってローカルか設定する 必要があります。 いくつか例示します。 mydestination = $myhostname, localhost.$mydomain mydestination = $myhostname, localhost.$mydomain, $mydomain mydestination = $myhostname 最初の例はワークステーションに適しており、2番目はドメイン全体の メールサーバに適しています。3番目の例はバーチャルホストインター フェースで実行している場合に使います。 システムがファイアウォール内にある場合は、リレーホストの設定をする 必要があります。できるなら Postfix が DNS 探索を使えるように、そして プライマリの MX ホストがダウンしている時にセカンダリの MX ホストを 利用できるように組織のドメイン名を設定します。そうでなければ、 単に確実なホスト名を設定します。 いくつか例示します。 relayhost = $mydomain relayhost = mail.$mydomain relayhost = [mail.$mydomain] [] で囲まれた形式では、DNS の MX レコードは無視します。 デフォルトでは、SMTP のクライアントはリレーホストを設定した場合でも 送信及び受信アドレスを DNS 探索します。もし DNS サーバにアクセスできない のであれば、SMTP クライアントの DNS 探索を次のように止めます。 disable_dns_lookups = yes FAQ (html/faq.html) には、ファイアウォールのあるネットワークや やダイアルアップネットワークへのヒントや TIPS があります。 最後に、Postfix の前に sendmail を使っていないのであれば、alias の データベースを作る必要があります (sendmail -bi もしくは newaliases を 実行する)。root や postmaster のエイリアスが実在の人にメールが転送される ようになっているか確かめて下さい。 11 - chroot すべきか chroot せざるべきか ======================================== ほとんどの Postfix のデーモンは chroot jail で、すなわち、 低い特権レベルに固定された chroot 環境で走ることができます。 これは攻撃に対して重要な障壁になります。この障壁は通り抜けないものでは ありませんが、多少は役に立つでしょう。 デフォルトの /etc/postfix/master.cf のファイルでは、デーモンは 全て chroot jail で走っていません。しかし、local と pipe デーモン以外の 全てのデーモンは chroot して走らせることが可能です。 examples/chroot-setup ディレクトリには Postfix を chroot 環境で動かす ための設定のスクリプト集があります。 12 - セキュリティ: maildrop ディレクトリの書き込み権 ==================================================== Postfix を動かすのに選択する必要があるメカニズムを提示します。 1 - Postfix は world-writable に sticky ビットを立てたモード 1777 の maildrop ディレクトリを使うことができ、そのディレクトリには ユーザがメールを投稿できます。このアプローチは set-uid や set-gid をソフトウェアにつける必要がなくなります。メールは メールシステムがダウンしている時でさえも送ることが可能です。 maildrop ディレクトリのキューファイルには other ユーザに対して 読み込み・書き込み・実行権はありません。maildrop ディレクトリは ネットワークを介したメールの受信には使われません。 world に書き込み権があるディレクトリでは、次のような心配が 生じるかも知れません: ローカルユーザが maildrop にある誰か他人のファイルにハードリンクを 作ると、それらのメールは出ていかずに、何回も配送されるかも しれない。またローカルユーザが maildrop ディレクトリをジャンクで 埋めつくし、メールシステムをクラッシュさせようとするかもしれない。 ローカルユーザが誰か他人のファイルのハードリンクを maildrop ディレクトリに作り、メールとして配送させようとするかも知れない。 しかし、Postfix のキューファイルは特定のフォーマットであり、 10^12 個の Postfix でないファイルのうち、有効な Postfix の キューであると認識するのは一つ以下の確率です。 誰でも書き込み可能(world-write)なパーミションで maildrop を 可能にするために: - INSTALL.sh スクリプトによって Postfix が set-gid 特権を必要と するか質問された時に「no」と答えます。 2 - 多くのユーザがいるシステムでは、world に書き込み権がある maildrop ディレクトリを取り止め、この目的のために提供される小さな maildrop コマンドに set-gid 特権を持たせるのが望ましいでしょう。 world の書き込み権を取り消すために: - 単一かつ他のユーザとグループIDを共有しない maildrop グループを 作成し、確実に postfix アカウントがグループにいないことを 確かめます。 - INSTALL.sh スクリプトによって Postfix が set-gid 特権を必要と するか質問された時に「maildrop」を指定します。 sendmail 送信プログラムは、maildrop ディレクトリの書き込み権が 制限されている時には、自動的に postdrop コマンドを呼び出します。 13 - Postfix システムのメンテナンス =================================== Postfix プログラムは全ての問題の log を syslog デーモンに渡します。 ログファイル名は /etc/syslog.conf に定義されます。 注意: syslogd はこのファイルを作りません。syslogd を(再)起動する前に このファイルを作らなければなりません。最低限次のようなものが必要です。 mail.err /dev/console mail.debug /var/log/maillog 好運なことに問題の数は少ないでしょうが、次のコマンドを毎晩 syslog ファイルが rotate される前に実行するのはいいことです。 # postfix check # egrep '(reject|warning|error|fatal|panic):' /some/log/file 2行めはメールソフトからの問題レポートに見えますが、アンチリレーや アンチ UCE ブロックがどれだけ有効かも報告します。