Я пытаюсь остановить надоедливых ботов, блокируя их пользовательские агенты в nginx. Каков наилучший способ поместить несколько пользовательских агентов / совпадений в один оператор if, если они содержат не буквенно-цифровые символы и должны быть заключены в кавычки.
Это работает:
if ($http_user_agent ~* (python|wget)) {
return 403;
}
if ($http_user_agent ~* "Opera/9.02 (Windows XP; U; ru)") {
return 403;
}
if ($http_user_agent ~* "Opera/9.70 (Linux i686 ; U; en) Presto/2.2.1") {
return 403;
}
Но я бы предпочел что-то вроде этого (чего нет в этом формате):
if ($http_user_agent ~* (python|wget|"Opera/9.02 (Windows XP; U; ru)"|"Opera/9.70 (Linux i686 ; U; en) Presto/2.2.1") ) {
return 403;
}
Я рада, что вы все сделали хорошо. Я хочу добавить еще один тип защиты, который будет несколько более профессиональным и позволит пользовательским агентам, которые, скорее всего, будут заблокированы сейчас, даже если они на самом деле не являются ботами. Кроме того, я уверен, что вы читали часть IFISEVIL от Nginx. :)
Я использую Fail2Ban для защиты своих веб-серверов через ssh и http. Вам просто нужно создать для них новую тюрьму и указать приложению, чтобы оно просматривало файлы журнала, и если одна строка соответствует критериям, оно может заблокировать IP-адрес навсегда или только на время.
Вы не объяснили, с каким типом атак вы сталкиваетесь со стороны ботов, но для Fail2Ban существует множество нестандартных методов защиты веб-сервера. Есть даже специальная часть, написанная кем-то под названием: Плохие боты.
[nginx-badbots]
enabled = true
filter = apache-badbots
action = iptables-multiport[name=BadBots, port="http,https"]
logpath = /var/log/nginx*/*access*.log
bantime = 86400 # 1 day
maxretry = 1
https://snippets.aktagon.com/snippets/554-how-to-secure-an-nginx-server-with-fail2ban
Спасибо @PothiKalimuthu, который предложил использовать директиву nginx map, которая отлично сработала.
Мой последний код выглядел так:
# user agent blacklist
map $http_user_agent $ua_bots {
default 0;
~*(python|wget) 1;
"~*Opera\/9.02 \(Windows XP; U; ru\)" 2;
"~*Opera\/9.70 \(Linux i686 ; U; en\) Presto\/2.2.1" 3;
}
# block user agents from map blacklist
if ($ua_bots) {
return 403;
}