Назад | Перейти на главную страницу

Как свести к минимуму влияние вредных, постоянных запросов POST

Для немногих месяцы теперь один из наших виртуальных хостинговых серверов постоянно и постоянно забивается запросами «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 - запросы.

за:

  • работает на сетевом уровне
  • IPS может быть заблокирован на определенное количество времени

против:

  • не так-то просто настроить и поддерживать, должен выполняться кем-то, кто знает, как / что делать

проще: настройте nginx перед вашим apache и обработайте 403 оттуда, передавая действительные запросы apache

за:

  • простая установка
  • может обрабатывать больше запросов, чем apache
  • limit-rate может использоваться на уровне IP

против:

  • должен быть проверен