Regex

fail2ban 正則表達式不匹配

  • April 6, 2017

我必須承認,正則表達式一直是我的弱點。我從來沒有坐下來花足夠的時間學習它們以有效地使用它們。但是,我真的不知道為什麼這不匹配。我正在嘗試製作一個自定義的失敗正則表達式來阻止人們試圖利用任何 xmlrpc.php 錯誤(並且他們一直在嘗試這樣做)。

我在 Ubuntu 16.04.2 上使用帶有 Apache 2.4.18 的 fail2ban v0.9.3。

這是我的正則表達式:

<HOST> - - \[\d{2}/\w{3}/\d{4}:\d{2}:\d{2}:\d{2} +\d{4}\] "POST /xmlrpc.php HTTP/1.0" 200

這是一個不匹配的範例行(IP 替換為 0):

0.0.0.0 - - [06/Apr/2017:07:45:42 +0000] "POST /xmlrpc.php HTTP/1.0" 200 752 "-" "Mozilla/4.0 (compatible: MSIE 7.0; Windows NT 6.0)"

我無法弄清楚為什麼它不匹配。據我所知,這應該是完全匹配的。任何人都可以解釋一下嗎?

此外,讓 + 和 - 符號的時區偏移匹配會很好……我認為通過替換HTTP/1.0HTTP/1.\d{1}應該匹配 1.0 和 1.1,對嗎?

提前致謝!

編輯:在使用fail2ban-regex 在命令行上玩耍之後,我發現使用<HOST> - - \[它的正則表達式將匹配所有行。但是,我將其更改為<HOST> - - \[\d{2}它的第二個根本不匹配任何行。這似乎沒有任何意義!

編輯2:好吧,與此同時,我正在使用<HOST> - - \[.* "POST /(xmlrpc|wp-login).php HTTP/1.\d" 200它,這與我想要的線條相匹配。但是,我仍然很想知道為什麼我原來的不匹配,因為我寧願使用更具體的正則表達式而不是我現在使用的廣泛的正則表達式。

經過幾次迭代後fail2ban-regex,我認為fail2ban會嘗試從日誌行本身中選擇日期,然後再針對您的過濾器模式進行測試。

$ line='0.0.0.0 - - [06/Apr/2017:07:45:42 +0000] "POST /xmlrpc.php'

代替時間戳,它匹配,但正如您注意到的,在.*時間戳開頭顯式查找數字不匹配:

$ ./fail2ban-regex "$line"  '<HOST> - - \[.*\].*POST /xmlrpc' |grep ^Lines
Lines: 1 lines, 0 ignored, 1 matched, 0 missed

$ ./fail2ban-regex "$line"  '<HOST> - - \[\d+.*\].*POST /xmlrpc' |grep ^Lines
Lines: 1 lines, 0 ignored, 0 matched, 1 missed

但是看看這個:

$ ./fail2ban-regex "$line"  '<HOST> - - \[ \+0000\].*POST /xmlrpc' |grep ^Lines
Lines: 1 lines, 0 ignored, 1 matched, 0 missed

我從模式中刪除了整個時間戳,而不是期望它為(只有時區指示器)。它仍然匹配,暗示 fail2ban 實際上在針對配置中的模式進行測試之前刪除了時間戳。

因此,最好將該部分排除在過濾器模式之外,並匹配任何內容來代替時間戳:

<HOST> - - \[.*?\] "POST /xmlrpc.php HTTP/1.0" 200

作為旁注,您的原始 RE+在時間戳開始的位置沒有引用,加號表示“至少重複前一個元素”,因此您需要對其進行轉義。

引用自:https://serverfault.com/questions/842943