Настройка nginx от сканирования сайта на уязвимости
В логах сервера обнаружены попытки сканирования уязвимостей с использованием инструмента l9explore (или аналогичного). Злоумышленники ищут конфигурационные файлы (.env
, .git/config
и др.), которые могут содержать критически важные данные: API-ключи, пароли, настройки БД и другую чувствительную информацию.
Что можно сделать для защиты:
1. Блокировка IP-адресов
Добавляем блокировку
location / {
deny 195.178.110.0/24;
allow all;
}
После этого перезагрузите Nginx
2. Запрет доступа к чувствительным файлам
Добавьте правила в конфигурацию Nginx, чтобы запретить доступ к файлам, которые сканирует злоумышленник:
location ~ /\.(env|git|htaccess|htpasswd|svn|idea) {
deny all;
return 403;
}
location ~* \.(env|config|dist|template|backup|live|development|local)\.(php|json|yaml|yml|xml|ini|log|sql)$ {
deny all;
return 403;
}
Эти правила:
Запрещают доступ к файлам, начинающимся с
.
(например,.env
,.git
).Запрещают доступ к файлам с расширениями, связанными с конфигурацией (например,
.env.dist
,.env.backup
).
3. Логирование и мониторинг
Настройте логирование подозрительных запросов, чтобы отслеживать подобные атаки:
log_format security '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/security.log security;
Затем можно анализировать логи с помощью инструментов вроде fail2ban или Logwatch.
4. Использование fail2ban
Установите и настройте fail2ban для автоматической блокировки IP-адресов, которые совершают подозрительные запросы. Например, можно создать правило для блокировки IP, которые пытаются получить доступ к .env
файлам.
Пример конфигурации для fail2ban:
Создайте файл
/etc/fail2ban/filter.d/nginx-exploit.conf
:
[Definition]
failregex =
# Блокировка по User-Agent
^<HOST> -.*".*".*".*"(l9explore|Tsunami|sqlmap|nikto|wget|curl|masscan|zgrab|Go-http-client|python-requests)
# Сканирование уязвимых файлов
^<HOST> -.*(GET|POST).*(/\.env|/\.git/config|/wp-config\.php)
# Атаки на WordPress
^<HOST> -.*(GET|POST).*(wp-includes|wp-admin|wp-login\.php|xmlrpc\.php)
# Подозрительные PHP-запросы (если PHP не используется)
^<HOST> -.*GET.*\.php\?.*(cmd|exec|sh)
# DNS-атаки
^<HOST> -.*(GET|POST).*(resolve|dns-query)\?.*
# Строгое правило для бинарных атак (только NULL-байты и SMB)
^<HOST> -.*"(\\x[0-9A-Fa-f]{2})+.*"
# Блокировка известных эксплойтов (например, Log4j)
^<HOST> -.*"\$\{.*\}.*"
ignoreregex =
Добавьте правило в
/etc/fail2ban/jail.local
:
[nginx-exploit]
enabled = true
filter = nginx-exploit
logpath = /var/log/nginx/security.log
maxretry = 3
bantime = 3d
findtime = 600
Перезапустите fail2ban:
sudo systemctl restart fail2ban
- Проверка правил
django@ubuntu:~$ sudo fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-exploit.conf
Running tests
=============
Use failregex filter file : nginx-exploit, basedir: /etc/fail2ban
Use log file : /var/log/nginx/access.log
Use encoding : UTF-8
Results
=======
Failregex: 97 total
|- #) [# of hits] regular expression
| 1) [51] ^<HOST> -.*".*".*".*"(l9explore|Tsunami|sqlmap|nikto|wget|curl|masscan|zgrab|Go-http-client|python-requests)
| 2) [14] ^<HOST> -.*(GET|POST).*(/\.env|/\.git/config|/wp-config\.php)
| 4) [4] ^<HOST> -.*GET.*\.php\?.*(cmd|exec|sh)
| 6) [28] ^<HOST> -.*"(\\x[0-9A-Fa-f]{2})+.*"
`-
Ignoreregex: 0 total
Date template hits:
|- [# of hits] date format
| [580] Day(?P<_sep>[-/])MON(?P=_sep)ExYear[ :]?24hour:Minute:Second(?:\.Microseconds)?(?: Zone offset)?
`-
Lines: 580 lines, 0 ignored, 92 matched, 488 missed
[processed in 0.25 sec]
Missed line(s): too many to print. Use --print-all-missed to print all 488 lines
django@ubuntu:~$
- Проверка заблокированных
django@ubuntu:~$ sudo fail2ban-client status nginx-exploit
Status for the jail: nginx-exploit
|- Filter
| |- Currently failed: 0
| |- Total failed: 1
| `- File list: /var/log/nginx/access.log
`- Actions
|- Currently banned: 44
|- Total banned: 44
`- Banned IP list: 101.69.248.251 121.22.35.6 123.241.41.211 129.153.180.193 134.17.14.122 134.199.146.186 134.199.173.126 134.199.231.115 138.199.40.163 146.70.186.150 159.223.222.170 164.92.250.40 167.172.33.7 167.71.212.171 170.39.218.189 170.39.218.202 180.153.27.22 194.233.83.236 195.178.110.159 195.178.110.163 195.178.110.164 208.110.70.42 213.209.143.30 217.160.89.196 223.130.11.165 24.199.105.211 37.59.218.78 43.139.65.242 45.130.83.1 45.148.10.172 45.148.10.34 45.148.10.35 45.156.128.126 46.101.88.140 60.249.212.60 62.60.191.156 68.183.228.110 78.153.140.151 78.153.140.177 84.17.35.107 84.195.192.75 89.187.178.104 92.205.24.168 118.40.165.223
django@ubuntu:~$
5. Обновление и безопасность
Убедитесь, что ваш сервер и все приложения обновлены до последних версий.
Удалите или переместите чувствительные файлы (например,
.env
) за пределы корневой директории веб-сервера.Используйте HTTPS для шифрования трафика.
6. Дополнительные меры
Настройте WAF (Web Application Firewall), например, ModSecurity, для защиты от атак.
Используйте Cloudflare или другой CDN для фильтрации подозрительного трафика.
Итог
После внесения изменений в конфигурацию Nginx и применения дополнительных мер безопасности, количество подозрительных запросов в логах должно значительно сократиться. Не забывайте регулярно проверять логи и обновлять правила защиты.
Категория: Администрирование | автор: fominyh_vv
Опубликовано: 21-03-2025 15:46 | Обновлено: 28-03-2025 13:39