1.Определяем имя(requests),размер(10m) зоны и кол-во запросов в секунду(1 запрос в секунду)
Также определяем тип ошибки при срабатывании правил(по умолчанию стоит 503).Изменим статус на 444. Параметр limit_req_status можно указывать как глобально в секции http {..} , так и локально для конкретного location {..}. В данном случае указано глобально.
1 |
# nano /etc/nginx/nginx.conf |
1 2 3 4 5 6 |
http { ….. limit_req_zone $binary_remote_addr zone=requests:10m rate=1r/s; limit_req_log_level warn; limit_req_status 444; } |
2.В вирт.хосте Nginx для WordPress добавляем location для wp-login.php
1 |
# nano /etc/nginx/conf.d/wordpress.conf |
1 2 3 4 5 6 |
location = /wp-login.php { limit_req zone=requests burst=1 nodelay; fastcgi_pass unix:/var/run/php5-fpm.wordpress.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } |
Т.е подключаем использование зоны requests с всплеском(burst)таким же как и ограничения(не более 1 запроса в секунду) и параметром nodelay для немедленного отдачи клиенту статуса 444 при превышении порога.
3.Провереяем синтаксис nginx, перезапускаем nginx, тестируем срабатывание правил
1 |
# nginx -t |
1 |
# service nginx reload |
1 |
# ab -n 100 -c 10 <wordpress-site>/wp-login.php |
1 |
# tail -f /var/log/nginx/<wordpresssite>access.log | egrep "login|444" |
1 |
192.168.1.81 - - [03/Feb/2015:15:30:37 +0200] "GET /wp-login.php HTTP/1.0" 444 0 "-" "ApacheBench/2.3" "-" |
4. Добавление исключений на фильтрацию подключений
Если необходимо добавить адреса, с которых не нужно ограничивать кол-во подключений на wp-login.php (т.н белые списки),то в
1 |
# nano /etc/nginx/nginx.conf |
1 2 |
#limit_req_zone $binary_remote_addr zone=requests:10m rate=1r/s; limit_req_zone $rt_filtered_ip zone=requests:10m rate=1r/s; |
и в http{..} блоке добавлем блок
1 2 3 4 5 |
map $remote_addr $rt_filtered_ip { default $binary_remote_addr; 192.168.1.5 ""; 192.168.1.81 ""; } |
Источник: https://rtcamp.com/tutorials/nginx/block-wp-login-php-bruteforce-attack/