Pull to refresh

Блокировка ботов и нежелательных пользователей на уровне вебсервера nginx

Reading time 2 min
Views 23K
У меня, да и думаю у вас, логи веб-сервера частенько забиваются запросами вида:

62.193.233.148 - - [28/May/2009:18:20:27 +0600] "GET /roundcube/ HTTP/1.0" 404 208 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5"
62.193.233.148 - - [28/May/2009:18:20:28 +0600] "GET /webmail/ HTTP/1.0" 404 206 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5"
212.150.123.234 - - [29/May/2009:20:51:12 +0600] "GET /admin/main.php HTTP/1.0" 404 212 "-" "-"
212.150.123.234 - - [29/May/2009:20:51:12 +0600] "GET /phpmyadmin/main.php HTTP/1.0" 404 217 "-" "-"
212.150.123.234 - - [29/May/2009:20:51:12 +0600] "GET /phpMyAdmin/main.php HTTP/1.0" 404 217 "-" "-"
212.150.123.234 - - [29/May/2009:20:51:13 +0600] "GET /db/main.php HTTP/1.0" 404 209 "-" "-"
212.150.123.234 - - [29/May/2009:20:51:13 +0600] "GET /PMA/main.php HTTP/1.0" 404 210 "-" "-"
212.150.123.234 - - [29/May/2009:20:51:14 +0600] "GET /admin/main.php HTTP/1.0" 404 212 "-" "-"
212.150.123.234 - - [29/May/2009:20:51:14 +0600] "GET /mysql/main.php HTTP/1.0" 404 212 "-" "-"
212.150.123.234 - - [29/May/2009:20:51:15 +0600] "GET /myadmin/main.php HTTP/1.0" 404 214 "-" "-"
212.150.123.234 - - [29/May/2009:20:51:15 +0600] "GET /phpadmin/main.php HTTP/1.0" 404 215 "-" "-"
212.150.123.234 - - [29/May/2009:20:51:16 +0600] "GET /webadmin/main.php HTTP/1.0" 404 215 "-" "-"


В основном это боты, бывают и пользователи, которые сканируют сервер на наличие всяких папок, ищут уязвимости.
Так вот захотелось блокировать эти IP-адреса сразу после попытки сканирования сервера, средствами nginx.


На помощь приходит geo модуль нжинкса.

Сперва прописываем в секции location новый log_format вида «IP-адрес 1;», который поймет geo модуль:

log_format deny '$remote_addr 1;';


в http секции пишем:

geo $deny {
default 0;
include /www/logs/deny;
}



Это позволит считывать нам файл /www/logs/deny и брать список IP-адресов для блокирования.

Теперь в location секции описываем «плохие» ситуации, когда IP-адрес необходимо заблокировать, например:

set $ua $http_user_agent;

if ($ua ~* wget) {
access_log /www/logs/deny deny;
return 403;
}

if ($ua ~* curl) {
access_log /www/logs/deny deny;
return 403;
}

if ($request ~* "webadmin") {
access_log /www/logs/deny deny;
return 403;
}

if ($request ~* "\/admin\/main.php") {
access_log /www/logs/deny deny;
return 403;
}


В итоге плохие запросы и юзерагенты попадают в файл /www/logs/deny в виде «IP-адрес 1;», и при перечитывании конфигурации IP-адрес будет заблокирован.

Остается только закинуть в крон команду нжинксу раз в 1-5-10 минут(когда необходимо) перечитывать конфиг, и списку заблокированных IP-адресов будет запрещен доступ к серверу.

По Сысоеву это выглядит так:
kill –HUP `cat /var/log/nginx/nginx.pid`

Наполняйте список правил «плохими» запросами, и сам чёрт вам не брат!
Tags:
Hubs:
+19
Comments 45
Comments Comments 45

Articles