Отказ в обслуживании - как это предотвратить

Я постоянно получаю попытки спама с одного IP-адреса (хотя этот единственный IP-адрес меняется ежедневно), пытаясь угадать исполняемые файлы на моем веб-сервере. Все они восходят к одному и тому же месту — облачным вычислениям Tencent в Китае. Эти попытки рассылки спама продолжают вызывать сбой сервера, делая веб-сайт недоступным. Как это остановить?

Я пытался связаться с электронной почтой о злоупотреблениях в сети и позвонить моему провайдеру, чтобы узнать, могут ли они что-нибудь сделать, но безрезультатно.

Пример журнала Apache показан ниже.

[Thu Sep 20 22:47:34.169296 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/help.php' not found or unable to stat
[Thu Sep 20 22:47:34.418703 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/java.php' not found or unable to stat
[Thu Sep 20 22:47:34.682234 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/_query.php' not found or unable to stat
[Thu Sep 20 22:47:34.910484 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/test.php' not found or unable to stat
[Thu Sep 20 22:47:35.138673 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/db_cts.php' not found or unable to stat
[Thu Sep 20 22:47:35.369907 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/db_pma.php' not found or unable to stat
[Thu Sep 20 22:47:36.382860 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/logon.php' not found or unable to stat
[Thu Sep 20 22:47:37.920666 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/help-e.php' not found or unable to stat
[Thu Sep 20 22:47:38.149610 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/license.php' not found or unable to stat
[Thu Sep 20 22:47:38.382743 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/log.php' not found or unable to stat
[Thu Sep 20 22:47:38.616254 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/hell.php' not found or unable to stat
[Thu Sep 20 22:47:38.880654 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/pmd_online.php' not found or unable to stat
[Thu Sep 20 22:47:39.111538 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/x.php' not found or unable to stat
[Thu Sep 20 22:47:39.344646 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/shell.php' not found or unable to stat
[Thu Sep 20 22:47:40.321053 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/desktop.ini.php' not found or unable to stat
[Thu Sep 20 22:47:41.916380 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/z.php' not found or unable to stat
[Thu Sep 20 22:47:42.167929 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/lala.php' not found or unable to stat
[Thu Sep 20 22:47:42.429254 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/lala-dpr.php' not found or unable to stat
[Thu Sep 20 22:47:42.691206 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/wpo.php' not found or unable to stat
[Thu Sep 20 22:47:42.944551 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/text.php' not found or unable to stat
[Thu Sep 20 22:47:43.199610 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/wp-config.php' not found or unable to stat
[Thu Sep 20 22:47:43.455259 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/muhstik.php' not found or unable to stat
[Thu Sep 20 22:47:44.529700 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/muhstik2.php' not found or unable to stat
[Thu Sep 20 22:47:45.925214 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/muhstiks.php' not found or unable to stat
[Thu Sep 20 22:47:46.165955 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/muhstik-dpr.php' not found or unable to stat
[Thu Sep 20 22:47:46.424593 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/lol.php' not found or unable to stat
[Thu Sep 20 22:47:46.683114 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/uploader.php' not found or unable to stat
[Thu Sep 20 22:47:46.941768 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/cmd.php' not found or unable to stat
[Thu Sep 20 22:47:47.199412 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/cmx.php' not found or unable to stat
[Thu Sep 20 22:47:47.436995 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/cmv.php' not found or unable to stat
[Thu Sep 20 22:47:48.608073 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/cmdd.php' not found or unable to stat
[Thu Sep 20 22:47:49.941993 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/knal.php' not found or unable to stat
[Thu Sep 20 22:47:50.202085 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/cmd.php' not found or unable to stat
[Thu Sep 20 22:47:50.465856 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/shell.php' not found or unable to stat
[Thu Sep 20 22:47:50.719343 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/appserv.php' not found or unable to stat
[Thu Sep 20 22:47:53.919666 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/wuwu11.php' not found or unable to stat
[Thu Sep 20 22:47:54.135087 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/xw.php' not found or unable to stat
[Thu Sep 20 22:47:54.365319 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/xw1.php' not found or unable to stat
[Thu Sep 20 22:47:54.600458 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/9678.php' not found or unable to stat
[Thu Sep 20 22:47:54.844971 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/wc.php' not found or unable to stat
[Thu Sep 20 22:47:55.109660 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/xx.php' not found or unable to stat
[Thu Sep 20 22:47:55.364916 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/s.php' not found or unable to stat
[Thu Sep 20 22:47:55.581704 2018] [:error] [pid 27541] [client 192.144.156.249:29474] script '/var/www/html/w.php' not found or unable to stat

обновление: дополнительные журналы

[Tue Sep 25 07:59:21.537385 2018] [core:notice] [pid 28393] AH00094: Command line: '/usr/sbin/apache2' 
[Tue Sep 25 08:32:08.233864 2018] [autoindex:error] [pid 29290] [client 192.141.161.31:41020] AH01276: Cannot serve directory /var/www/html/: No matching DirectoryIndex (index.html,index.cgi,index.pl,index.php,index.xhtml,index.htm) found, and server-generated directory index forbidden by Options directive  
[Tue Sep 25 08:51:23.208687 2018] [autoindex:error] [pid 29759] [client 81.199.17.114:33476] AH01276: Cannot serve directory /var/www/html/: No matching DirectoryIndex (index.html,index.cgi,index.pl,index.php,index.xhtml,index.htm) found, and server-generated directory index forbidden by Options directive   
[Tue Sep 25 09:07:45.829806 2018] [autoindex:error] [pid 30004] [client 157.119.212.30:38609] AH01276: Cannot serve directory /var/www/html/: No matching DirectoryIndex (index.html,index.cgi,index.pl,index.php,index.xhtml,index.htm) found, and server-generated directory index forbidden by Options directive  
[Tue Sep 25 09:33:49.984459 2018] [autoindex:error] [pid 30699] [client 187.10.199.101:35686] AH01276: Cannot serve directory /var/www/html/: No matching DirectoryIndex (index.html,index.cgi,index.pl,index.php,index.xhtml,index.htm) found, and server-generated directory index forbidden by Options directive  
[Tue Sep 25 11:24:46.399677 2018] [autoindex:error] [pid 794] [client 31.7.122.119:57011] AH01276: Cannot serve directory /var/www/html/: No matching DirectoryIndex (index.html,index.cgi,index.pl,index.php,index.xhtml,index.htm) found, and server-generated directory index forbidden by Options directive      
[Tue Sep 25 11:53:06.380975 2018] [autoindex:error] [pid 1362] [client 84.22.54.93:37588] AH01276: Cannot serve directory /var/www/html/: No matching DirectoryIndex (index.html,index.cgi,index.pl,index.php,index.xhtml,index.htm) found, and server-generated directory index forbidden by Options directive      
[Tue Sep 25 12:22:27.732958 2018] [mpm_prefork:notice] [pid 28393] AH00169: caught SIGTERM, shutting down                                                                                                     
[Tue Sep 25 12:22:51.582214 2018] [:notice] [pid 2041] FastCGI: process manager initialized (pid 2041) 
[Tue Sep 25 12:22:51.892511 2018] [mpm_prefork:notice] [pid 2040] AH00163: Apache/2.4.10 (Raspbian) mod_fastcgi/mod_fastcgi-SNAP-0910052141 mpm-itk/2.4.7-02 PHP/5.6.36-0+deb8u1 OpenSSL/1.0.1t configured -- resuming normal operations                                                                             
[Tue Sep 25 12:22:51.892924 2018] [core:notice] [pid 2040] AH00094: Command line: '/usr/sbin/apache2'  
[Tue Sep 25 12:23:01.247551 2018] [core:error] [pid 2040] AH00046: child process 2046 still did not exit, sending a SIGKILL                                                                                   
[Tue Sep 25 12:23:01.247755 2018] [core:error] [pid 2040] AH00046: child process 2047 still did not exit, sending a SIGKILL                                                                                   
[Tue Sep 25 12:23:02.249062 2018] [mpm_prefork:notice] [pid 2040] AH00169: caught SIGTERM, shutting down  

person Matt Woolford    schedule 24.09.2018    source источник


Ответы (4)


У меня есть HTTP-сервер на базе Node, работающий на Raspberry Pi3B+ — я хорошо знаю этот зонд. Каждый IP-зонд использует только IP-адреса, поэтому, если вы посмотрите на заголовок HTTP «хост» — это будет IP-адрес вашего домена или, что еще хуже, буквально localhost.

Этот конкретный зонд, который я зафиксировал сегодня вечером, начинается с вектора атаки на WebDAV, пытаясь переполнить буфер. WebDAV использует уникальный HTTP-заголовок — PROPFIND. Весь захват не помещается в одно изображение, но следующая часть использует локальный хост и дополнительно исследует WebDAV.

Проверка начинается с попытки использования эксплойта WebDAV. Затем проверка начинается с проверки PHP-скриптов, что вы и показали в своем журнале Apache.

Легитимный трафик этого не делает — он использует имя хоста домена, а легитимные боты имеют свое имя в заголовке пользовательского агента, поэтому небольшой анализ заголовка HTTP имеет большое значение. ;-)

обычные заголовки запросов bingbot

Кроме того, сбой, который вы испытываете, происходит в последнем бите сканирования, который НЕ является GET — это POST. (CGI = общий интерфейс шлюза — POST). Обратите внимание, что шквал GET происходит с интервалом в 24 секунды... интересно - этот сканер, вероятно, проверяет буквально тысячи IP-адресов одновременно - вероятно, вам не стоит жаловаться на злоупотребления, учитывая источник проверки. Лучшим советом будет полное игнорирование. В Node я могу разорвать соединение и даже занести IP-адрес в черный список, но — я запускаю много собственного аналитического кода для поддержки этого, и поэтому я понятия не имею, что предлагает Apache в этом отношении.

Это завершающая часть атаки, которую вы описали как захваченную моим сервером сегодня вечером.

person jinzai    schedule 31.12.2018

в Китае.

Вы не можете остановить это.

Вы можете добавить правило брандмауэра, чтобы отбрасывать трафик с этого IP-адреса; однако это бесполезно, потому что он просто появится с другого IP-адреса, и в конечном итоге у вас будут тысячи правил удаления, которые повлияют на производительность.

Ограничение запросов с одного IP-адреса уменьшит нагрузку на сервер, но не остановит сканирование. Если вы хотите пойти по «блокирующему» пути, fail2ban прекрасно работает.

В основном, ваш код просто должен иметь возможность обрабатывать это.

Если ваше веб-приложение является внутренним или имеет ограниченную аудиторию, вы можете отбросить весь трафик, кроме авторизованных адресов.

person Terry Carmen    schedule 24.09.2018
comment
fail2ban работает хорошо. OP также может попробовать cloudflare dns, который также заблокирует большую часть спама от этого бота. - person Michael Jasper; 24.09.2018
comment
Как мне ограничить запросы с одного IP-адреса, как вы предлагаете? Я не так беспокоюсь о сканировании (а должно ли?), так как очень сомневаюсь, что они найдут эксплойт. Ограничение запросов наверняка ограничит их возможности сканирования в процессе? - person Matt Woolford; 25.09.2018
comment
@MattWoolford Это зависит от вашей ОС. Ограничение скорости брандмауэра Google для ‹вашей ОС и версии› Если вы находитесь за реальным устройством брандмауэра или управляемым маршрутизатором, вы можете сделать это там. - person Terry Carmen; 26.09.2018
comment
@TerryCarmen спасибо, я обязательно посмотрю на это. Я только что обновил Debian (который поставляется с обновлениями Apache), и у меня все еще возникают сбои сервера. Не могли бы вы разобраться в этих журналах? Добавлено в вопрос в разделе «Дополнительные журналы». Я не понимаю SIGTERM и SIGKILL - person Matt Woolford; 26.09.2018

Я создал скрипт, который запускается каждую минуту и ​​обнаруживает все виды сбоев как в error.log, так и в access.log. Он также проверяет файл сообщения звездочки на «Не удалось». уф. Пока - это работает как шарм.

Вот сценарий:

#!/bin/bash
clear
#ban IPs:
bip() {
echo "" > tmpIPs
ufw status | grep DENY | awk '$1 !="Anywhere" {print $1}' | sort > tmpinc
exst=$(ufw status | grep "Anywhere                   DENY" | awk '{print $3}' | sort | uniq)
cat $cTarget | while read line
do
 add=$(cat tmpinc | grep $line)
 if [ "$add" != "$line" ]
  then
   ip=$(echo $line | cut -d '.' -f 1,2,3)
   if [ $ip != $ignorIP ]
    then
    echo $line >> tmpIPs
   fi
  fi
done

lAdd=$(cat tmpIPs)
cat tmpIPs | while read line
do
 if [ "$line" != "" ]
  then
  /usr/sbin/ufw insert 1 deny from $line to any  >> $cBanIpLog
  /usr/sbin/ufw insert 1 deny to $line from any >> $cBanIpLog
  echo "       Banned $line" >> $cBanIpLog
  fi
done
rm tmpIPs
}

nMax=5 # Maximum failes
cTarget="/tmp/_ban.ip" # Temporary storage file
cLogFile="/var/log/apache2/access.log" # apache2 access log file
cLogFile1="/var/log/apache2/error.log" # apache2 error.log
cLogFile2="/var/log/asterisk/messages" # asterisk log file
cBanLog="/var/log/banips.log"          #This script log file
cBanIpLog="/var/log/banIP.log"
ignorIP="192.168.1" #IP to ignor, usually home network
dt=$(date +%Y-%m-%d)

echo "Banning IP run at $(date)
Maximum offends: $nMax
Checking logs
        $cLogFile
        $cLogFile1
        $cLogFile11
        $cLogFile12
        " > $cBanIpLog

#Get the bastards out of apache2 and asterisk:
#apache2 access.log
grep 404 $cLogFile | cut -d ' ' -f 1,4 | cut -d ':' -f 1,2,3 | tr -d '[' | sort | uniq -c | sort -rn | awk ' $1 > '"$nMax"' {print $2}' | uniq -c | awk '{print $2}' > $cTarget.tmp
#apache2 error.log
grep "not found or unable to stat" $cLogFile1 | awk '{print $1,$2,$3,$5,$10}' | cut -d ':' -f 1 | sort | uniq -c | awk ' $1 > '"$nMax"' {print $6}' >> $cTarget.tmp
#asterisk messages
grep "failed for" $cLogFile2 | awk -F'failed for' '{print $2}' | awk -F' ' '{print $1}' | awk -F':' '{print $1}'  | tr -d "'" | sort | uniq -c | sort -nr | awk ' $1 > '"$nMax"' {print $2}' >> $cTarget.tmp
#asterisk messages
grep "rejected because extension not found" /var/log/asterisk/messages | awk -F'(' '{print $2}' | awk -F':' '{print $1}' | sort | uniq -c | awk ' $1 > '"$nMax"' {print $2}' >> $cTarget.tmp
#Check myAnt logons
#grep LogonERR /var/www/html/_Public/sys_logs/_qryLogIn.log | awk '{print $3}' | sort | uniq -c | sort -nr | awk '$1 > $nMax {print $2}' >> $cTarget.tmp

#Leave uniq ips
cat $cTarget.tmp | sort | uniq > $cTarget
rm $cTarget.tmp

#Banning
bip
if [ "$lAdd" != "" ]
then
 #Conclude:
 /bin/systemctl restart ufw
 /bin/systemctl status ufw >> $cBanIpLog
 /usr/sbin/ufw status >> $cBanIpLog
 cat $cBanLog | sort | uniq | sort >> /var/log/banips.tmp
 rm $cBanLog
 mv /var/log/banips.tmp $cBanLog
 cat $cBanLog | nl >> $cBanIpLog
 echo "Log file at $cBanIpLog
 nano $cBanLog
 Finished banning $(date)
 " >> $cBanIpLog
 #echo nano /var/log/banips.log
 clear
 cat $cBanIpLog
fi
person Tal Bahir    schedule 24.03.2019

это не "отказ в обслуживании", а вполне обычное сканирование на наличие возможных эксплойтов. то, что IP находится в Китае, не имеет ни малейшего значения - не имея необходимости обслуживать эту территорию, можно отказаться от их обслуживания.

вы можете использовать файл .htaccess (или конфигурацию vhost); это, по крайней мере, заставит сервер не отвечать:

deny from 192.144.156.249

можно отклонять запросы от целых подсетей... что может помочь вообще избавиться от них:

deny from 192.144.

добавление аналогичного правила брандмауэра даже не позволит этим запросам достичь сервера.

разделение IP-трафика едва ли входит в обязанности кода приложения.

person Martin Zeitler    schedule 24.09.2018
comment
В настоящее время в Китае 339 829 544 IP-адреса и около 85 000 сетов. Блокирование их будет проигранной битвой. - person Terry Carmen; 24.09.2018
comment
@TerryCarmen, это всего лишь несколько правил: gist.github.com/anonymous/1b6f1b08273b92cca890 ... идея не в том, чтобы сражаться, а не в том, чтобы участвовать в их игре. если они могут заблокировать остальной мир, то почему не наоборот? - person Martin Zeitler; 24.09.2018
comment
Это просто выделенные IP-адреса. Как только они исчезнут, вам нужно начать блокировать ботнеты, которые есть повсюду. Дело не в том, что это плохая идея, просто она не очень эффективна. Если вы хотите заблокировать что-то, белый список более эффективен. У меня был клиент, у которого был бизнес только в США, поэтому мы занесли в черный список весь мир, а затем внесли в белый список США. Это помогло, но все же не остановило сканирование OP. - person Terry Carmen; 24.09.2018
comment
Мой веб-сервер отключается после этих спам-запросов - если это официально не отказ в обслуживании, то знаете почему? Они ищут подвиги, но я сомневаюсь, что они их найдут. Есть ли способ сосредоточить свои усилия на остановке веб-сервера? Как уже отмечалось, IP-адрес ежедневно обновляется. Кажется, это невозможно заблокировать - person Matt Woolford; 25.09.2018
comment
@MattWoolford Ваше серверное программное обеспечение и/или приложение необходимо обновить. Если он ломается из-за них, то они нашли реальную уязвимость и очень близки (или прошли) взлома. Эти сканирования не должны вызывать ничего более интересного, чем дополнительные записи в журнале. - person Terry Carmen; 25.09.2018