Для того чтобы запретить определенные пути или URL – адреса в Nginx для защиты содержимого, вы можете использовать fail2ban, чтобы запретить запросы 403 в Nginx. Например, если вы переименовали страницу входа, используя плагин, то, как правило, хакерские боты будут получать ошибку 403 forbidden при попытке войти в систему. Точно так же, если у вас есть полностью отключить xmlrpc.php.
Это руководство покажет вам, как использовать fail2ban, чтобы запретить ботам на уровне сервера с помощью IPTables автоматически. Будьте осторожны, убедитесь, что вы не запрещаете Google или другим поисковикам индексацию сайта!
Обзор установки
Перейдите на URL, который запрещен вашим виртуальным хостом Nginx, чтобы сгенерировать данные журнала
Показажите последние 50 строк вашего файла журнала Nginx
tail -n 50 /var/log/nginx/logfile
Мы нашли эти записи, которые будут использоваться в качестве основы для фильтра fail2ban для бана пользователей, которые генерируют ошибку 403 forbidden
2016/09/15 17:01:18 [error] 3176#3176: *1 access forbidden by rule, client: 189.167.27.53, server: guides.andreyex.ru, request: "GET /wp-login.php HTTP/1.1", host: "guides.andreyex.ru", referrer: "android-app://com.Slack"
2016/09/15 17:01:54 [error] 3176#3176: *1 access forbidden by rule, client: 189.167.27.53, server: guides.andreyex.ru, request: "GET /wp-login.php HTTP/1.1", host: "guides.andreyex.ru", referrer: "android-app://com.Slack"
Теперь, когда у нас есть данные журнала мы можем создать фильтр для fail2ban.
Нам нужно создать фильтр Fail2ban, который будет соответствовать ошибки из файла журнала. Затем мы создаем jail чтобы использовать этот фильтр и запретить пользователей.
Создать затем фильтр для Nginx
sudo nano /etc/fail2ban/filter.d/nginx-forbidden.conf
Добавьте это регулярное выражение, которое будет соответствовать ошибке 403 forbidden в журналах Nginx
[Definition]
failregex = ^ \[error\] \d+#\d+: .* forbidden .*, client: <HOST>, .*$
ignoreregex =
Ctrl + X, Y + Enter, чтобы сохранить изменения и выйти.
Теперь мы можем проверить фильтр аутентификации Nginx HTTP, сканируя журнал ошибок, указанный в виртуальном хосте Nginx.
fail2ban-regex /var/log/nginx/wpbullet.error.log /etc/fail2ban/filter.d/nginx-forbidden.conf
Вы увидите этот вывод, который показывает, что нашел неудачные попытки входа, которые мы сгенерировали ранее.
Running tests ============= Use failregex file : /etc/fail2ban/filter.d/nginx-forbidden.conf Use log file : log Results ======= Failregex: 2 total |- #) [# of hits] regular expression | 1) [2] ^ \[error\] \d+#\d+: .* forbidden .*, client: <HOST>, .*$ `- Ignoreregex: 0 total Date template hits: |- [# of hits] date format | [2] Year/Month/Day Hour:Minute:Second `- Lines: 2 lines, 0 ignored, 2 matched, 0 missed
Убедитесь, что у вас есть в Fail2ban папка jail
sudo mkdir -p /etc/fail2ban/jail.d
Создайте конфигурационный файл jail Fail2ban в Nginx для HTTP аутентификации
sudo nano /etc/fail2ban/jail.d/nginx-forbidden.conf
Вставьте эту конфигурацию, которая использует фильтр, который мы создали ранее, который сканирует все файлы журналов Nginx и запрещает пользователям в течение 6000 минут, которые сгененировали ошибку 3 раза в 60-секундный период.
[nginx-forbidden]
enabled = true
filter = nginx-forbidden
port = http,https
logpath = /var/log/nginx/*error*.log
findtime = 60
bantime = 6000
maxretry = 3
Теперь, когда мы знаем, сделаем jail, проверим синтаксис Fail2ban, чтобы убедиться, что это все работает
sudo fail2ban-client -d
Если вы не видите каких-либо ошибок (предупреждения OK), то можно перезапустить fail2ban
service fail2ban restart
Клиент Fail2ban может быть использован, чтобы показать статистику своих мест заключения
sudo fail2ban-client status nginx-forbidden
Во время тестирования на виртуальных машинах, мне удалось получить забаненный шлюз.
Status for the jail: nginx-forbidden
|- filter
| |- File list: /var/log/nginx/andreyex.error.log /var/log/nginx/error.log
| |- Currently failed: 0
| `- Total failed: 3
`- action
|- Currently banned: 1
| `- IP list: 192.168.60.1
`- Total banned: 1
Вы также можете перечислить IPTables
sudo iptables -L -n
Это показывает цепочку Iptables для Nginx запрещенных в jail
Chain f2b-nginx-forbidden (2 references)
target prot opt source destination
REJECT all -- 192.168.0.1 0.0.0.0/0 reject-with icmp-port-unreachable
RETURN all -- 0.0.0.0/0 0.0.0.0/0
RETURN all -- 0.0.0.0/0 0.0.0.0/0
Любые боты, которые сканируют и вызывают ошибку 403 forbidden в Nginx, теперь будут автоматически запрещены в Fail2ban.