4.3.5. Простая абарона ад ботаў (брутфорса адмін-панэлі) з дапамогай nginx

Абараніць сайт ад узлому брутфорсу (подобором пароля да адмін-панэлі сайта) і знізіць нагрузку, ствараную ботамі-ўзломшчыкамі, можна з дапамогай nginx, усталяванага фронтендом на сэрвэры, мадыфікаваўшы яго канфігурацыйны файл (часцей за ўсё ён знаходзіцца ў /etc/nginx/nginx.conf) Такім чынам — адразу пасля радка http { дадайце:

# Антибот limit_req_zone $binary_remote_addr zone=antibot:16m rate=6r/m;
limit_req_log_level warn;
limit_req_status 403;

Далей знайдзіце блок, які апісвае канкрэтны які абараняецца сайт. Ён пачынаецца з server { і змяшчае дырэктыву server_name з адрасам сайта. Нешта накшталт:

server {
server_name example.com www.example.com; listen xxx.xxx.xxx.xxx; # І далей шэраг location, якія апісваюць правілы апрацоўкі запытаў да server

У server дадайце location з такім змесцівам:

location = /wp-login.php {
limit_req   zone=antibot burst=2 nodelay;
proxy_pass http://127.0.0.1:81;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
}

Дзе:

  • /wp-login.php — шлях да якая абараняецца старонцы. Для OpenCart яго трэба замяніць на /admin, Для Joomla! — на /administrator.
  • 127.0.0.1:81 — заменіце на IP—адрас: порт вэб—сервера, на якім размешчаны сайт (можна падгледзець у суседніх дырэктывах location).

Захавайце занесеныя змены і праверце правільнасць канфігурацыйнага файла, выканаўшы ў кансолі сервера каманду:

nginx -t

Калі вынік праверкі «syntax is ok», То перазапусціце nginx:

service nginx restart

Гэты канфігурацыйны файл задае зону падзялянай памяці з назвай antibot, аб’ёмам 16 МБ і хуткасцю апрацоўкі запытаў 6 запытаў / хвіліну ці 1 зварот да /wp-login.php у 10 секунд (яшчэ можна паказваць гэты параметр у запытах / секунду — r / s). Калі колькасць тых, хто паступае запытаў больш, чым значэнне rate, іх апрацоўка адкладаецца да таго часу, пакуль іх колькасць не перавысіць значэнне, зададзенае ў limit_req...burst (У нашым выпадку — 2), пасля чаго ўсе наступныя запыты будуць атрымліваць у адказ памылку 403 (можна задаць любы іншы код памылкі ў радку limit_req_status, Напрыклад 423, як больш дакладны для вызначэння сітуацыі), аддаваў nginx, што значна больш эканомна ў плане спажываных серверам рэсурсаў, чым адлоў той жа сітуацыі і блакаванне на ўзроўні Apache.

Больш падрабязную інфармацыю пра наладу модуля ngx_http_limit_req_module можна знайсці ў афіцыйнай дакументацыі nginx.

З дапамогай утыліты ab (apache benchmark) можна стварыць HTTP-флуд на пэўную старонку, напрыклад /wp-login.php, І паглядзець пры гэтым Error-лог nginx:

ab -n 100 -c 1 http://example.com/wp-login.php
Змест