メールサーバへのSMTPサービス拒否攻撃への対処

スポンサーリンク
スポンサーリンク

メールサーバへのSMTPサービス拒否攻撃への対処方法です。

接続数を制限

あるIPアドレスからの、メールサーバへの接続数を制限します。
ここでいう「接続」は次のものです。
・あなたのメールサーバのアカウントへのメール配送の為の、他のメールサーバからの接続
・メール送信の為の、Thunderbird や Outlook 等のメールクライアントからの接続

/etc/postfix/main.cf

smtpd_client_message_rate_limit = 10
anvil_rate_time_unit = 60s
smtpd_client_event_limit_exceptions = $mynetworks

smtpd_client_message_rate_limit
単位時間あたりの、SMTPクライアントのメールサーバへの接続数の最大数を制限します。
この接続とは、メッセージ配送要求です。
1つのメールに複数の To,Cc が指定されていても、1つの配送要求として数えます。

メッセージ配送要求とは以下のもので、これらを制限します。
・あなたのメールサーバのアカウントへのメール配送の為の、他のメールサーバからの接続
・メール送信の為の、Thunderbird や Outlook 等のメールクライアントからの接続

anvil_rate_time_unit
単位時間を指定します。
例えば 60s を指定すると、単位時間は60秒となります。

smtpd_client_event_limit_exceptions
ここで指定されたSMTPクライアントには適用されません。
カンマ区切りで複数ネットワークを指定できますが、少なくとも $mynetworks を指定しておかないと、自サーバの利用者からの接続自体も制限することになります。

さて、smtpd_client_message_rate_limit で指定した制限を超えて接続してきた場合は、どうなるのでしょうか?
この場合、あなたのメールサーバには次のようなログが残ります。

/var/log/maillog

warning: Message delivery request rate limit exceeded: YYY from ZZZZZ[xxx.xxx.xxx.xxx] for service smtp

YYY の箇所は、smtpd_client_message_rate_limit で指定した値になります。
ZZZZZ は接続元ホスト名、xxx.xxx.xxx.xxx はIPアドレスになります。

設定値 smtpd_client_message_rate_limit や anvil_rate_time_unit は、メールサーバの利用者数や、流れるメールの量によって調整する必要がありますが、上記ログが出力されているかを確認しながら、調整して下さい。
通常の利用時にログが出力される場合は、設定値が小さいので、値を大きくします。

このようなログが出力される場合(smtpd_client_message_rate_limit で指定した制限を超えて接続してきた場合)、あなたのメールサーバのアカウントへのメール配送の為の、他のメールサーバからの接続では、その接続がエラーとなります。
そのメールサーバには、次のようなログが残ります。

/var/log/maillog

said: 450 4.7.1 Error: too much mail from xxx.xxx.xxx.xxx (in reply to MAIL FROM command))

但し、一定時間後に再送の為に、再度そのメールサーバから接続がなされます。
結果、メール配信に遅延が出ますが、メールは届きます。

一方、メール送信の為の、Thunderbird や Outlook 等のメールクライアントからの接続では、その接続がエラーとなり、Thunderbird や Outlook 等でメール送信が失敗します。

プロセス起動数を制限

メールサーバは、メール送信の為のメッセージ配送要求を受けると、その処理の為に色々なプロセスを起動します。
このプロセスの最大の同時起動数を指定します。

smtpd_client_message_rate_limit では、複数IPアドレスからのサービス拒否攻撃では、全体の接続数は多い場合でも、1つのIPアドレスからの接続数が少ないと制限にかかりません。

一方、プロセス起動数の制限では、複数IPアドレスからのメッセージ配送要求を制限できます。

/etc/postfix/main.cf

default_process_limit = 30

default_process_limit
プロセス起動数を指定します。
Postfix ではメール配送の為に pickup , cleanup , smtpd 等といったプロセスが起動しますが、この設定値は pickup , cleanup , smtpd 等 それぞれの起動数の制限値となります。
全プロセス数の合計ではありません。

設定の反映

以上の設定は、次のようにして Postfix に反映させます。

/etc/init.d/postfix reload

参考

Postfixパフォーマンスチューニング
postfixで送信元毎の同時送信数を制限する方法 – 理想未来はどうなった?
http://www.postfix-jp.info/trans-2.1/conf/master.cf.jp

コメント

タイトルとURLをコピーしました