Postfixの主な設定ファイルは、/etc/postfix/main.cfと/etc/postfix/master.cfの2つです。 ここではそのうちの1つのmain.cfの設定パラメータについて説明します。
main.cfはメール配送の動作を決定する重要なファイルです。 main.cfには多くの設定パラメータがありますが、メールを送受信できるようにするだけなら、 少しのパラメータを変更してあげれば動きます。 Postfixはデフォルトの設定でもスパムメールなどをオープンリレーしないように、 比較的安全な設定になっていますが、必ずしもそれがそれぞれの環境にとって最良かはわかりません。 そのためいずれ設定パラメータの見直しは必要になってくると思われます。
ここでは重要と思われるパラメータを紹介します。 全てのパラメータの詳細はPostfixのドキュメントを確認してください。
パラメータを変更する前に
実際にパラメータを変更する前に知っておくべきいくつかの事柄について先に説明しておきましょう。
main.cfの書式
まず、main.cfmain.cfの書き方を確認しておきましょう。main.cfの書式は次の通りです。
パラメータ = 設定値
- 「=」の前後の空白は無視されますので空白があってもかまいません。
- 「#」で始まる行はコメントです(#の前に空白文字があっても良い)。
- 行頭に空白文字がある場合、前の行の続きとみなされます。
- 「$パラメータ」、「$(パラメータ)」、「${パラメータ}」で、以前の設定を参照できます。
- 複数の設定値を指定する場合は、通常、空白かカンマで区切ります。
設定を再読み込みする
main.cfを編集して設定を変更したら、設定を読み込み直す必要があります。 それには次のようなコマンドを実行します。
# postfix reload
設定を反映するためにPostfixの再起動が必要なパラメータもあります。 その場合はpostfixコマンドで停止・起動を実行します。
# postfix stop # postfix start
システムのやり方でPostfixを再起動しても良いでしょう。RedHat系ならserviceやsystemctlコマンドなどでPostfixを再起動します。
Postfixの設定をコマンドで確認する
Postfixの現在の設定はpostconfコマンドで確認できます。 引数なしでpostconfコマンドを実行すると、 main.cfの設定パラメータとその値を一覧表示します。
# postconf
-dオプションを使うと設定パラメータとそのデフォルト値を一覧表示します。
# postconf -d
main.cfで上書きされた設定を確認するには-nオプションを指定して実行します。
# postconf -n
main.cfの設定パラメータ
ここからは実際にmain.cfの設定パラメータについて見ていきます。 メールを送受信するために必須なパラメータと重要なパラメータのいくつかを説明します。 実際に設定する場合は、セキュリティに関わる部分なのでドキュメントによく目を通してください。
- myhostname
-
サーバのホスト名をFQDN(完全修飾ドメイン名)で指定する。
myhostname = mail.example.com
- mydomain
-
サーバが属するドメイン名を指定する。
mydomain = example.com
- myorigin
-
ローカルで投函されたメールがどのドメインから来た様に見えるかを指定する。
通常、$myhostname か $mydomain を指定する。これは、送信者のアドレスがユーザ名のみの場合、
「<ユーザ名>@<myoriginの値>」の様に@以降に設定値が補完される。
受信者のアドレスも同様にユーザ名だけであれば同様に補完される。
ローカルなユーザ同士で送信者と受信者のアドレスにユーザ名のみを指定して動作確認すると良い。
myorigin = $mydomain
- inet_interfaces
-
Postfixがlistenするネットワークインターフェイスを指定する。
「all」を指定すると全てのインターフェイスで接続を待ち受ける。
inet_interfaces = all
- inet_protocols
-
通信に使用するIPのバージョンを指定する。
設定値がipv4、ipv6のときはそれぞれIPv4とIPv6を表す。
allの指定はOSがIPv6をサポートしていれば「ipv4,ipv6」と同じ、
サポートしていなければ「ipv4」だけを指定した場合と同じである。
IPv4とIPv6の両方が有効な場合、まずIPv6の接続を試みる。
inet_protocols = ipv4
- mydestination
-
このマシンが他のマシンにリレーせずにローカルに配送するドメインを指定する。 つまりこのマシンで受信するメールのドメインを指定する。 ドメインはいくつかの方法で指定できるが、もっとも簡単なのは ドメインを空白かカンマで区切って指定する方法である。
$myhostnameやlocalhost.$mydomainを含む、 このマシンの全てのホスト名をリストアップしなければメール配送のループが発生する恐れがある。 ループが発生するのは、本来ローカルに配送されるべきメールがリレーされ、 そのメールがまたマシンに戻ってきてしまうからだと思います。
DNSで複数のAレコードを登録している場合は、すべてのAレコードのホスト名も登録する必要がある。
下記にいくつか例を示す。 ドメイン全体のメールサーバの場合、XXX@mail.example.comだけでなく XXX@example.comのメールも受け取れるようにするには $mydomain も含める必要がある。
# デフォルト設定 mydestination = $myhostname localhost.$mydomain localhost # ドメイン全体のメールサーバの場合 mydestination = $myhostname localhost.$mydomain localhost $mydomain
DNSで複数のAレコードを持つ場合、例えば$myhostname以外にwww.$mydomain やftp.$mydomainもAレコードに登録されている場合はそれらもリストする。
mydestination = $myhostname localhost.$mydomain localhost www.$mydomain ftp.$mydomain $mydomain
- mynetworks_style
-
指定されたネットワークブロックのクライアントのみ転送を許可する。 mynetworks_styleを使うと、自分のネットワーク情報からPostfix が動的にmynetworksを設定する。
「host」を指定するとローカルマシンからのメールのみ転送を許可する。 「subnet」を指定するとローカルマシンが接続されているサブネットワークに属する 全てのクライアントからのメールの転送を許可する。
したがってmynetworks_styleの設定の変更やネットワークの設定を変更すると$mynetworksの設定も変わることに留意する。 実際のmynetworksの値はpostconfコマンドで確認できる。 このパラメータはmynetworksを「明示的」に設定した場合は無視される。
- mynetworks
-
指定されたネットワークブロックのクライアントのみ転送を許可する。 これはCIDR形式で指定する。
この設定で許可されたIPアドレスからのメールは、 どのドメイン宛てのメールであっても無条件でリレーを許可します。 たとえrelay_domainsの設定がされていても、 無視してどのドメイン宛てのメールもリレーするので注意が必要です。
また、mynetworksを「明示的」に設定するとmynetworks_styleの設定は無視されます。
- relay_domains
-
このマシンがリレーする配送先のドメインを指定する。 デフォルト値は$mydestinationである。
mynetworksに指定されたIPアドレスからのメールは、 ここで設定されていても無条件にリレーが許可されるので注意。
空欄にすると他のホストからのメールをリレーしない。 このマシンでのみメールを送受信する環境では第三者リレーをしないように空欄を設定した方が良い。
relay_domains =
- smtpd_reject_unlisted_recipient (デフォルト:yes)
-
明示的にreject_unlisted_recipientアクセス制限が指定されていない場合でも、不明な受信者アドレス宛のメールを拒否する。これにより、Postfixキューが配信不能なMAILER-DAEMONメッセージでいっぱいになるのを防ぎます。
アドレスは、virtualエイリアスまたはcanonicalマッピングにマッチする場合、常に「既知」と見なされます。
- 受信者ドメインが$mydestination、$inet_interfaces、または$ proxy_interfacesにマッチするが、受信者は$local_recipient_mapsにリストされておらず、$local_recipient_mapsは空ではない。
- 受信者のドメインが$virtual_alias_domainsにマッチするが、受信者が$virtual_alias_mapsにリストされていない。
- 受信者のドメインが$virtual_mailbox_domainsにマッチするが、受信者は$virtual_mailbox_mapsにリストされておらず、$virtual_mailbox_mapsが空ではない。
- 受信者ドメインが$relay_domainsにマッチするが、受信者が$relay_recipient_mapsにリストされておらず、$ relay_recipient_mapsが空ではない
smtpd_reject_unlisted_recipient = yes
- smtpd_banner
-
SMTPの220応答コードの後に出力されるバナー情報を指定する。 デフォルトでは「$myhostname ESMTP $mail_name」で、バージョン番号は表示しない。 $myhostnameはSMTPでは必須とされているので指定する必要がある。
「Postfix」と表示しないようにするには、次のように設定する。
smtpd_banner = $myhostname ESMTP
- disable_vrfy_command
-
yesを指定するとSMTP VRFYコマンドを無効にする。 デフォルト値はnoである。
VRFYコマンドが有効だと不正なメールアドレス収集に使われることがあるので、 一般的には無効にした方が良いとされる。
disable_vrfy_command = yes
- smtpd_delay_reject(デフォルト:yes)
-
$smtpd_client_restrictions、$smtpd_helo_restrictions、および$smtpd_sender_restrictionsの評価をRCPT TOコマンドまで待ちます。または、$smtpd_client_restrictionsおよび$smtpd_helo_restrictionsの評価をETRNコマンドまで待ちます。
Postfix SMTPサーバーがRCPT TOの前にコマンドを拒否すると、一部のクライアントが明らかに誤動作するため、この機能はデフォルトでオンになっています。
デフォルト設定には1つの大きな利点があります。クライアントの名前やアドレス、または送信者アドレスを拒否する場合、Postfixが受信者アドレス情報をログに記録できるため、拒否されているメールを見つけることができます。
- home_mailbox(デフォルト:空)
-
home_mailboxは、メールをmbox形式またはMaildir形式で格納する。ホームディレクトリの下のファイル名あるいはディレクトリ名を指定します。mbox形式の場合は「home_mailbox = ファイル名」とします。Maildir形式の場合は「home_mailbox = ディレクトリ名/(最後は/で終わる必要がある)」とします。デフォルトではmbox形式で「/var/mail/ユーザ名」のファイルに格納されます。
home_mailbox = Mailbox home_mailbox = Maildir/
アクセス制御のパラメータ
これ以降に説明するパラメータはアクセス制御のためのパラメータです。 アクセス制御はスパムメール対策に有効ですが、 正規のメールも拒否してしまう恐れがあるので、設定する場合は注意深く設定する必要があります。 正規のメールが拒否される理由としては、クライアントのサーバ設定が正しくなかったり、 RFCなどの標準仕様通りに、正しく実装されていない場合などが原因となるようです。
アクセス制御のパラメータの設定値は空白かカンマで区切って複数指定できます。 複数指定された場合、制限は左から指定された順に調べられ、 最初にマッチした制限が適用されます。
- smtpd_client_restrictions (default: empty)
-
SMTPサーバがクライアントからSMTP接続の要求を受けたときに適用する制限。 デフォルトは全ての接続要求を許可します。
複数の制限を指定するにはカンマや空白で区切ります。次の行を空白で開始して、長い行を続けることができます。制限は指定された順序でチェックされ、最初に一致した制限が適用されます。
- permit_inet_interfaces
- クライアントIPアドレスが$inet_interfacesにマッチすればリクエストを許可する
- permit_mynetworks
- クライアントのIPアドレスが$mynetworksにリストされたネットワークアドレスにマッチすればリクエストを許可する
- permit_sasl_authenticated
- クライアントがSASL認証(SMTP Auth)の認証に成功したなら、リクエストを許可する
- reject_unknown_client_hostname
-
次の1つでも当てはまる場合は要求を拒否する。
- クライアントのIPアドレスからホスト名への逆引き失敗する
- ホスト名からIPアドレスへの正引きに失敗する
- ホスト名からIPアドレスへの正引きの結果のIPアドレスがクライアントのIPアドレスと一致しない
正当なメールでも1つ以上に当てはまる場合があるので、設定するときは注意する必要がある。
- reject_unknown_reverse_client_hostname
- クライアントのIPアドレスからホスト名への逆引き失敗する場合に要求を拒否します。 つまりreject_unknown_client_hostnameの1つ目の条件だけで要求の判定をするので reject_unknown_client_hostnameより制限が緩くなります。 正当なメールでも拒否してしまう可能性があることは同様です。
これ以降の制限はアクセス制御の「一般的な制限」で、全てのSMTPコマンドの制限(アクセス制御)でも使用できる。
- defer
- 要求を遅延する。クライアントは後で再試行するように指示される。 制限リストの最後に指定して、いずれの制限にもマッチしなかった場合のデフォルトの制限として使う。
- permit
- 要求を許可する。制限リストの最後に指定して、 いずれの制限にもマッチしなかった場合のデフォルトの制限として使う。
- reject_plaintext_session
- 接続が暗号化されていない場合に要求を拒否する。 これはクライアントがAUTHまたはSTARTTLSコマンドを使用して 暗号化をネゴシエーションする前に使ってはいけない。
- reject
- 要求を拒否する。制限のリストの最後に指定して、 いずれの制限にもマッチしなかった場合のデフォルトの制限に使う。
「smtpd_delay_reject = yes」の場合、$smtpd_client_restrictionsはRCPT TOコマンドの時点で評価されるので、 上記のほか、smtpd_helo_restrictions、smtpd_sender_restrictions、またはsmtpd_recipient_restrictionsパラメータのところで説明されているSMTPコマンド固有の制限も使用することができます。
- smtpd_helo_restrictions (default: empty)
-
クライアントからのHELOコマンドのときに適用する制限。 デフォルトは全てを許可します。
この制限を完全に強制するために「smtpd_helo_required = yes」を指定する必要がる。 そうしないと、クライアントがHELOまたはEHLOを送信しないことで smtpd_helo_restrictionsの制限をスキップできてしまう。
以下の制限はHELOまたはEHLOコマンドで受け取ったホスト固有の制限です。
- reject_invalid_helo_hostname
- HELOまたはEHLOのホスト名が不正な形式の場合はリクエストを拒否します。
- reject_non_fqdn_helo_hostname
- HELOまたはEHLOのホスト名がFQDNかIPアドレス形式でなければ、リクエストをリジェクトする。
- reject_unknown_helo_hostname
- HELOまたはEHLOのホスト名がDNSのAレコードまたはMXレコードを持たない場合は、 リクエストをリジェクトする。
他で説明されている制限もこのコンテキストで使用可能です。
- smtpd_client_restrictionsで説明されたSMTPコマンドの「一般的な制限」
- smtpd_client_restrictionsで説明されたクライアントのホスト名やネットワークアドレス固有の制限
- 「smtpd_delay_reject = yes」を指定した場合は、 $smtpd_helo_restrictionsがRCPT TOコマンドのときに評価されるので、 smtpd_sender_restrictions、smtpd_recipient_restrictions で説明したSMTPコマンド固有の制限も使用可能です。
- smtpd_sender_restrictions (default: empty)
-
クライアントからのMAIL FROMコマンドのときに適用される制限。 デフォルトは全てを許可します。
以下の制限はMAIL FROMコマンドで受け取った送信者アドレスに固有のものです。
- reject_authenticated_sender_login_mismatch
- 認証されたクライアントだけ、reject_sender_login_mismatchの制限を強制します。
- reject_known_sender_login_mismatch
- $smtpd_sender_login_maps で認識されるMAIL FROMのアドレスにだけreject_sender_login_mismatchの制限を適用します。
- reject_non_fqdn_sender
- MAIL FROMアドレスに、RFCで要求されるFQDN形式ではないドメインが指定された場合、 リクエストを拒否します。
- reject_sender_login_mismatch
- MAIL FROMのアドレスのオーナーが$smtpd_sender_login_mapsに指定されているが、 クライアントがそのMAIL FROMアドレスのオーナーでSASLにログインしていない場合、 またはクライアントのログイン名が$smtpd_sender_login_mapsに指定されたMAIL FROMアドレスを所有していない場合、リクエストを拒否します。
- reject_unauthenticated_sender_login_mismatch
- 認証されていないクライアントだけ、reject_sender_login_mismatchの制限を強制します。
- reject_unknown_sender_domain
-
MAIL FROMのドメインがDNSのMXやAレコードを持たないか、 MXレコードが不正な形式の場合リクエストを拒否する。
送信者アドレスの最終的な宛先がPostfixではなく、MAIL FROMドメインが以下の場合にリクエストを拒否します
- DNS MXやDNS Aレコードを持たない
- または不正な形式のMXレコードを持つ
- reject_unlisted_sender
- MAIL FROMアドレスがそのドメインクラスに対する有効な受信者のリストにない場合、リクエストを拒否します。
他の制限もこのコンテキストで使用できます。
- smtpd_client_restrictionsで説明されたSMTPコマンドの「一般的な制限」
- smtpd_client_restrictionsとsmtpd_helo_restrictions で説明したSMTPコマンド固有の制限
- smtpd_recipient_restrictionsで説明されたSMTPコマンド固有の制限。 smtpd_sender_restrictionsに受信者の制限がリストされた場合、 $smtpd_sender_restrictionsがRCPT TOコマンドのときに評価できるように、 「smtpd_delay_reject = yes」も指定された場合だけに効果がある。
- smtpd_recipient_restrictions (default: see "postconf -d" output)
-
クライアントのRCPT TOコマンドのとき(smtpd_relay_restrictions適用の後)に適用される制限。
Postfix 2.10より前のバージョンでは、リレー許可やスパムのブロックのルールは smtpd_recipient_restrictionsの複数の設定の組み合わせて行うため、 エラーになりやすい設定でした。 Postfix 2.10以降は、リレー許可のルールはsmtpd_relay_restrictions でなるべく行います。そのため、smtpd_recipient_restrictions の設定では許可されたスパムブロックポリシーはもはやメールリレーポリシー を許可する結果にはなりません。
重要:smtpd_relay_restrictionsまたはsmtpd_recipient_restrictions のいずれかのパラメーターで、少なくとも次の制限の一つを指定する必要があります。 さもなければPostfixは受信メールを拒否します。
reject, reject_unauth_destination defer, defer_if_permit, defer_unauth_destination
制限のリストはカンマや空白で区切って指定します。次の行を空白で開始して、長い行を続けることができます。制限は指定された順序でチェックされ、最初に一致した制限が適用されます。
次の制限はRCPT TOコマンドで受け取った受信者アドレスに特有の制限です。
- permit_auth_destination
-
次のいずれか一つに該当すればリクエストを許可する。
- メールをリレーする場合: 解決されたRCPT TOのドメインが、$relay_domainsかそのサブドメインにマッチし、 そのアドレスが送信者指定ルーティング(user@elsewhere@domain)を含まない。
- Postfixが最終的な宛先の場合: 解決されたRCPT TOのドメインが、$mydestination、$inet_interfaces、$proxy_interfaces、 $virtual_alias_domains、または$virtual_mailbox_domainsにマッチし、 そのアドレスが送信者指定ルーティング(user@elsewhere@domain)を含まない。
- reject_non_fqdn_recipient
- RCPT TOアドレスに指定されたドメインがRFCで要求されるFQDN形式ではない場合、 リクエストを拒否する。
- reject_unauth_destination
-
次のいずれにも該当しなければリクエストを拒否する
- メールをリレーする場合: 解決されたRCPT TOのドメインが$relay_domainsかそのサブドメインにマッチし、 そのアドレスが送信者指定ルーティング(user@elsewhere@domain)を含まない。
- Postfixが最終配送先の場合: 解決されたRCPT TOのドメインが$mydestination、$inet_interfaces、$proxy_interfaces、 $virtual_alias_domains、または$virtual_mailbox_domainsにマッチし、 そのアドレスが送信者指定ルーティング(user@elsewhere@domain)を含まない。
- reject_unknown_recipient_domain
-
PostfixがRCPT TOのドメインに対する最終配送先ではなく、
かつRCPT TOドメインが次のいずれかの場合にリクエストを拒否する。
- DNSのMXレコードもAレコードも持たない。または
- 不正な形式なMXレコードを持つ場合
- reject_unlisted_recipient
- RCPT TOアドレスがそのドメインクラスに対する有効な受信者のリストにない場合、リクエストを拒否する。
次の制限もこのコンテキストで有効です。
- smtpd_client_restrictionsで説明した全てのSMTPコマンドコンテキストで使用可能な「一般的な制限」。
- smtpd_client_restrictions、smtpd_helo_restrictions、smtpd_sender_restrictions で説明したSMTPコマンド固有の制限。
- smtpd_relay_restrictions (default: permit_mynetworks、permit_sasl_authenticated、defer_unauth_destination)
-
SMTPサーバが RCPT TO コマンドの段階で、smtpd_recipient_restrictions より前に適用され、メールリレー制御のためのアクセスを制限する。
Postfix 2.10より前のバージョンでは、リレー許可やスパムのブロックのルールは smtpd_recipient_restrictionsの複数の設定の組み合わせて行うため、 エラーになりやすい設定でした。 Postfix 2.10以降は、リレー許可のルールはsmtpd_relay_restrictions でなるべく行います。 そのため、smtpd_recipient_restrictionsの設定では許可された スパムブロックポリシーはもはやメールリレーポリシーを許可する結果にはなりません。
重要:smtpd_relay_restrictionsまたはsmtpd_recipient_restrictions のいずれかのパラメーターで、少なくとも次の制限の一つを指定する必要があります。 さもなければPostfixは受信メールを拒否します。
reject, reject_unauth_destination defer, defer_if_permit, defer_unauth_destination
制限のリストはカンマや空白で区切って指定します。次の行を空白で開始して、長い行を続けることができます。制限は指定された順序でチェックされ、最初に一致した制限が適用されます。
制限にはsmtpd_recipient_restrictionsで説明した制限と同じものが使用可能です。
- smtpd_data_restrictions (default: empty)
-
SMTP DATAコマンドのときに適用されるアクセス制限。
他の制限もこのコンテキストで使用可能です。
- smtpd_client_restrictionsで説明した、全てのSMTPコマンドのコンテキストで使うことができる「一般的な制限」
- smtpd_client_restrictions、smtpd_helo_restrictions、smtpd_sender_restrictions、 またはsmtpd_recipient_restrictionsで説明したSMTPコマンド固有の制限
おわりに
ここで説明しただけでもかなりの量があったと思います。 これら以外にももっと多くの設定パラメータや値として設定できる項目があります。
しかし、前にも言ったようにPostfixはデフォルトでスパムメールなどに対して 比較的安全に動作しますので、それほど多くの設定をいじる必要はないかもしれません。
あまり色々な設定にこだわるよりも、間違った設定でセキュリティホールを作らないように することの方が大事かもしれません。
それでは、最後までお付き合いいただき、誠にありがとうございます。