環境
- CentOS 8
- Postfix 3.3.1
現状
自前のサーバーでメールを使えるように Postfix を導入したメールサーバーを作っていて、 main.cf
には smtpd_recipient_restrictions を設定して迷惑メールを弾いていた。
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
が、しかし、 postfix-perl-scripts でメールログを確認すると、rejectedの大量発生を確認。しかも毎日。
Postfix log summaries for May 10 Grand Totals ------------ messages 9 received 9 delivered 0 forwarded 0 deferred 0 bounced 240 rejected (96%) 0 reject warnings 0 held 0 discarded (0%)
この日は240件rejected!
smtpd_recipient_restrictions
に、認証できたものだけメール送信できるように書いているけど、ホワイトリストやブラックリストを書いていないから突破出来ないかガンガン試しているのだろう。
RCPT 550 5.1.1 <xxx@nakamurakko.net>: Recipient address rejected: User unknown in local recipient table; from=<xxxxxxxxxxxx@xxxx-xxx.org> to=<xxx@nakamurakko.net> proto=ESMTP helo=<[xx.xxx.xxx.xxx]> (total: 1) 1 xx.xxx.xxx.xxx
のようなログが出ているので、ドメイン、IPアドレスをブロックすれば良さそうだけど、
- 間違えて必要なものまでブロックしてしまったら困る。
- IPアドレスをブロックした場合、迷惑メール業者がそのIPアドレスを手放して、まともな人が使い始めたらブロック解除しなければいけないのでは?(いつ所有者変更が分かる?)
とか思っていたら手を付けられなかった…。
今回、メールサーバーを作る機会があったので、踏み台にしようとする輩を減らせないか、再度調べてみた。
調査
smtpd_relay_restrictions
まず、 smtpd_recipient_restrictions
で許可、拒否を設定していたけど、最近は使わないらしい。
参考 | URL |
---|---|
smtpd_recipient_restrictions の危険な利用法 - Postfix SMTP リレーおよびアクセス制御 | http://www.postfix-jp.info/trans-2.1/jhtml/SMTPD_ACCESS_README.html#danger |
Postfix 2.10 の smtpd_relay_restrictions 新設の背景 - Postfix Advent Calendar 2014 - ダメ出し Blog | https://fumiyas.github.io/2014/12/05/smtpd_relay_restrictions.postfix-advent-calendar.html |
Postfix 2.10 から中継制限の設定が変わった (smtpd_recipient_restrictions はダメ)! - yuumi3のお仕事日記 | http://yuumi3.hatenablog.com/entry/20130916/1379320836 |
なるほど、危険らしい…。
ということで、上記のサイトを参考に smtpd_recipient_restrictions
から smtpd_relay_restrictions
に書き換えた。
smtpd_relay_restrictions = permit_sasl_authenticated, defer_unauth_destination
デフォルトだと先頭に permit_mynetworks
が設定されているけど、今回は消した(認証したユーザーしか許可しない!)。問題が出た時に再度調査、検討する。
また、defer_unauth_destination は Postfix 2.10 以降で使用可能なので、バージョンを確認してから設定する。(今回は 3.3.1 なので大丈夫。)
設定を追加 (死なばもろとも)
smtpd_relay_restrictions
に書き換えただけでは迷惑メールを試す輩が減るわけではないので、不正使用しようとしてる場合は遅延させられないか Postfix のヘルプサイトで「sleep」で検索してみたら、 smtpd_error_sleep_time に、下記の記述があった。
Postfix 2.1 以降: メールの配送なしで クライアントが $smtpd_soft_error_limit 以上 $smtpd_hard_error_limit 以下のエラーを 出した後に入れる、SMTP サーバ応答の遅延。
Postfix 2.0 以前: メールの配送なしで クライアントが $smtpd_hard_error_limit 以下のエラーを出した際に拒否 (4xx または 5xx) 応答を送る前に入れる、SMTP サーバの遅延。
なるほど、設定しよう。合わせて、 smtpd_soft_error_limit
、 smtpd_hard_error_limit
も設定する。
smtpd_error_sleep_time = 600s smtpd_soft_error_limit = 2 smtpd_hard_error_limit = 2
「エラーの許容は2にして、エラーが許容値を超えたら10分間遅延させる」ということにした。 smtpd_error_sleep_time
を10分とするのは、踏み台に仕様とする側も困るだろうけど、サーバー側も負担になるため(死なばもろとも!)、調整が必要だと思う。
(参照: SMTP サーバプロセスをより多く働かせる)
さらに設定を追加 (挨拶励行)
smtpd_helo_required を yes
にして、挨拶(HELO EHLO)必須にした。
smtpd_helo_restrictions には、挨拶が変な輩、所在が怪しい輩は拒否することにした。
smtpd_helo_required = yes smtpd_helo_restrictions = reject_invalid_hostname, reject_non_fqdn_hostname, reject_unknown_hostname
結果
最終的に main.cf
は下記の設定にした。
# 削除 # smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination # 追加 smtpd_helo_required = yes smtpd_helo_restrictions = reject_invalid_hostname, reject_non_fqdn_hostname, reject_unknown_hostname smtpd_relay_restrictions = permit_sasl_authenticated, defer_unauth_destination smtpd_error_sleep_time = 600s smtpd_soft_error_limit = 2 smtpd_hard_error_limit = 2
翌日以降のメールログを確認すると、rejectedの件数が1桁に減っていたので、成功と思いたい。
Grand Totals ------------ messages 2 received 2 delivered 0 forwarded 0 deferred 0 bounced 2 rejected (50%) 0 reject warnings 0 held 0 discarded (0%) 14583 bytes received 14583 bytes delivered 2 senders 2 sending hosts/domains 1 recipients 1 recipient hosts/domains
後は、日々メールログを確認して、問題があれば調整する。