Postfix:smtpd_*_restrictionsの設定
公式の解説
table:smtpd_*_restrictions
smtpd_client_restrictions 接続情報に対する制約 DATAコマンド時に判定
smtpd_helo_restrictions HELO/EHLO コマンド内容に対する制約
smtpd_etrn_restrictions ETRN コマンド内容に対する制約
smtpd_sender_restrictions FROM コマンド内容に対する制約
smtpd_recipient_restrictions RCPT TO コマンド内容に対する制約
smtpd_data_restrictions DATA コマンド実行可否に対する制約
smtpd_end_of_data_restrictions DATA コマンドのデータ転送完了時に行う制約
smtpd_relay_restrictions リレーに対する制約
ややこしいのは、以下の2点
事前に得られた情報も含めて判定する。
例えば、permit_mynetwork はIPアドレスを元に mynetwork に含まれる範囲であれば許可としている。
判定タイミングはそのコマンドなどを受信したタイミングではない。
"Delayed evaluation of SMTP access restriction lists"、「SMTP アクセス制御リストの評価を遅らせる」に詳細説明あり
マニュアルが良くないのは、smtpd_*_restrictions の各項目ごとにバラバラに書かれてしまっている点。
何が書けるのか。先に書いてある方から順に評価していく。
(順序は大事。優先度の高い順、細かな制約を先にして、大雑把な制約を後の方に書く。)
デフォルト(制約が何も書いていない場合)は permit。
table:restriction_type
permit すべて許可する。
reject すべて拒否する。
defer すべて一時拒否する。
defer_if_permit 以後、permit になったものを defer とみなす。
defer_if_reject 以後、reject になったものを defer とみなす。
permit_inet_interfaces クライアントのIPアドレスが $inet_interfaces にマッチすれば許可する。
permit_mynetworks クライアントのIPアドレスが $mynetworks にマッチすれば許可する。
permit_sasl_authenticated SASL認証通過したものは許可する。
permit_tls_all_clientcerts クライアント証明書で認証できたクライアントは許可する。
check_client_access クライアントのアドレスを type:table で評価する。
reject_unknown_client 逆引きできないクライアントを拒否する。
reject_invalid_hostname HELO での不正なホスト名を拒否する。
reject_non_fqdn_hostname HELO でのFQDNではないホスト名を拒否する。
reject_unknown_hostname HELO での名前解決できないホスト名を拒否する。
check_sender_access type:table FROM のアドレスを type:table で評価する。
reject_non_fqdn_sender FROM のアドレスでFQDNではないドメインを拒否する。
reject_unknown_sender_domain FROM のアドレスで名前解決できないドメインを拒否する。
check_recipient_access type:table RCPT TO のアドレス(文字列)を type:table で評価する。
check_recipient_a_access type:table RCPT TO のドメインのIPアドレスを type:table で評価する。
check_recipient_mx_access type:table RCPT TO のドメインのMXホスト名を type:table で評価する。
check_recipient_ns_access type:table RCPT TO のドメインのDNSホスト名を type:table で評価する。
check_recipient_maps RCPT TO のアドレスを「受信者マップ」で評価する。
permit_auth_destination RCPT TO の配送先が「認可された配送先」なら許可する。
reject_unauth_destination RCPT TO の配送先が「認可された配送先」以外なら拒否する。
defer_unauth_destination RCPT TO の配送先が「認可された配送先」以外なら一時拒否する。
check_policy_service 指定したポリシーサービスで評価する。
reject_rbl_client 指定した RBL にクライアントのIPアドレスがあれば拒否する。
reject_unauth_pipelining EHLO でパイプライン処理可能であることを知る前にパイプライン処理を行った場合に拒否する。
reject_plaintext_session 平文のセッションを拒否する。
check_recipient_maps は暗黙に設定されるとなっているが、正確な記述がないため意味不明になっている。
(どの制約に付く?)
認可された配送先
$relay_domains か、そのサブドメインにマッチし、かつ、配送先ルーティング(user@elsewhere@domain)を含まない場合
Postfix が最終配送先のとき。以下の4種類に含まれること。
$mydestination
$inet_interfaces
$virtual_alias_maps
$virtual_mailbox_domains
受信者マップ(check_recipient_maps と permit_auth_destination, reject_unauth_destination の違い)
check_recipient_maps は「受信者(user@domainのuser)」を含み、以下の4つのマップも対象となる。
$local_recipient_maps
$virtual_alias_maps
$virtual_mailbox_maps
$relay_recipient_maps
check_recipient_a_access はSPAMを送ってくるアドレス範囲が分かっているようなときに有効。
check_recipient_ns_access はホスト名やIPアドレスを変えつつ送ってくる SPAM に有効。
配送先ルーティング
user@elsewhere@domain は、domain にメールを送った後、その domain 内で、user@elsewhere を元にして elsewhere に配送する。
現在はまず使われない形式で、SPAM の要因にしかならないため、禁止するのが一般的。
本当に permit_mynetworks を無造作に付けてよいのか?
そもそも送信を submission ポートに制限したならば、アプリケーションやサブネット上のホストもそちらに送信すべきではないか?
たとえサブネット上のホストからの受信でも、SPAMなどのチェックを受けるべきではないか?
最悪、踏み台になってしまったときでも問題とならない。
Postfix 自身は自分から自分に SMTP 経由で配送しないはずなので、不要なはず。
マニュアルを読んでも意味不明になるのが OK, PERMIT あたりの設定
あるチェックで許可と拒否のどちらにもマッチしなかった場合はどうなるのか?
デフォルトで permit になっている。(何も書かなかったら許可だからそうならざるを得ない)
よって、最後に reject を書くことで判定にマッチしなかったものをすべて拒否できる。
複数のチェックがある。つまり、あるチェックで許可や拒否となっても次のチェックでは異なる結果を返すかもしれない。その場合どう考えれば良いのか?
リストの先頭から順に評価して、ヒットした時点で判定。
判定にマッチした時点で評価して終了。
判定にマッチしなかったら次のチェックに進む。
smtpd_*_restrictions はそれぞれ1つの判定用集合になっていて、全部の集合で拒否されなかった時に許可される。
実際の拒絶はDATAコマンドが実行される時まで遅延される。
PERMIT とかはどう書くのが正しいのか?
OK
PERMIT
DUNNO
table:result
OK
PERMIT
DEFER
数字3桁 メッセージ SMTPステータスコードとして数字3桁とメッセージを返す。
4xxは一時的エラー、5xxは永続的エラーとして処理する。