Защита Nginx от атак HTTP 404 | 429 с помощью Fail2Ban на Debian.
Рассмотрим как обрабатывать HTTP 404 в логах веб-сервера Nginx и блокировать злоумышленников которые пытаются найти уязвимости на опубликованных сайтах с помощью Fail2Ban.
Пример подобной атаки злоумышленников на веб-сайт размещенный на Nginx:
130.255.15.40 - - [08/Aug/2023:17:27:53 +0300] "GET /aslogo.jpeg HTTP/1.1" 404 41318 "-" "gobuster/3.1.0"
130.255.15.40 - - [08/Aug/2023:17:27:53 +0300] "GET /dexter.txt HTTP/1.1" 404 41318 "-" "gobuster/3.1.0"
130.255.15.40 - - [08/Aug/2023:17:27:53 +0300] "GET /dexter.html HTTP/1.1" 404 235 "-" "gobuster/3.1.0"
130.255.15.40 - - [08/Aug/2023:17:27:53 +0300] "GET /5553.md HTTP/1.1" 404 41318 "-" "gobuster/3.1.0"
130.255.15.40 - - [30/Aug/2023:17:00:13 +0300] "GET /admin HTTP/1.1" 429 162 "-" "Mozilla/5.0 (pc-x86_64-linux-gnu) Siege/4.0.7"
130.255.15.40 - - [30/Aug/2023:17:00:13 +0300] "GET /admins HTTP/1.1" 429 162 "-" "Mozilla/5.0 (pc-x86_64-linux-gnu) Siege/4.0.7"
Устанавливаем пакет fail2ban
, если он не установлен:
sudo apt-get install fail2ban -y
Создаем фильтр fail2ban
для поиска запросов 404
:
cat << EOF > /etc/fail2ban/filter.d/nginx-4xx.conf
[Definition]
failregex = ^<HOST> - - \[.*\] "(GET|POST).*HTTP.* (404|429)
ignoreregex =
EOF
Настраиваем fail2ban
для блокировки 404 запросов. В конфигурационный файл /etc/fail2ban/jail.local
добавляем:
[nginx-4xx]
enabled = true
port = http,https
logpath = /var/log/nginx/*access.log
maxretry = 20
findtime = 10
bantime = 10m
ignoreip =
Для применения правила, перезапускаем сервис fail2ban
/etc/init.d/fail2ban reload
Для проверки что правило работает, можно запустить проверку работы правила, командой:
fail2ban-regex --print-all-match /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-4xx.conf
Вывод будет вида:
Running tests
=============
Use failregex filter file : nginx-404, basedir: /etc/fail2ban
Use log file : /var/log/nginx/access.log
Use encoding : UTF-8
Results
=======
Failregex: 31 total
|- #) [# of hits] regular expression
| 1) [31] ^<HOST> - - \[.*\] "(GET|POST).*HTTP.* 404
`-
Ignoreregex: 0 total
Date template hits:
|- [# of hits] date format
| [923] Day(?P<_sep>[-/])MON(?P=_sep)ExYear[ :]?24hour:Minute:Second(?:\.Microseconds)?(?: Zone offset)?
`-
Lines: 923 lines, 0 ignored, 31 matched, 892 missed
[processed in 0.08 sec]
|- Matched line(s):
| 130.255.15.40 - - [08/Aug/2023:17:27:53 +0300] "GET /5553.md HTTP/1.1" 404 41318 "-" "gobuster/3.1.0"
| 130.255.15.40 - - [08/Aug/2023:17:27:53 +0300] "GET /dexter HTTP/1.1" 404 0 "-" "gobuster/3.1.0"
| 130.255.15.40 - - [08/Aug/2023:17:27:53 +0300] "GET /fid.png HTTP/1.1" 404 0 "-" "gobuster/3.1.0"
| 130.255.15.40 - - [08/Aug/2023:17:27:53 +0300] "GET /aslogo.png HTTP/1.1" 404 0 "-" "gobuster/3.1.0"
| 130.255.15.40 - - [08/Aug/2023:17:27:53 +0300] "GET /trustbox HTTP/1.1" 404 0 "-" "gobuster/3.1.0"
| 130.255.15.40 - - [08/Aug/2023:17:27:53 +0300] "GET /4169.docx HTTP/1.1" 404 0 "-" "gobuster/3.1.0"
`-
Missed line(s): too many to print. Use --print-all-missed to print all 892 lines
ПОНРАВИЛАСЬ ИЛИ ОКАЗАЛАСЬ ПОЛЕЗНОЙ СТАТЬЯ, ПОДДЕРЖИ АВТОРА ДОНАТОМ
Обсуждение
Нет комментариев.