Я пытаюсь заблокировать недоступные запросы скриптов к nginx с помощью fail2ban.
# Noscript filter /etc/fail2ban/filter.d/nginx-noscript.conf:
#
# Block IPs trying to execute scripts such as .php, .pl, .exe and other funny scripts.
#
# Matches e.g.
# 192.168.1.1 - - "GET /something.cgi
#
[Definition]
failregex = ^<HOST> -.*GET.*(\.asp|\.exe|\.pl|\.cgi|\scgi)
ignoreregex =
Но это также создает попадание, если реферер в журнале доступа содержит тег скрипта. Например, эта строка: (Я запутал IP и референт, и я усек на несколько строк, в реальном журнале эти 4 строки находятся на одной строке.)
1.2.3.4 - - [16/Dec/2013:18:01:10 +0100] "GET / HTTP/1.1"
301 178 "http://referrer.com/default.aspx"
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.41 Safari/537.36"
Как я могу изменить регулярное выражение, чтобы найти только .asp
и т. д. в GET /xxxxx HTTP
раздел ?
Что ж, в регулярных выражениях есть очень интересные вещи, которые являются жадными.
Даже если они найдут совпадение в начале предложения, они будут продолжать искать и будут искать последнее совпадение, доступное в предложении. В вашем случае он соответствует этому "referrer.com/default.aspx", потому что у вас есть регулярное выражение для сопоставления с .asp, и оно также будет соответствовать чему-либо с .asp *.
Итак, вам нужно быть очень конкретным при работе с регулярными выражениями.
Для этого вам следует попробовать следующее:
failregex = ^<HOST> -.*GET.*(\.asp|\.exe|\.pl|\.cgi|\scgi)\"\s\d*
Что-то вроде этого должно работать очень хорошо. Если в любом случае это не сработает, теперь вы знаете, в чем проблема, и я уверен, что вы можете исправить это, немного покопавшись в регулярных выражениях.
Надеюсь, это помогло.