
私はopenSMPTD
メールサーバーを運用しています。現在、ブルートフォース攻撃を受けているようですが、侵入されるとは思えません。とはいえ、ログイン試行が頻繁に行われることでサーバーにかかる負担を軽減したいと思っています。fail2ban
違反者を禁止するように設定しています。しかし、正しい正規表現がなかなか得られず、気が狂いそうです。FreeBSDフォーラムのこのリンクそれをキャッチするための正規表現についてfail2ban
。しかし、その正規表現でさえ、彼らが提供したサンプルテキストをキャプチャしていないようでした。彼らの正規表現を編集しましたが、無駄でした。私は正規表現に非常に弱いので、誰かが私に何かアドバイスをくれることを願っています。
ログファイルは次のようになります:
Dec 25 20:03:29 frick mail.info smtpd[16849]: f7fa148a43b34578 smtp connected address=193.169.254.42 host=<unknown>
Dec 25 20:03:30 frick mail.info smtpd[16849]: f7fa148a43b34578 smtp tls ciphers=TLSv1.2:ECDHE-RSA-AES128-SHA256:128
Dec 25 20:03:30 frick mail.info smtpd[16849]: f7fa148a43b34578 smtp authentication user=info result=permfail
Dec 25 20:03:30 frick mail.info smtpd[16849]: f7fa148a43b34578 smtp failed-command command="AUTH LOGIN (password)" result="535 Authentication failed"
Dec 25 20:03:30 frick mail.info smtpd[16849]: f7fa148a43b34578 smtp disconnected reason=quit
"
では、これを詳しく見てみましょう。ブルートフォース攻撃を行っていることを示す行は次のとおりです。
f7fa148a43b34578 smtp failed-command command="AUTH LOGIN (password)" result="535 Authentication failed"
認証が失敗したことがわかります。しかし、奇妙なことに、openSMTPD はその行に禁止する IP アドレスを含めていません。その上の変数番号を調べる必要があります。
f7fa148a43b34578 smtp connected address=193.169.254.42 host=<unknown>
違反者の IP アドレスを確認できる場所。わかりました。現在、すべてのテキストを選択する正規表現は次のとおりです。
^.*smtp connected address=\w[1-9.]* host=[a-z<>]*\n*[a-zA-Z0-9_.-\s\]\[:=<>"()]*
もっと細かい粒度が必要ですがfail2ban
、2 人が同時に接続して間違った回線が禁止される可能性があるため、適切な IP アドレスを取得して禁止する明確な方法があるかどうかはわかりません。
助言がありますか?
答え1
複数行の正規表現を使用するための新しい、よりクリーンな方法は、バージョン<F-...>
で導入されたタグを使用することです0.10.0
が、残念ながらまだ十分に文書化されていません。
[Definition]
prefregex = <F-MLFID>: \w{16} </F-MLFID><F-CONTENT>.+</F-CONTENT>$
failregex = <F-NOFAIL>smtp connected address=(?:<IP6>|<IP4>)</F-NOFAIL>
smtp failed-command command="AUTH LOGIN \(password\)" result="535 Authentication failed"
<F-NOFAIL><F-MLFFORGET>smtp disconnected</F-MLFFORGET></F-NOFAIL>
説明
プレフィルター正規表現は、各行を前処理し、セッション ID (一部であると思われる) をキャプチャしてf7fa148a43b34578
、複数行にまたがる同じセッションを識別するために使用されます。内部のテキストは、<F-CONTENT>
私たちが関心を持っている部分であり、failregex によって処理されます。
失敗正規表現では、初め1つは、禁止が発行される際に必要となるIPアドレスと一致する行であり、<F-NOFAIL>
その行が失敗と見なされないことを示すためにタグで囲まれている。2番正規表現は実際の認証失敗であり、一致した場合、fail2banは以前にキャプチャしたIPアドレスをブロックします。最後1 つは<F-MLFFORGET>
ディレクティブで囲まれており、キャプチャされた接続 ID をドロップするタイミングであることを示します (ユーザーが切断したため)。また、<F-NOFAIL>
その行自体も失敗ではないため、タグで囲まれています。
このツールを使ってこれをテストすることができますfail2ban-regex
。
リンクされたフォーラム投稿の正規表現が機能しなかった理由はわかります。文字列が複数の部分で異なっています。したがって、より一般的なケースに一致させたい場合は、明らかに上記の 2 番目の failregex を変更する必要があります (私は opensmtpd を使用していないので、その点についてはお手伝いできません)。