_該当するボックスに入力してチェック( [x]
)します。 Fail2Banのバージョンが古くなっている場合は、
また、問題が最近のリリースで解決しないことを確認できません。サポートを求める方がよいでしょう。
取得したディストリビューションからFail2Banfrom_
Tomcatログのdatepatternは、どの日付の標準にも準拠していません
したがって、フィルターはログから必要な文字列をキャッチしますが、日時を探すことはできません
_ここに要約_
Tomcatログに記載されている日付パターンは次のとおりです:(/ var / log / tomcat2 / catalina.out)
**[06-Jun-2018_19:37:41,631]** [INFO] [mithi.mcs.auth.MithiAuthService(doAuth)] - <Authentication for user : [email protected] for service : IMAP from ip : 192.168.0.124 finished with status : Failure. unknown status. Return Code : 108. Execution finished in : 58 ms>
上記のログをキャプチャするために作成されたフィルター:
failregex = (?:Authentication for user :) .*(?:from ip : (?P<host>\S*)).*(?:finished with status : Failure).*(?: Return Code : ).*
ignoreregex = (?:Authentication for user :) .*(?:from ip : (?P<host>\S*)).*(?:finished with status : Failure).*(?:Return Code : 114).*
jail.localにjailを追加しました
[trialJail]
enabled = true
filter = multiService
action = iptables-multiport[name=trialJail, port="smtp,imap,pop3", protocol=tcp]
logpath = /var/log/tomcat2/catalina.out
findtime = 1200
bantime = 30
maxretry = 2
ignoreip =
_できればloglevel = 4
でfail2banを実行しているときに取得します_
Jun 6 19:37:41 Master fail2ban.filter[7747]: WARNING Found a match for u'[06-Jun-2018_19:37:41,631] [INFO] [mithi.mcs.auth.MithiAuthService(doAuth)] - <Authentication for user : [email protected] for service : IMAP from ip : 192.168.0.124 finished with status : Failure. unknown status. Return Code : 108. Execution finished in : 58 ms>' but no valid date/time found for u'[06-Jun-2018_19:37:41,631] [INFO] [mithi.mcs.auth.MithiAuthService(doAuth)] - <Authentication for user : [email protected] for service : IMAP from ip : 192.168.0.124 finished with status : Failure. unknown status. Return Code : 108. Execution finished in : 58 ms>'. Please try setting a custom date pattern (see man page jail.conf(5)). If format is complex, please file a detailed issue on https://github.com/fail2ban/fail2ban/issues in order to get support for this format.
私が取り組んでいるログ行は次のとおりです:(キャプチャする必要がある行)
[06-Jun-2018_17:07:42,500] [INFO] [mithi.mcs.auth.MithiAuthService(doAuth)] - <Authentication for user : [email protected] for service : **IMAP** from ip : 192.168.0.124 finished with status : Failure. unknown status. Return Code : 108. Execution finished in : 280 ms>
[06-Jun-2018_17:09:57,596] [INFO] [mithi.mcs.auth.MithiAuthService(doAuth)] - <Authentication for user : [email protected] for service : null from ip : null finished with status : Failure. invalid parameters are provided to function. Return Code : 106. Execution finished in : 1 ms>
[06-Jun-2018_17:25:20,653] [INFO] [mithi.mcs.auth.MithiAuthService(doAuth)] - <Authentication for user : [email protected] for service : **POP** from ip : 192.168.0.124 finished with status : Failure. unknown status. Return Code : 108. Execution finished in : 84 ms>
この質問の主な焦点は、日付パターンをどのように解析するかです。
ボーナスの質問は、上記のすべてのログを1つのフィルターにキャプチャする方法です(現在作業しているもの(ポート:smtp、pop3、imap))
日付パターンを解析するにはどうすればよいですか
たとえば、パターンは「^ [%d-%b-%Y_%H:%M:%S、%f]」のようになります。
設定ファイルでは、次のように2つのパーセント文字で指定する必要があることに注意してください。
datepattern = ^\[%%d-%%b-%%Y_%%H:%%M:%%S,%%f\]
PoC:
$ fail2ban-regex -v -d '^\[%d-%b-%Y_%H:%M:%S,%f\]' "$str" 'from ip : <HOST>'
Running tests
=============
Use datepattern : ^\[Day-MON-Year_24hour:Minute:Second,Microseconds\]
Use failregex line : from ip : <HOST>
Use single line : [06-Jun-2018_17:07:42,500] [INFO] [mithi.mcs.auth....
Results
=======
Failregex: 1 total
|- #) [# of hits] regular expression
| 1) [1] from ip : <HOST>
| 192.168.0.124 Wed Jun 06 17:07:42 2018
`-
Ignoreregex: 0 total
Date template hits:
|- [# of hits] date format
| [1] ^\[Day-MON-Year_24hour:Minute:Second,Microseconds\]
`-
Lines: 1 lines, 0 ignored, 1 matched, 0 missed
[processed in 0.00 sec]
また、fail2banは、一致するfailregexを検索する前に、文字列から日時に一致する日付パターンを切り取ることに注意してください。
ボーナス質問
ボーナスアンサー-マニュアルを読んでください。たとえば、正規表現構文:: Pythonドキュメントから始めてください。
たとえば、ログに記録されたポート:smtp、pop3、imapは次のようになります。
for service : (?:SMTP|POP3|IMAP|null) from ip
、
または、スペースなしの\S+
正規表現:
for service : \S+ from ip
..。
それはうまくいきました、ありがとうございます
別の質問ですが、上記のログに対する無視の正規表現パターンがあり、リターンコード:114をエスケープしています。
ignoreregex = .*(?:Return Code : 114.).*
上記のignoreregexコマンドは、リターンコード:114をエスケープするために完全に正常に機能します。
したがって、問題は、ignoreregexの計算を回避するために、114ではなくすべてのコードをキャプチャするためにfailregex自体で上記のignoreregexをどのように言及するのですか?
すべてのコードで機能するfailregexは-(機能中)
failregex = (?:for service :).* (?:smtp|POP|IMAP|null).*(?:from ip : <HOST>).*(?: finished with status : Failure.).*(?:Return Code : ).*
114ではなくすべてのコードを取得するfailregexは-(機能していません)
これまでに試しましたが、
> failregex = (?:for service :).* (?:smtp|POP|IMAP|null).*(?:from ip : <HOST>).*(?: finished with status : Failure.).*(?!.*Return Code : 114.).*
.*(?!.*Return Code : 114.).*
のようなものは決して機能しません(脆弱性は言うまでもなく)。なぜなら、すべての.*
をキャッチすると、常に何かが見つかるからです。たとえば、 something. Return Code : 114.
によって、$ something. R
をかなりキャッチできます。残りのeturn Code : 114.
は、ネガティブな先読みと一致しません。
したがって、より正確なパターンを使用する必要があります。
>>> import re
>>> cr = re.compile(r"\S+\. Return Code : (?!114)\d+\.")
>>> print(bool(cr.match("something. Return Code : 108.")))
True
>>> print(bool(cr.match("something. Return Code : 114.")))
False
最後になりましたが、キャッチオールを使用せずに正規表現を固定しようとします(少なくとも片側から、たとえば最初の^...
から、または両方の^...$
から、 .*$
に注意してください) ^.*
はアンカーではなく、意味がありません)。
したがって、特にログラインで外部(ユーザー)入力が発生する可能性がある場合は、正規表現をより正確に入力してください。 そうしないと、侵入者に対して脆弱になります(たとえば、回線を操作することにより、侵入者は検出を回避したり、実際のIPの代わりに他のIPを強制的に禁止したりする可能性があります。
フェイル正規表現で実装するにはどうすればよいですか? 以前のコメントですべての数値に有効な正規表現を提供しました。failregex自体の114を無視する正規表現を実装したいと思います。 あなたの時間と助けてくれてありがとう:)
申し訳ありませんが、正規表現を完全に修正する時間はありません。 そして、私は原則として速くて汚い解決策を作りません。
stackoverflowを試してください-同様のサイト。
はい、どうぞ:
^\s*\[\S+\]\s+\[[^\]]+\]\s+-\s+<Authentication for user : \S+[^:]* for service : \S+ from ip : <HOST> finished with status : Failure\.\s+(?:[^.]+\.)* Return Code : (?!114)\d+\.
ただし、もう少し正確な可能なフィルターは次のようになります。
[Definition]
# services (smtp,imap,etc,...):
_services = (?:\S+)
# all errors (not-precise):
#_errors = (?:[^.]+\.)*
# only expected errors (more precise), example:
#_errors = (?:unknown status|authenication error|something else)\.
_errors = (?:unknown status)\.
# return-codes (any excepting 114):
_ret_codes = (?!114)\d+
failregex = ^\s*\[\S+\]\s+\[[^\]]+\]\s+-\s+<Authentication for user : \S+[^:]* for service : %(_services)s from ip : <HOST> finished with status : Failure\.\s+%(_errors)s Return Code : %(_ret_codes)s\.
[Init]
datepattern = ^\[%%d-%%b-%%Y_%%H:%%M:%%S,%%f\]
禁止すべきものを正確に制御するために、3つの追加の補間変数(アンダースコアで始まる)があります。
考えられるすべてのエラーの最初の(コメント付き) _errors
置換を使用することもできますが、コメントにあるように、正確ではありません...そして、考えられるすべての形式を探すことなく、このような緩みは好きではありません。そこにログメッセージ形式があります。
しかし、上記の例のように、このリストを自己拡張できると思います。
failregexは、それ自体の中でignoreregexの作業を実行できるようになりました。
利用可能な機能を明確にするために、ignoreregex関数が提供されていることを理解しています。
上記の例は、さまざまなシナリオでフィルターがどれほど柔軟であるかを明らかにしました。
お手数をおかけしますが、よろしくお願いいたします。
良い一日を :)