Читая документацию веб-сервера nginx, наткнулся на интересный модуль под названием http referer module. Он позволяет блокировать доступ к сайту, либо его разделам, если в запросе отсутствует корректный заголовок referer.
Этот модуль можно применить для защиты админки любого сайта от брутфорса. Например, сайт работает на вордпресс, но блокировка доступа по ip будет неуместной, если на сайте есть зарегистрированные пользователи. Им же тоже надо аутентифицироваться, а собирать их ip — занятие бессмысленное. :)
Принцип работы прост: на сайте выводим ссылку на страницу входа wp-login.php, а в конфигурационном файле nginx задаём проверку запросов к wp-login.php и /wp-admin/ на наличие адреса нашего сайта в заголовке реферер.
Прежде всего создаём выделенный локейшн для нужных страниц. Например, так:
server{ ... location ~* (wp-login.php|wp-admin(.*))$ { try_files $uri =404; fastcgi_pass unix:/run/php-www.sock; location ~ .php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_ignore_client_abort off; fastcgi_param PHP_VALUE "sendmail_path=/usr/sbin/sendmail -t -i -fmail@example.com"; fastcgi_param PHP_ADMIN_VALUE "open_basedir=/var/www/example.com/:/var/save_path/:/var/tmp_dir/"; } } ... }
Как видим, тут указаны ещё и параметры обработки php скриптов (иначе указанные в локейшн скрипты не будут работать).
Конфигурацию модуля можно прописать сразу после location ~* (wp-login.php|wp-admin(.*))$ {
.
Первая строка:
valid_referers server_names
Она указывает, что корректным полем referer должен считаться домен сайта.
А также прописываем проверочное условие. Если поле referer некорректно, сервер отобразит ошибку 403 (доступ запрещён).
if ($invalid_referer) { return 403; }
В итоге конфигурация будет выглядеть так:
server{ ... location ~* (wp-login.php|wp-admin(.*))$ { valid_referers server_names if ($invalid_referer) { return 403; } (параметры fastcgi) } ... }
Напоследок на сайте добавляем ссылку на страницу входа (wp-login.php или что-то там ещё). Если посетитель кликает по этой ссылке, то получает форму авторизации. Но если бот будет стучаться напрямую к этому файлу, то получит ошибку доступа.
Да, стоит отметить, что заголовок referer можно подделать. Но лично мне боты с корректно заполненным полем referer попадались очень редко и банились по ip. :) Так что этот метод может быть вполне уместен.