Я пытаюсь заблокировать недоступные запросы скриптов к 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
etc в GET /xxxxx HTTP
разделе?
решение1
Ну, в регулярных выражениях есть очень интересная вещь: регулярные выражения — жадные.
Даже если они получат совпадение в начале предложения, они продолжат поиск и пойдут на последнее совпадение, доступное в предложении. В вашем случае это сопоставление этого "referrer.com/default.aspx", потому что у вас есть регулярное выражение для сопоставления .asp, и оно также будет соответствовать всему с .asp*.
Поэтому при работе с регулярными выражениями необходимо быть предельно конкретным.
Для этого вам следует попробовать следующее:
failregex = ^<HOST> -.*GET.*(\.asp|\.exe|\.pl|\.cgi|\scgi)\"\s\d*
Что-то вроде этого должно работать очень хорошо. Если в любом случае это не работает, теперь вы знаете, в чем проблема, и я уверен, что вы можете исправить это, немного покопавшись в регулярных выражениях.
Надеюсь, это помогло.