Для немногих месяцы теперь один из наших виртуальных хостинговых серверов постоянно и постоянно забивается запросами «POST /» с сотен тысяч индивидуальных IP-адресов. В ряде случаев это приводило к перегрузке сервера и отказу в отключении обслуживания. Целевой домен довольно утомительный (небольшой агент по недвижимости), поэтому, хотя он кажется вредоносным, я не могу понять мотив этой длительной и 99% безуспешной атаки.
Типичный запрос (взятый из TCPDUMP) выглядит примерно так:
POST / HTTP/1.1
Accept: */*
Accept-Language: en-us
Content-Type: application/octet-stream
Content-Length: 570
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: xxx.co.uk
Connection: Keep-Alive
Cache-Control: no-cache
2+cIPSyYVJFqB9xPFzWoLj9seNyEKIcuIJz/yfkc9tVP+orXgjDk8ywglufcXsMz
bVP4XLcowz/fQtsn2kceQEj/EaEWx/GEbcC3eTbCbTube0suAfEGje3qISKQJ+ka
HaChqun3whii3OTh7vCayGV72lh4raLRandKC5g/73wgQ9Jzh2OLIzNvsiEMSJco
yG+4i35XJMvX7ovx8qJkyByHUIeE5G5M2Kp97O4sOT4jTAK2y/KAMjf6oFgtAJhI
K4/HdcnyfNdI3/4RJXlrSfhUQAc+qhGMEL7AZdtzgRub7lnu+hbuPGZvS3rF1MvL
WK1q4mrnZr0Q3m0bWkzsMZCndQ7fqOBafchjprhn4JKPsjO+upRm2m+irvmJjqnl
sDiR3fnD6pzbWyLTm2qonMJPCll3p6zg06gEfIaW04t9r89/PdHgz8AU8nzO4BX8
qwTG6dSjgbowHyJQmud8Ro+ZT+gHfw/YQUrBqKm7RoFmfJzUoOCKaP1LTwHfI1Gc
E+L8bwQV6ztKBwVn2NqbE83SAXYr9E0QkpaxGg==
Нам не удалось определить, что находится в запросе POST, поскольку он выглядит как мусор, но я не уверен, что это актуально. Это не кодировка base64.
Чтобы уменьшить объем полосы пропускания, используемый ответами на этот запрос, мы запретили использование запросов POST в конфигурации Apache2:
<Location />
<Limit POST>
Order deny,allow
Deny from all
</Limit>
</Location>
Это ограничивает размер ответа простым сообщением 403 Forbidden, а не обычной домашней страницей клиента.
Чтобы попытаться заблокировать IP-адреса, мы попытались передать журнал доступа по конвейеру, отфильтровать запрос POST и передать его непосредственно в iptables:
tail -f /var/www/vhosts/xxx.co.uk/statistics/logs/access_log | grep "POST / " | awk '{print $1}' | xargs -I{} iptables -A INPUT -s {} -j DROP
Это хорошо работает и снижает эффект проблемы, но неумолимо, и обычно нам приходится очищать набор правил iptables, когда он достигает 50-60 КБ из-за проблем с iptables / ядром. Это не решение, так как я не могу просто оставить это работать на несколько недель, пока ответственный не получит сообщение и не сдастся.
Мы отключили KeepAlive и для этого конкретного VirtualHost, чтобы свести количество занятых рабочих Apache к минимуму, что помогло, но это не решение.
Есть ли у кого-нибудь лучшие идеи о том, как заблокировать эти запросы в масштабе сотен тысяч удаленных IP-адресов или уменьшить влияние на Apache до абсолютного минимума? Лучшее, что я могу сделать на данный момент, - это настроить его на отправку 403 Forbidden в сочетании с IP-блокировкой на несколько часов ...
Спасибо!
если у вас есть root-доступ к этой машине, вы можете развернуть snort / suricata с ограниченным набором правил, например обнаруживать и блокировать POST - запросы.
за:
против:
проще: настройте nginx перед вашим apache и обработайте 403 оттуда, передавая действительные запросы apache
за:
против: