Fail2ban: フィルタファイルでの日付パターンの追加

作成日 2018年06月06日  ·  7コメント  ·  ソース: fail2ban/fail2ban

環境:

_該当するボックスに入力してチェック( [x] )します。 Fail2Banのバージョンが古くなっている場合は、
また、問題が最近のリリースで解決しないことを確認できません。サポートを求める方がよいでしょう。
取得したディストリビューションからFail2Banfrom_

  • Fail2Banバージョン(可能な配布サフィックスを含む):0.9-6
  • OS、リリース名/バージョンを含む:Centos 06
  • [x] OS /配信メカニズムを介してインストールされたFail2Ban
  • []コードベースに追加の外部パッチを適用していません
  • []構成に対していくつかのカスタマイズが行われました(以下の詳細を提供してください)

問題:

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).*

予想される行動

  1. 上記のフィルターは失敗したログインをキャプチャする必要があります
  2. 戻りコード値が114の場合、フィルターは失敗したログインをスキップする必要があります

観察された行動

  1. 作成されたフィルターは、/ var / log / tomcat2 /catalina.outのログから日付を解析できません。

    追加情報

構成、ダンプ、およびその他の役立つ抜粋

  1. jail.configに変更はありません
  2. 失敗したログインをキャプチャするためにjail.localにjailを作成しました(name = trialJail)

    / etc / fail2ban /構成に対して行われたカスタマイズ

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 =

/var/log/fail2ban.logファイルの関連部分:

_できればloglevel = 4でfail2banを実行しているときに取得します_

  1. 日付を解析できないために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))

documentation

全てのコメント7件

日付パターンを解析するにはどうすればよいですか

たとえば、パターンは「^ [%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関数が提供されていることを理解しています。
上記の例は、さまざまなシナリオでフィルターがどれほど柔軟であるかを明らかにしました。
お手数をおかけしますが、よろしくお願いいたします。
良い一日を :)

このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

jakoch picture jakoch  ·  3コメント

4Syno picture 4Syno  ·  6コメント

KiwiMorpheus picture KiwiMorpheus  ·  3コメント

electrofloat picture electrofloat  ·  3コメント

gaia picture gaia  ·  3コメント