web-dev-qa-db-ja.com

Postfix:指定したIPアドレス範囲からのみSMTP AUTHを許可する

実装できますか IPアドレスベースの制限 にとって PostfixのSMTPAUTH

シナリオ:インターネット全体からメールを受信するPostfixメールサーバーを実行しています。ただし、サーバーはメールを受信するだけでなく、認証されたユーザーが内部ユーザーまたは外部ユーザーにメールを送信することもできます。これまでのところ問題ありません。

残念ながら、ログファイルを読むときはいつも少し怖いです。世界中のIPアドレスから毎日、何千回も失敗した不正なログイン試行が行われています。

しかし実際には、正当な送信者ホストは、少数の既知のIPアドレス範囲からのみ取得されます。だから私は知っています のみ (例えば)からの誰か

  • 134.500.0.0/16
  • 134.700.42.0/24
  • 134.800.133.7

かもしれない 正当な送信者でさえあります。 (上記の例で示したIPアドレスの形式が正しくないことはわかっています。実際のIPアドレスを公開したくありませんでした。)

したがって、送信者が別のIP範囲から来ている場合、彼は確かに私のユーザーの誰もいないので、何も中継することを許可されていません。

これらのサブネットの外部の誰かが中継できるようにしたくない さえ SMTP AUTHの有効なユーザー名/パスワードの組み合わせを見つけた場合。ホワイトリストに登録されていないIPアドレス範囲のユーザーである場合は、送信しないでください。いかなる状況下で。そう permit_sasl_authenticatedだけでは不十分です。からの誰か限り 「特定の」 国(明示的に名前を付けたくありません...)は、盗まれた/ブルートフォース/スパイされた資格情報でログインできますが、十分に安全ではありません。 :-)(ソーシャルエンジニアリング、アカウントデータを盗むトロイの木馬のキーロガー、推測しやすいパスワードを持った頭のふらつきのあるユーザーなどを考えてみてください)

=>では、SMTP AUTHログイン試行にIPアドレス制限を実装することは可能ですか? (受信メールの受信はこれによって影響を受けてはなりません。そのために私はpolicyd-weightなど。ここでは、送信/中継メールについてのみ説明します。)

そのソリューション 動かない

  • iptablesファイアウォールの制限。インターネット全体からポート25でメールを受信できるようにしたいので、トランスポート層レベルの制限を実装できません。 -さらに、正規のユーザーがポート25に接続して、サーバーへの新しい送信メールを許可できるようにしたい。したがって、サブネット制限付きミステリーtcpポートを介したメール送信のみを許可します。 24343も解決策ではありません。
  • permit_mynetworks:既知のIP範囲の全員が正当なユーザーであるとは限りません。だから私はそこからの全員に送信を許可することはできません。誰かが許可されたユーザーであるかどうかを判断するには、SMTPAUTHログインが必要です。
2
MrSnrub

SMTP AUTHを587などの別のポートに配置し、iptablesを使用してそのポートへのアクセスを制限してみませんか? 587は隠しポートではなく、RFCで定義されたメール送信ポートです。あなたへのメールは25日に到着し、あなたを介したメールは587を超える必要があります。

http://tools.ietf.org/html/rfc6409

4
NickW

smtpd_sasl_exceptions_networks の否定形式を使用します。

smtpd_sasl_exceptions_networks = !134.500.0.0/16 !134.700.42.0/24 !134.800.133.7

smtpd_client_connection_rate_limit にも興味があるかもしれません。

1
84104

[〜#〜] ossec [〜#〜] のようなHIDSを使用して、ログインしようとしたIPを一時的にブロックすることをお勧めします。OSSECにルールを追加して、信頼できるネットワークを除外することもできます。このルールにより、正当なユーザーが数回試行してもブロックされません。

Postfixにはmy_networksとSASLを補完する方法が実際にはないと思うので、これを提案しています。

0
Lucas Kauffman

世界中のIPアドレスから毎日何千もの失敗した違法なログイン試行があります。

fail2banをインストールし、既存のフィルターを微調整するか、新しいフィルターを作成してこれらをトラップします。私が使う:

failregex =\[<Host>\]\: SASL LOGIN authentication failed
0
Chris