*Postfix [#efc9c1c0]
MTA(メール中継エージェント)の一つ。コンフィグレベルでSendmailと互換性がある。
転送先がSMTPをサポートしていれば、フィルタリング、ウイルスチェック、リバースプロキシへ転送する事も可能。
~
*構築環境 [#n6efed31]
今回検証した環境はこちら
-openSUSE 13.1 x86_64
 ※CentOS 6.x等の非Systemd環境で構築する場合には、各スクリプトをinit用に書き換える必要がある。
~
*構築 [#b06b4623]
&size(16){&font(b){1. ディレクトリ構成};};
普通は"/var/spool"以下にメールデータを格納するのだが、
今回はちょっと特殊な構成な点と、色々なミドルウェアとの連携をしているので、
メールデータディレクトリのみデフォルトから変更している。
 メールデータディレクトリ:/var/hostname/spool/*
 Postfixのコンフィグディレクトリ:/etc/postfix/*
 Postfixのシステムコンフィグファイル:/etc/sysconfig/postfix
今回はこのディレクトリ構成でMTA(Postfix)の構築を行う
~

&size(16){&font(b){2. インストール};};
ソースからmakeするのが筋なのだろうが、面倒だったのでyastでインストール。
zypperとかyumとかapt-getでも同様に行ける。
 # yast
     [Software] -> [Software Management] -> [Search Phrase] -> "postfix"を入力。
     実際にインストールするのは、"postfix","postfix-devel","postfix-mysql"の三つ。
~
*設定 [#g166e06c]
&size(16){&font(b){・説明};};
Postfixのメインコンフィグを書き換えていく。
存在しないコンフィグファイルがあった場合は新規作成をする。
~

基本的にデフォルトのパラメータやディレクトリ構成を使用する事とする。
しかし、ユーザ情報はMySQLで管理する構成なので、
PostfixからMySQLへのアクセスを行う設定ファイルを追加作成する。
設定例としてMySQLはlocalhostに構築済みかつ、MySQL用のパラメータを以下とする。
 ・MySQLユーザ名:postfix-mysql-user
 ・MySQLパスワード:postfix-mysql-pass
 ・MySQLのDB名:postfix-user-db
~

あと、現状のPostfixコンフィグの何処を書き換えたかうろ覚えなので、
変更した設定ファイル内容を全て列挙する。
 1). 下記の書き換え項目に挙っていない所は全てコメントアウトする。
 2). 書き換えに上がっていない設定ファイルはデフォルトのまま使用する。
~

&size(16){&font(b){/etc/postfix/main.cf};};
 ##
 ## 基本設定
 ##
 ## マニュアル [http://www.postfix-jp.info/trans-2.2/jhtml/postconf.5.html]
 ##
 
 # Postfixのキューディレクトリ。キューディレクトリはデフォルトを使用する
 queue_directory = /var/spool/postfix
 
 # Postfixの管理コマンド
 command_directory = /usr/sbin
 
 # Postfixのサポート、デーモンの各プログラムがあるディレクトリ
 daemon_directory = /usr/lib/postfix
 
 # Postfixが書き込むディレクトリ。所有ユーザが$mail_ownerの値になっている必要がある
 data_directory = /var/lib/postfix
 
 # Postfixデーモンの実行ユーザ
 mail_owner = postfix
 
 # MTAのホスト名。FQDNで書く必要がある
 myhostname = mail.hoge.org
 
 # MTAのドメイン名。$myhostnameからホスト部分を取った値になる
 mydomain = hoge.org
 
 # Postfixから送信したメールが、何処のメールサーバ(FQDN)から送信された物かの記述を指定する
 myorigin = $myhostname
 
 # メールを受け取るNICのアドレス。allを指定すると全てから受け取る
 inet_interfaces = all
 
 # メール配送をされるドメインのリスト。今回はバーチャルドメインを利用するので"空白"を指定する
 mydestination =
 
 # 受信者アドレスがローカルIPで、受信者条件に合致しない時に応答するコード
 unknown_local_recipient_reject_code = 550
 
 # $mynetworksパラメータのデフォルト値を生成する方法。普通はhostかsubnetを指定する
 mynetworks_style = subnet
 
 # 信頼されたネットワーク。MTAのサーバ自体(127.0.0.1/32)と、LANの値(192.168.0.0/24)を指定する
 mynetworks = 192.168.0.0/24, 127.0.0.1/32
 
 # Postfixがメールをリレーしようとする配送先MTAドメイン
 relay_domains = $mydestination
 
 # Postfixの認証(ユーザのログイン)で使用されるエイリアスデータベース
 alias_maps = hash:/etc/aliases
 
 # newaliasesコマンドで更新されるエイリアスデータベース
 alias_database = hash:/etc/aliases
 
 # メールの保存ディレクトリ名と保存形式。今回はMailDir形式(一つのメールに一つのファイル)で保存を行う
 # 下記だと各ユーザの"mail"というディレクトリの中にメール毎にファイルを生成し保存する事になる
 home_mailbox = mail/
 
 # メールの配送に使用するコマンド。つまり、Postfixの受信したメールの次の行き先をコマンドレベルで指定する
 # 今回は、procmailでの振り分けを行うのでprocmailのバイナリ(コマンド)を指定する
 mailbox_command = /usr/bin/procmail
 
 # SMTPのリターンコードが220の時に付随するテキスト。unknownにしないとPostfixのバージョンが漏れる
 smtpd_banner = $myhostname ESMTP unknown
 
 # リモートクライアントかサーバが$debug_peer_listパラメータにマッチした場合の冗長ログレベル
 debug_peer_level = 2
 
 # デーモンが"-D"オプションで呼ばれた時に実行される外部コマンド
 debugger_command =
      PATH=/bin:/usr/bin:/usr/local/bin
      ddd $daemon_directory/$process_name $process_id & sleep 5
 
 # Sendmail互換機能。Postfixキューにメールを投げるのに使用される
 sendmail_path = /usr/sbin/sendmail
 
 # Sendmail互換機能。localのエイリアスDBを再構築する際に使用
 newaliases_path = /usr/bin/newaliases
 
 # Sendmail互換機能。Postfixのメールキューをリストアップする
 mailq_path = /usr/bin/mailq
 
 # Postfixコマンド、Postfixディレクトリを所有するグループ
 # このパラメータを変更した場合、"postfix set-permissions"コマンドを実行する必要がある
 setgid_group = maildrop
 
 # Postfixのドキュメント(HTML)ファイルのディレクトリ
 html_directory = /usr/share/doc/packages/postfix-doc/html
 
 # Postfixのマニュアルがインストールされたディレクトリ
 manpage_directory = /usr/share/man
 
 # Postfixの設定例があるディレクトリ
 sample_directory = /usr/share/doc/packages/postfix-doc/samples
 
 # PostfixのREADMEファイルのディレクトリ
 readme_directory = /usr/share/doc/packages/postfix-doc/README_FILES
 
 # Postfixが待ち受けるプロトコル。ipv4=IPv4,ipv6=IPv6,all=IPv4+IPv6
 inet_protocols = ipv4
 
 
 
 ##
 ## [独自追加部分] - SASL設定
 ##
 
 # PostfixのSASL認証を有効にする
 smtpd_sasl_auth_enable = yes
 
 # Receivedヘッダーに認証ユーザ名を表示する
 smtpd_sasl_authenticated_header = yes
 
 # DovecotのSASL認証を利用する
 smtpd_sasl_type = dovecot
 
 # DovecotのSASL認証用デーモンのソケットを指定
 smtpd_sasl_path = private/auth
 
 # SASL認証のレルム(realm)の指定
 smtpd_sasl_local_domain = $myhostname
 
 # クライアントに許可(提供)する認証方法
 #   noplaintext  : 平分パスワードを非許可
 #   noactive     : "non-dictionary active"攻撃に脆弱な認証を非許可
 #   nodictionary : "passive dictionary"攻撃に脆弱な認証を非許可
 #   noanonymous  : 匿名ログインを非許可
 #   mutual_auth  : 相互認証を提供する方法のみ許可
 smtpd_sasl_security_options = noanonymous
 
 # SMTPクライアントがSMTPセッションで"HELO"or"EHLO"コマンドで情報を要求する
 smtpd_helo_required = yes
 
 # PostfixがSMTP"RCPT TO"コマンドの際に適用するアクセス制限。詳細はPostfixのマニュアルを読むこと
 smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
 
 # 古いバージョンのSMTP"AUTH"コマンドとの相互運用性を有効にする
 broken_sasl_auth_clients = yes
 
 # PostfixでTLSを有効にする。Postfix2.3以降だと"smtpd_tls_security_level"の使用を推奨している
 smtpd_use_tls = yes
 
 # Postfixで暗号化されていないSASL認証を受け付けない。"smtpd_use_tls = yes"になっている事が必要
 smtpd_tls_auth_only = yes
 
 # PEMフォーマットのSMTP(Postfix)サーバ用RSA証明書ファイル
 smtpd_tls_cert_file = /etc/pki/tls/mail.hoge.crt
 
 # PEMフォーマットのSMTP(Postfix)サーバ用RSA秘密鍵ファイル
 smtpd_tls_key_file = /etc/pki/tls/mail.hoge.key
 
 # PostfixのTLSセッションキャッシュを含むファイルの名前。btreeやsdbmを指定する。dbmは非推奨
 smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
 
 # 擬似乱数生成用のソースファイル。デバイスファイルを指定する際には、先頭に"dev:"を付ける
 tls_random_source = dev:/dev/urandom
 
 # SMTPの"SMTP VRFY"コマンドを無効化する
 disable_vrfy_command = yes
 
 
 
 ##
 ## [独自追加部分] - バーチャルドメイン設定
 ##
 ## 先頭に"mysql:"と付いている箇所はMySQLのDB値を取得する事を意味する
 ##
 
 # $mydestinationでリストアップされたドメインへの配送先。下記だとバーチャルドメインを指定
 local_transport = virtual
 
 # $virtual_mailbox_domainsでリストアップされたドメインで、最終配送時のデフォルトメール配送(Next-Hop)先
 virtual_transport = procmail
 
 # 特定メールアドレス、ドメインのエイリアスファイルを指定
 virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
 
 # 指定されたバーチャルエイリアスドメインの最終配送先
 # $virtual_alias_maps内に受信者アドレスが存在しない場合、受信を拒否する
 virtual_alias_domains = $virtual_alias_maps
 
 # バーチャルドメインのトップレベルメールスプールディレクトリを指定
 # $virtual_mailbox_mapsテーブル検索結果の全てのPATHの先頭に付けるプレフィックスと同じ意味
 virtual_mailbox_base = /var/hoge/mail-spool
 
 # $virtual_mailbox_domainsに対応する有効なアドレスのオプション検索テーブル
 # $virtual_mailbox_baseの値がこのPATHの前に付けられるので注意
 virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
 
 # 指定ファイル内から受信者アドレスの検索を行い、存在しない受信者宛のメールは拒否をする
 virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
 
 # メールの最大サイズ(Byte換算)。0だと無制限
 message_size_limit = 10485760
 
 # MTAサーバでのQuota制限に引っかかった場合、エラーメールを返送する
 virtual_overquota_bounce = yes
 
 # 受信メールボックスのみを制限する
 virtual_mailbox_limit_inbox = yes
 
 # バーチャルドメイン毎の最大メールボックスを記述したエイリアスファイルを指定
 virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
 
 # $virtual_mailbox_limit_mapsの値で、最大メールボックスの設定値を上書きする
 virtual_mailbox_limit_override = yes
 
 # PostfixのユーザIDの最小値を指定する。この値以下のユーザ(UID)での配送は全て拒否する
 virtual_minimum_uid = 5000
 
 # 用意したユーザIDを指定する。5000以降にしておくとシステムと被る事が少ないので良
 virtual_uid_maps = static:5000
 
 # 用意したグループIDを指定する。5000以降にしておくとシステムと被る事が少ないので良
 virtual_gid_maps = static:5000
 
 # キューに入った後にフィルタリング処理を行うMTAの名前とポートを指定する
 # Postfixのコンフィグ(master.cf)に書いた値を指定する。他のMTAサーバ(IPアドレス違い)を指定する事も可能
 # 今回はウイルスチェックを通す為、amavisの待機ポートを指定する
 content_filter = amavis:[localhost]:10026
 
 # 受信者確認、アドレス書き換えの処理を指定する
 #   no_unknows_recipient_checks : 知らない受信者でも拒否をしない
 #                                 外部コンテンツフィルタの"後"に処理される
 #   no_address_mappings         : バーチャルエイリアスマップ拡張、自動BCC受信者を無効にする
 #                                 外部コンテンツフィルタの"前"に処理される
 #   no_header_body_check        : ヘッダー・ボディチェックを無効にする
 #                                 外部コンテンツフィルタの"後"に処理される
 receive_override_options = no_address_mappings
~

&size(16){&font(b){/etc/postfix/mysql_virtual_alias_maps.cf};};
 user = postfix-mysql-user
 password = postfix-mysql-pass
 hosts = localhost
 dbname = postfix-user-db
 table = alias
 select_field = goto
 where_field = address
~

&size(16){&font(b){/etc/postfix/mysql_virtual_domains_maps.cf};};
 user = postfix-mysql-user
 password = postfix-mysql-pass
 hosts = localhost
 dbname = postfix-user-db
 table = domain
 select_field = domain
 where_field = domain
 additional_conditions = and backupmx = '0' and active = '1'
~

&size(16){&font(b){/etc/postfix/mysql_virtual_mailbox_limit_maps.cf};};
 user = postfix-mysql-user
 password = postfix-mysql-pass
 hosts = localhost
 dbname = postfix-user-db
 table = mailbox
 select_field = quota
 where_field = username
 additional_conditions = and active = '1'
~

&size(16){&font(b){/etc/postfix/mysql_virtual_mailbox_maps.cf};};
 user = postfix-mysql-user
 password = postfix-mysql-pass
 hosts = localhost
 dbname = postfix-user-db
 table = mailbox
 select_field = maildir
 where_field = username
 additional_conditions = and active = '1'
~

&size(16){&font(b){/etc/postfix/vquota};};
 # 該当メールアドレスのバーチャルクォータを指定
 # ドメインのオーナーアドレスとかは下記みたいに個別指定にした方が良
 hoge-owner@mail.hoge.org 524288000
 # ドメイン全体でのバーチャルドメインクォータを指定
 # 『個別メールクォータ容量≦ドメイン全体でのクォータ容量』になるようにする
 @mail.hoge.org 524288000
~

&size(16){&font(b){/etc/postfix/master.cf};};
本来ならchroot環境にするべきなのだが、
chrootにすると何故かMySQLとの連携で転けたので今回はノーマル状態で構築。
あと、基本的に"下記のまま"記述をし、下記に書いていない箇所については"コメントアウト"を行う。

 # ==========================================================================
 # Postfix Document
 #   http://www.postfix-jp.info/trans-2.3/conf/master.cf.jp
 # ==========================================================================
 # service type  private unpriv  chroot  wakeup  maxproc command + args
 #               (yes)   (yes)   (yes)   (never) (100)
 # ==========================================================================
 smtp      inet  n       -       n       -       -       smtpd
 
 ## amavisとの連携オプションを指定する。
 ## サーバの性能によってプロセス数を調整する(今のPCスペックならこのまま記載する)。
 amavis    unix  -       -       n       -       4       smtp
   -o smtp_data_done_timeout=1200
   -o smtp_send_xforward_command=yes
   -o disable_dns_lookups=yes
 
 ## TLS認証やSASL-AUTHの使用設定を行う。
 ## 今回の構成ならyesにする必要がある。
 smtps     inet  n       -       n       -       -       smtpd
   -o smtpd_tls_wrappermode=yes
   -o smtpd_sasl_auth_enable=yes
 
 pickup    fifo  n       -       n       60      1       pickup
 cleanup   unix  n       -       n       -       0       cleanup
 qmgr      fifo  n       -       n       300     1       qmgr
 tlsmgr    unix  -       -       n       300     1       tlsmgr
 rewrite   unix  -       -       n       -       -       trivial-rewrite
 bounce    unix  -       -       n       -       0       bounce
 defer     unix  -       -       n       -       0       bounce
 trace     unix  -       -       n       -       0       bounce
 verify    unix  -       -       n       -       1       verify
 flush     unix  n       -       n       1000?   0       flush
 proxymap  unix  -       -       n       -       -       proxymap
 proxywrite unix -       -       n       -       1       proxymap
 smtp      unix  -       -       n       -       -       smtp
 relay     unix  -       -       n       -       -       smtp
 showq     unix  n       -       n       -       -       showq
 error     unix  -       -       n       -       -       error
 retry     unix  -       -       n       -       -       error
 discard   unix  -       -       n       -       -       discard
 local     unix  -       n       n       -       -       local
 virtual   unix  -       n       n       -       -       virtual
 lmtp      unix  -       -       n       -       -       lmtp
 anvil     unix  -       -       n       -       1       anvil
 
 ## amavisでスキャンを行ったメッセージのサーバ(MTA)内受信ポートを指定する。
 ## 今回は1台の物理サーバで全てのメール転送プロセスを処理している為、
 ## "localhost"の"10025ポート"で受信する様に設定してある。
 ## また、mynetworksを指定し信頼するネットワークの指定も行う。
 ## 他のパラメータについては、必要に応じて適宜設定を行う。
 localhost:10025 inet   n       -       n       -       -       smtpd
   -o content_filter=
   -o smtpd_client_restrictions=
   -o smtpd_helo_restrictions=
   -o smtpd_sender_restrictions=
   -o smtpd_recipient_restrictions=permit_mynetworks,reject
   -o smtpd_restriction_classes=
   -o mynetworks=192.168.0.0/24,127.0.0.1/32
   -o smtpd_error_sleep_time=0
   -o smtpd_soft_error_limit=1001
   -o smtpd_hard_error_limit=1000
   -o local_recipient_maps=
   -o relay_recipient_maps=
 
 scache    unix  -       -       n       -       1       scache
 
 ## userには、main.cfの$home_mailboxディレクトリへの書き込み権限のある、"Postfixサーバ上のユーザ"を指定する。
 ## 今回はPostfixAdminとの連携を行うので、PostfixAdminで指定したユーザと同じものにする。
 procmail  unix  -       n       n       -       -       pipe
   flags=R user=postfixadmin argv=/usr/bin/procmail -t -m USER=${user} DOMAIN=${nexthop} EXTENSION=${extension} /etc/procmailrc
~

&size(16){&font(b){/etc/sysconfig/postfix};};
OSのディストリビューションによっては編集する必要がある。
基本はデフォルト値にして、Postfixのコンフィグで設定を書いていく方が後々楽になる。
 POSTFIX_RELAYHOST=""
 
 POSTFIX_LISTEN=""
 
 POSTFIX_INET_PROTO=""
 
 POSTFIX_MYHOSTNAME=""
 
 POSTFIX_MASQUERADE_DOMAIN=""
 
 POSTFIX_LOCALDOMAINS=""
 
 POSTFIX_NULLCLIENT="no"
 
 POSTFIX_DIALUP="no"
 
 POSTFIX_NODNS="no"
 
 POSTFIX_CHROOT="no"
 
 POSTFIX_UPDATE_CHROOT_JAIL="no"
 
 POSTFIX_WITH_LDAP="no"
 
 POSTFIX_WITH_MYSQL="no"
 
 POSTFIX_MYSQL_CONN="socket"
 
 POSTFIX_LAPTOP="no"
 
 POSTFIX_UPDATE_MAPS="yes"
 
 # デフォルト値の末尾に"helo_access relay"を追記
 POSTFIX_MAP_LIST="virtual transport access canonical sender_canonical relocated sasl_passwd:600 relay_ccerts helo_access relay"
 
 POSTFIX_TRANSPORT_MAPS=""
 
 POSTFIX_RBL_HOSTS=""
 
 POSTFIX_BASIC_SPAM_PREVENTION="off"
 
 POSTFIX_SMTPD_CLIENT_RESTRICTIONS=""
 
 POSTFIX_SMTPD_HELO_RESTRICTIONS=""
 
 POSTFIX_SMTPD_SENDER_RESTRICTIONS=""
 
 POSTFIX_SMTPD_RECIPIENT_RESTRICTIONS=""
 
 POSTFIX_MDA="local"
 
 POSTFIX_SMTP_AUTH_SERVER="no"
 
 POSTFIX_SMTP_AUTH="no"
 
 POSTFIX_SMTP_AUTH_OPTIONS=""
 
 POSTFIX_SMTP_TLS_SERVER="no"
 
 POSTFIX_SMTP_TLS_SERVER_LEGACY_SUPPORT="no"
 
 POSTFIX_SMTP_TLS_CLIENT="no"
 
 
 
 ##
 ## 以下、SSLファイルの指定は"main.cf"の設定値の方が優先されるのでデフォルトのままでok
 ##
 
 POSTFIX_SSL_PATH="/etc/postfix/ssl"
 
 POSTFIX_TLS_CAFILE="cacert.pem"
 
 POSTFIX_TLS_CERTFILE="certs/postfixcert.pem"
 
 POSTFIX_TLS_KEYFILE="certs/postfixkey.pem"
 
 
 
 ##
 ## [修正箇所] - SSL証明書作成時に入力した(する)値を設定する
 ##
 
 # SSL証明書の"Country Name"の値 = 日本ならJP
 POSTFIX_SSL_COUNTRY="JP"
 
 # SSL証明書の"State or Province Name"の値 = 都道府県
 POSTFIX_SSL_STATE="Tokyo"
 
 # SSL証明書の"Locality Name"の値 = 市区町村。個人鯖とかで書きたくなかったら"*"とか"-"とか"."で埋める
 POSTFIX_SSL_LOCALITY="-"
 
 # SSL証明書の"Organization Name"の値 = 組織名。個人鯖ならドメイン名とかが良
 POSTFIX_SSL_ORGANIZATION="hoge.org"
 
 # SSL証明書の"Organizational Unit Name"の値 = 組織内での申請部署名。個人鯖とかで書く必要なかったら"*"とか"-"とか"."で埋める
 POSTFIX_SSL_ORGANIZATIONAL_UNIT="-"
 
 # SSL証明書の"Common Name"の値 = Postfixの稼働するマシンのFQDNを書く。必ず、メール送受信に使用するFQDNを書く事
 POSTFIX_SSL_COMMON_NAME="mail.hoge.org"
 
 # SSL証明書の"Email Address"の値 = ドメインのオーナーアドレスをを書く
 POSTFIX_SSL_EMAIL_ADDRESS="hoge-owner@mail.hoge.org"
 
 # メールボックスの容量リミットを無制限にする
 POSTFIX_ADD_MAILBOX_SIZE_LIMIT="0"
 
 # メール一通の容量リミットを無制限にする
 POSTFIX_ADD_MESSAGE_SIZE_LIMIT="0"
 
 # サービスロケーションプロトコルの切り替え。デフォルト値(yes)を推奨
 POSTFIX_REGISTER_SLP="yes"
 
 # Postfixの稼働するサーバでのネットワークスタイルを書く。普通は"subnet"を指定する
 POSTFIX_ADD_MYNETWORKS_STYLE="subnet"
~
*メールディレクトリ [#i4e72752]
メール保存用ディレクトリを作成してパーミッションも設定する
 # mkdir /var/hoge/mail-spool
 # chown postfixadmin.postfix /var/hoge/mail-spool
 # chmod 750 /var/hoge/mail-spool
~
*起動設定 [#ff2fda5b]
yastやchkconfigを使って自動起動の設定を行う。
-yast
 # yast
     [System] -> [Services Manager] -> [postfix] -> "Enabled"

-chkconfig
 # chkconfig postfix on

-init.d
 ●起動
 # /etc/init.d/postfix start
 
 ●停止
 # /etc/init.d/postfix stop
 
 ●再起動
 # /etc/init.d/postfix restart