nakamurakko’s blog

仕事で覚えたこと、勉強したことを自分のメモ代わりに書いていこうかなと。

Postfix に群がる迷惑メールを追い払う

環境

  • 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_limitsmtpd_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_requiredyes にして、挨拶(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

後は、日々メールログを確認して、問題があれば調整する。