Postfixで連続アクセスを規制する

2023年10月11日 更新

概要: SMTPサーバーを公開するとDoS攻撃や不正に認証を試みる連続アクセスが増えやすいため対策をする。Postfixに対するDoS攻撃や不正連続アクセスを規制する方法を紹介。

接続間隔と接続回数の制限

アクセス制御をするにあたり、main.cfを編集。今回は、10分間に5回までの接続を許可する設定とした。

$ vi /etc/postfix/main.cf

anvil_rate_time_unit = 600s

smtpd_client_connection_rate_limit = 5

nvil_rate_time_unit: 600秒(10分)

smtpd_client_connection_rate_limit: 5回の接続

smtpd_client_connection_rate_limit では、接続元が quit コマンドで明示的に接続を終了するかどうかは関係なく、10分間に5回の接続を試みた時点でそれ以降は接続が規制される。そのため、quit で切断せず、接続を維持したままさらに接続を増やす接続元に対しても効果がある。

クライアント側からテストする

TelnetかSSHクライアントを6つ立ち上げ、それぞれtelnetコマンドを使ってメールサーバーの25番ポートに接続する。

$ telnet mymailserver 25

1〜5回目の接続では下記のように、正常に接続状態に遷移する。

$ telnet mymailserver 25

Trying xxx.xxx.xxx.xxx...

Connected to mymailserver.

Escape character is '^]'.

220 ESMTP MTA

6回目の接続ではエラーが表示され、接続を拒否される。

$ telnet mymailserver 25

Trying xxx.xxx.xxx.xxx...

Connected to mymailserver.

Escape character is '^]'.

421 4.7.0 mymailserver Error: too many connections from xxx.xxx.xxx.xxx

Connection closed by foreign host.

メールサーバー側のログを確認

quit コマンドを使用せず連続アクセスしたため、connect のメッセージが連続している。

1: Oct 5 01:34:22 mail postfix/smtpd[3968]: connect from myhost[xxx.xxx.xxx.xxx]

2: Oct 5 01:34:43 mail postfix/smtpd[3972]: connect from myhost[xxx.xxx.xxx.xxx]

3: Oct 5 01:35:01 mail postfix/smtpd[3973]: connect from myhost[xxx.xxx.xxx.xxx]

4: Oct 5 01:35:17 mail postfix/smtpd[3974]: connect from myhost[xxx.xxx.xxx.xxx]

5: Oct 5 01:35:30 mail postfix/smtpd[3975]: connect from myhost[xxx.xxx.xxx.xxx]

6: Oct 5 01:35:42 mail postfix/smtpd[3976]: connect from myhost[xxx.xxx.xxx.xxx]

7: Oct 5 01:35:42 mail postfix/smtpd[3976]: warning: Connection rate limit exceeded: 6 from myhost[xxx.xxx.xxx.xxx] for service smtp

8: Oct 5 01:35:42 mail postfix/smtpd[3976]: disconnect from myhost[xxx.xxx.xxx.xxx]] commands=0/0

注視すべきは7〜8行目。7行目の「Connection rate limit exceeded: 6」のメッセージで、6回目の接続で規制が発動したことが読み取れる。また、8行目の「disconnect from myhost[xxx...」のメッセージで接続が切れたことが分かる。

日々調整は必要

メールサーバーに対する不正アクセスの手法は様々で、上記のような対策法を理解している不正アクセス者は意図的に時間の間隔を十分に設けて再接続を試みる。しかしながら、短時間での連続接続を避けることで接続が溢れることは避けられるため、一定の効果があるといえる。

一方で、ひとつの対策だけで万全を期すわけではないため、日常的にサーバーのログを確認し、環境に応じて値の調整をするなど、管理を怠らないことを心掛けたい。