postfix 2.3 インストールメモ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− # 特徴 #--------------------------------------------------------------------------------------------- postfix はメール配送を司るいわゆるSMTP サーバーです。qmail などは同一パッケージにPOP サーバーも付属していますが、postfix ではそれが付属していません。drac やcourier-imap 等のPOP サーバーを別途用意する必要があります。 postfix は、配送エージェントMDA を容易に切り替えることができ、標準で仮想ドメイン対応されていることが大きな特徴となっています。 # インストール方法 #--------------------------------------------------------------------------------------------- postfix 専用のユーザー/グループを作成します。専用のユーザーはホームディレクトリをなしとし、ログインする必要もないので、シェルを無効としてください。グループpostgroup についてはpostfix 内部で限定されたグループとして利用するために必要となります。 # groupadd postdrop # groupadd postfix # useradd -g postfix -d /dev/null -s /bin/false postfix postfix のソースをインターネットよりダウンロード後、ソースを解凍します。 # su root # cd /usr/local/src/ # wget postfix-2.3.8.tar.gz # tar zxvf postfix-2.3.8.tar.gz postfix を解凍後、ディレクトリに入りインストール作業を行います。 # cd postfix-2.3.8 # make # make install make install 時にインストールすべき場所等を質問されますが、今回は実行ファイル、MAN ファイル等を/usr/local/postfix、設定ファイルを/etc/postfix、MAILBOX形式のメールボックスホームを/var/spool/postfix に配置するため、下記のように入力します。 install_root / tempdir /usr/local/src/postfix-2.3.8 config_directory /etc/postfix daemon_directory /usr/local/postfix/libexec command_directory /usr/local/postfix/sbin queue_directory /var/spool/postfix sendmail_path /usr/local/postfix/bin/sendmail newaliases_path /usr/local/postfix/bin/newaliases mailq_path /usr/local/postfix/bin/mailq mail_owner postfix setgid_group postdrop html_directory no manpage_directory /usr/local/postfix/man readme_directory no postfix の起動スクリプトはソースに付属されていないので下記を利用します。 ↓ /etc/rc.d/init.d/postfix -------------------------------- #!/bin/sh # # postfix Postfix Mail Transfer Agent # # chkconfig: 2345 80 30 # description: Postfix is a Mail Transport Agent, which is the program \ # that moves mail from one machine to another. # processname: master # pidfile: /var/spool/postfix/pid/master.pid # config: /etc/postfix/main.cf # config: /etc/postfix/master.cf # securlevel: 50 # # Based on startup script from Simon J Mudd # 25/02/99: Mostly s/sendmail/postfix/g by John A. Martin # 23/11/00: Changes & suggestions by Ajay Ramaswamy # 20/01/01: Changes to fall in line with RedHat 7.0 style # 23/02/01: Fix a few untidy problems with help from Daniel Roesen. # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ ${NETWORKING} = "no" ] && exit 0 [ -x /usr/sbin/postfix ] || exit 0 [ -d /etc/postfix ] || exit 0 [ -d /var/spool/postfix ] || exit 0 RETVAL=0 start() { # Start daemons. echo -n "Starting postfix: " /usr/sbin/postfix start 2>/dev/null 1>&2 && success || failure RETVAL=$? [ $RETVAL -eq 0 ] && touch /var/lock/subsys/postfix echo return $RETVAL } stop() { # Stop daemons. echo -n "Shutting down postfix: " /usr/sbin/postfix stop 2>/dev/null 1>&2 && success || failure RETVAL=$? [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/postfix echo return $RETVAL } reload() { echo -n "Reloading postfix: " /usr/sbin/postfix reload 2>/dev/null 1>&2 && success || failure RETVAL=$? echo return $RETVAL } abort() { /usr/sbin/postfix abort 2>/dev/null 1>&2 && success || failure return $? } flush() { /usr/sbin/postfix flush 2>/dev/null 1>&2 && success || failure return $? } check() { /usr/sbin/postfix check 2>/dev/null 1>&2 && success || failure return $? } restart() { stop start } # See how we were called. case "$1" in start) start ;; stop) stop ;; restart) stop start ;; reload) reload ;; abort) abort ;; flush) flush ;; check) check ;; status) status master ;; condrestart) [ -f /var/lock/subsys/postfix ] && restart || : ;; *) echo "Usage: postfix {start|stop|restart|reload|abort|flush|check|status|condrestart}" exit 1 esac exit $? ↑ ココまで ------------------------------------------------ # chmod 755 /etc/rc.d/init.d/postfix # 起動方法 #--------------------------------------------------------------------------------------------- 以上でpostfix の設定が全て終わりました。起動スクリプトを実行することによりpostfix が起動されます。 起動方法 : /etc/rc.d/init.d/postfix start 停止方法 : /etc/rc.d/init.d/postfix stop 設定反映方法 : /etc/rc.d/init.d/postfix reload 設定チェック方法 : /etc/rc.d/init.d/postifx check # 最も基本的な設定 #---------------------------------------------------------------------------------------------- postfix を利用する上での設定はmain.cf に対して行います。main.cf は「項目 = 値」の形式で記述し、仮に値が複数値の場合は「項目 = 値1,値2,値3」のようにカンマ区切りで設定します。 また、項目によっては外部データベースと連携して動作するものもあり、このようなデータベースをpostfix 検索テーブルと呼びます。postfix 検索テーブルは「項目 = TYPE:TABLE」のように設定され、例えば、次のようなTYPE が利用できます。 hash バークレーDB 形式のハッシュテーブルでpostmap コマンドによりデータベース化します static データベースを参照せず、検索結果として常にTABLE の値を用います main.cf の設定が終わったら次のコマンドで設定を有効にします。次のコマンドでは有効にする前にmain.cf ファイルのチェックを行っています。なお、postfix はpostfix 検索テーブルを一定間隔で読み込み直すのでpostfix 検索テーブルを更新した際は特に下記のコマンドを実行する必要はありません。 # /etc/rc.d/init.d/postfix check # /etc/rc.d/init.d/postfix reload まずは、自サーバーのMTA がどのようなドメインを管理するかをmyhostname、mydomain で決定します。指定されたドメインについては、システムユーザー=配送ユーザーとなり、/etc/passwd のホームディレクトリ直下のhome_mailbox で指定された場所にメールを格納します(例外もあるので詳細は下記参照)。postfix はディフォルトでmyhostname、mydomain で指定されたドメインのメールのみ受け付けるようmydestination を設定します。 myhostname 自サーバーのホスト名をFQDN 形式で設定します mydomain 自サーバーのドメインを指定します inet_interfaces SMTP 接続をLISTEN するインターフェイスを指定します mydestination 配送されてきたメールのうち、自サーバーで受け取るべきドメインを指定します home_mailbox ローカル配送先を指定します alias_database newaliases プログラムによって更新されるファイルを指定します alias_maps エイリアスを定義するファイルを指定します ※ エイリアスについて ※ postfix のエイリアスはsendmail のそれと同じく、自サーバーが管理するドメインの別名を指定します。alias_database とalias_maps は一見同じような設定ですが、alias_database にはnewaliases プログラムで更新されるべきファイルを指定します。 ※ ローカル配送先について ※ ローカル配送先には Mailbox Maildir/ を選択できます。 Mailbox の場合は「home_mailbox = Mailbox」と指定し、ホームディレクトリ直下のMailbox というファイルにメールが配送されます。 Maildir の場合は「home_mailbox = Maildir/」と設定し、ホームディレクトリ直下のMaildir 形式のファイルに配送されます。Maildir 形式でメールを配送する場合はあらかじめ下記のコマンドを実行してください。 # su - [配送ユーザー] # cd [ホームディレクトリ] # makedir Maildir Maildir/tmp Maildir/cur Maildir/new なにも指定しない場合のメールの配送先は「/var/spool/mail/[配送ユーザー]」にMailBox 形式で配送されます。 # 中継(リレー) 制御 #---------------------------------------------------------------------------------------------- postfix 標準設定では自サーバー宛のメールしか受け取らず、MUA から受け取ったメールを外部MTA に中継しません。 mynetworks 指定されたネットワークからの接続のみ中継を許可します smtpd_recipient_restrictions 宛先によって中継許可の捜査方法を指定します mynetworks を指定すると、指定されたネットワークから送信されたメールについては中継します。この制限はsmtpd_recipient_restrictions によって実施されていますが、この設定を変更することで宛先によって中継の可否を細かく設定できます。 # 配送制御 #---------------------------------------------------------------------------------------------- postfix に限らず標準のMTA ではメールの配送先をMX レコードによって決定します。ただ、場合によってはメール配送を別MTA に任せるためにMX レコードによる動的配送ではなく、静的配送したい時もあります。 relayhost すべてのメールを指定したホストに中継します transport_maps 特定のドメインに所属するメールを指定したホストに中継します relayhost は、すべてのメールを指定したホストに中継します。例えば「relayhost = [mail.test.com]」と指定した場合はmail.test.com 宛にメールが静的配送されます。 transport_maps はrelayhost と違い指示されたpostfix 検索テーブルによってドメインごとに異なるホストに中継します。例えば下記のように設定できます。 transport_maps = hash:/etc/postfix/transport.cdb と設定した場合、transport ファイルを下記のように記載しpostmap によってCDB 化します。 ↓ /etc/postfix/transport ---------------------------------- example01.jp [TAB] smtp:transport01.jp example02.jp [TAB] [192.168.0.10]:25 ↑ ココまで------------------------------------------------- ※ mydestination で指定されたドメインについては、上記配送制御の対象とはなりません。 # 仮想ドメインの設定 #---------------------------------------------------------------------------------------------- postfix はmydestination で指定されたドメイン宛のメールを自身が受け取るものとして判断し、システムユーザーのメールボックスに配送します。example01.jp が既にpostfix で設定されており、example02.jp を仮想ドメインとして追加する場合、受信するためにmydestination = example02.jp と設定します。 しかし、このままでは、test01@example02.jp 宛のメールを受け取った場合、実際は別ユーザーであるはずが、test01@example01.jp と同一システムユーザーtest01 宛にメールが配送されてしまいます。これを回避するには次の2つのアプローチがあります。 + バーチャルドメイン用のエイリアスを作成 +---------------------------------------------------------------------------------------------- virtual_alias_maps メールアドレスとシステムユーザーの関連づけを定義します 例えば、test01@example02.jp 宛のメールをシステムユーザであるtest02 宛に送信できれば、test01@example01.jp とtest01@example02.jp 宛のメールは別システムユーザー宛に届きます。これを実現するには下記の設定を行います。 virtual_alias_maps = hash:/etc/postfix/virtual_alias_maps.cdb と設定した場合、virtual_alias_maps ファイルを下記のように記載しpostmap によってCDB 化します。 ↓ /etc/postfix/virtual_alias_map -------------------------- test01@example02.jp [TAB] test02 ↑ ココまで------------------------------------------------- + システムユーザーとして存在しない仮想ユーザーを仮想ドメイン用に用意する +---------------------------------------------------------------------------------------------- virtual_transport 配送エージェントを指定する まず、仮想ドメインによるメール配送を有効とするには「virtual_transport = virtual」と設定する必要があります。 virtual_mailbox_domains 仮想ドメインを定義します virtual_mailbox_base 仮想ユーザーのベースホームディレクトリを指定します virtual_mailbox_maps メールアドレスと仮想メールボックスの関連づけを定義します virtual_uid_maps メールアドレス(仮想ドメイン) のUID を指定します virtual_gid_maps メールアドレス(仮想ドメイン) のGID を指定します virtual_mailbox_base 以外の上記設定については、postfix 検索テーブルでの指定が可能です。 virtual_mailbox_domains = hash:/etc/postfix/virual_mailbox_domains.cdb と設定した場合、virtual_mailbox_domains ファイルを下記のように記載しpostmap によってCDB 化します。 ↓ /etc/postfix/virtual_mailbox_domains -------------------- example01.jp [TAB] 説明文********** example02.jp [TAB] 説明文********** ↑ ココまで------------------------------------------------- virtual_mailbox_maps = hash:/etc/postfix/virual_mailbox_maps.cdb と設定した場合、virtual_mailbox_maps ファイルを下記のように記載しpostmap によってCDB 化します。 ↓ /etc/postfix/virtual_mailbox_maps ----------------------- test01@example01.jp [TAB] example01/ ← Maildir 形式のメールボックスを指定 test02@example01.jp [TAB] example01/ test01@example02.jp [TAB] example02 ← Mailbox のメールボックスを指定 ↑ ココまで------------------------------------------------- virtual_uid_maps = hash:/etc/postfix/virual_uid_maps.cdb と設定した場合、virtual_uid_maps ファイルを下記のように記載しpostmap によってCDB 化します。 ↓ /etc/postfix/virtual_uid_maps --------------------------- example01.jp [TAB] 1000 example02.jp [TAB] 2000 ↑ ココまで------------------------------------------------- virtual_gid_maps = hash:/etc/postfix/virual_gid_maps.cdb と設定した場合、virtual_gid_maps ファイルを下記のように記載しpostmap によってCDB 化します。 ↓ /etc/postfix/virtual_gid_maps --------------------------- example01.jp [TAB] 1000 example02.jp [TAB] 2000 ↑ ココまで------------------------------------------------- 上記の例であれば「virtual_mailbox_base = /home/maild」とした場合、 仮想ドメインはexample01.jp example02.jp であり、example01.jp 宛のメールはUID:1000、GID:1000 で/home/maild/example01/Maildir に配送され、example02.jp 宛のメールはUID:2000、GID:2000 で/home/maild/example02 に配送されます。 # 配送エージェントにmaildrop を使う #---------------------------------------------------------------------------------------------- postfix では、配送エージェントMDA を容易に切り替えることができます。配送エージェントにmaildrop を使う際は下記のように設定します。 ↓ /etc/postfix/main.cf ------------------------------------ virtual_transport = virtual virtual_mailbox_domains = [仮想ドメイン1], [仮想ドメイン2], ... ↑ ココまで------------------------------------------------- ※ virtual_mailbox_domains に列挙したド名はmydestination に記載してはいけません ↓ /etc/postfix/master.cf ---------------------------------- maildrop unix - n n - - pipe flags=DRhu user=maildrop argv=[maildrop ホーム]/bin/maildrop -d ${recipient} ↑ ココまで------------------------------------------------- postfix はvirtual_mailbox_domains に指定されたドメイン宛のメールを受け取った後、virtual_transport でmaildrop が指定されているので、master.cf のmaildrop 欄のargv で指示された方法でメール配送します。maildrop にメールが引き渡された時点で、postfix の仕事は終了し、どのUID でどこに配送するかはmaildrop によって決定されます。 ※ maildrop がcourier-authlib 組み込みの形でコンパイルされている場合、配送先情報はcourier-authlib の「--with-userdb」で指示された場所にあるuserdb.dat ファイルから読み込まれます。 # SMTP-AUTH の設定 #---------------------------------------------------------------------------------------------- SMTP-AUTH を有効にするために、SMTP プロトコル上で認証を可能とするcyrus-sasl を導入します。Postfix2.x ではCyrus sasl バージョン1、2をサポートしているので、今回はバージョン2を使います。 # su root # cd /usr/local/src/ # wget cyrus-sasl-2.1.22.tar.gz # tar zxvf cyrus-sasl-2.1.22.tar.gz # cd cyrus-sasl-2.1.22 # export CPPFLAGS=-I/usr/local/courier-authlib/include; \ ./configure --prefix=/usr/local/cyrus-sasl --enable-login \ --with-authdaemond=/usr/local/courier-authlib/var/spool/authdaemon/socket ※ 「--with-login」は、outlook express によるログインに対応します ※ courier-authlib と連携するために「--with-authdaemond」を指定してください ※ centOS 5.2 では yum によりcyrus-sasl がインストールされているので、あらかじめこれらを削除し てください # make # make install さらに、postfix をsasl 対応としますが、sasl 対応のmake file を作る以外は通常コンパイルと同様の手順でインストールします。 # cd postfix-2.3.8 # make makefiles \ CCARGS="-DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/local/cyrus-sasl/include/sasl" \ AUXLIBS="-L/usr/local/cyrus-sasl/lib -R/usr/local/cyrus-sasl/lib -lsasl2" # make # make install postfix に対してSMTP-AUTH の設定を行うため、下記のように設定します。 ↓ /etc/postfix/main.cf ------------------------------------ smtpd_sasl_auth_enable = yes ← sasl 認証を有効にする smtpd_recipient_restrictions = permit_mynetworks ← ※1 , permit_sasl_authenticated ← ※2 , reject_unauth_destination ← ※3 smtpd_sasl_security_options = noanonymous ← 匿名接続を拒否する ↑ ココまで------------------------------------------------- ※1 : mynetworks で指定されたネットワークからのリレーを許可する ※2 : SMTP-AUTH 認証を通過したものは許可する ※3 : SMTP-AUTH 認証を通過しないものは拒否するが、relay_domainsにあるドメインへは許可する (これがないとローカルユーザにメールが配信されません) ※ 注意 ) 仮に「smtpd_sasl_security_options = noplain」とし、cyrus-sasl でPLAIN 認証を許可していた場合、postfix から次のようなエラーが/var/log/maillog に出力されます。 fatal: SASL per-connection initialization failed warning: /usr/local/postfix/libexec/smtpd: bad command startup -- throttling 通常SMTP-AUTH 認証はsubmission ポートに対して行うべきであるので、それを可能とします。通常の25 ポートでのSMTP-AUTH 認証は許可しません。この編集によって、25 ポートと587 ポートが利用できるようになります。 ↓ /etc/postfix/master.cf ---------------------------------- smtp inet n - n - - smtpd submission inet n - n - - smtpd -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject ↑ ココまで------------------------------------------------- cyrus-sasl はcourier-authlib のように、独自のユーザーを管理する仕組みを持っています。また、自身がプロトコル上に認証システムを提供するライブラリであることから、標準で様々な認証方式に対応しています。具体的には/usr/local/cyrus-sals/lib/sals2 配下をみればわかりますが、おおよそ次の認証方式に対応しています。 CRAM-MD5 Digest-CRAM-MD5 PLAIN LOGIN SASLDB OTP AUTHDAEMON 等 今回はSMTP-AUTH の認証方式としてPLAIN LOGIN と、認証対象をauthdaemon よりソケット通信で取得するため、下記のようにsmtpd.conf ファイルを作成します。 ↓ /usr/local/cyrus-sasl/lib/sasl2/smtpd.conf -------------- pwcheck_method: authdaemond authdaemond_path: /usr/local/courier-authlib/var/spool/authdaemon/socket mech_list: plain login ↑ ココまで-------------------------------------------------