Краткое руководство по борьбе с DDOS-атаками на http-сервер
Часто бывает, что некоторые сайты атакуются злоумышленниками. В этой статье давайте рассмотри, какие имеются способы выявления проблемного сайта на вашем сервере, а также восстановления работоспособности других Ваших сайтов. •
Проявление атаки
Проявление атаки чаще всего проявляется в громадном количестве процессов apache, а сервер бывает недоступен, как раз из-за того, что превышено это максимальное количество процессов или как вариант из-за того, что серверу не хватает оперативной памяти.
Диагностика
Чтобы провести диагностику заходим на сервер по ssh. С помощью команд ps и top отметьте большое количество процессов httpd.
Действия администратора
Первым делом включаем firewall – редактируем /etc/rc.conf прописав строки:
firewall_enable=«YES»
firewall_type="/etc/firewall.conf"
Создаем файл /etc/firewall.conf и прописываем:
add allow ip from ip-адрес с_которого_администрируете_сервер
add deny tcp from any to me 80
После проделанных действий выполняем перезагрузку сервера. После нее у Вас будет недоступен apache извне, что озночает прекращение зависаний сервера. Теперь нам нужно определить, на какой конкретно сайт ведется атака. У apache есть свой модуль mod_status httpd.apache.org/docs/2.2 /mod/mod_status.html Данный мод позволяет производить мониторинг загрузки сервера в реальном времени.
Подключение mod_status в Apache 2.2
В apache 2.2 редактируем /usr/local/etc/apache22/httpd.conf Раскомментируем строки:
#LoadModule status_module libexec/apache22/mod_status.so
#Include etc/apache22/extra/httpd-info.conf
Редактируем файл конфигурации /usr/local/etc/apache22/extra/httpd-info.conf
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from .example.com
Меняем на
<Location /server-status>
SetHandler server-status
Раскомментируем строку:
#ExtendedStatus On
Перезапускаем apache.
Подключение mod_status в apache 1.3
Чтобы подключить модуль в apache 1.3, то подключение server_status осуществляется аналогично apache 2.2, за исключение настройки – все настраивается только в /usr/local/etc/apache/httpd.conf
Использование server-status
Теперь по адресу ip-aдрес.сервера/server-status доступна статистика запросов к нему. Аккуратно удаляем правило, запрещающее запросы к серверу по 80 порту.
# ipfw delete 200
И смотрим ip-aдрес.сервера/server-status Нас интересует следующее
0-0 86795 0/31/31 W 0.54 0 0 0.0 0.09 0.09 89.18.166.89 example.com GET / HTTP/1.0
1-0 86796 0/19/19 W 0.30 0 0 0.0 0.06 0.06 79.140.78.68 example.com GET / HTTP/1.0
2-0 86801 0/9/9 W 0.15 0 0 0.0 0.03 0.03 89.18.166.89 example.com GET / HTTP/1.0
3-0 86802 0/9/9 W 0.14 0 0 0.0 0.03 0.03 82.12.33.48 myhost.com GET /server-status/ HTTP/1.1
4-0 86805 0/4/4 W 0.07 1 0 0.0 0.01 0.01 79.140.78.68 example.com GET / HTTP/1.0
5-0 86806 0/3/3 W 0.06 2 0 0.0 0.01 0.01 89.18.166.89 example.com GET / HTTP/1.0
6-0 86807 0/4/4 W 0.07 0 0 0.0 0.01 0.01 89.18.166.89 example.com GET / HTTP/1.0
7-0 86808 1/4/4 C 0.08 0 2015 3.0 0.01 0.01 89.18.166.89 example.com GET / HTTP/1.0
8-0 86811 0/1/1 W 0.02 0 0 0.0 0.00 0.00 89.18.166.89 example.com GET / HTTP/1.0
9-0 86812 0/1/1 W 0.02 0 0 0.0 0.00 0.00 89.18.166.89 example.com GET / HTTP/1.0
10-0 86813 0/1/1 W 0.02 0 0 0.0 0.00 0.00 89.18.166.89 example.com GET / HTTP/1.0
В представленном случае, атака идет пустыми запросами GET / к серверу example.com Лучше всего откючить его. Выполняем это с помощью создания файла .htaccess в корневой папке домена с содержимым:
Deny from All
Теперь при попытке обращения к сайту будет выдаваться ошибка 403 Forbidden, а нагрузка на все остальные сайты на сервере значительно снизится. Обычно флуд-боты обращаются по имени самого сервера, соответственно, пропишите DNS данного домена на IP-адрес 127.0.0.1, когда же кэш DNS, то поток пустых пустых запросов окончательно прекратится.
Дополнительная оптимизация сервера
Дополнительные параметры, которые нужно использовать при настройке сервера: /usr/local/etc/apache22/extra/httpd-mpm.conf
<IfModule mpm_prefork_module>
StartServers 1
MinSpareServers 1
MaxSpareServers 1
MaxClients 150
MaxRequestsPerChild 100
Меняем MaxClients (это максимальное количество процессов) в меньгшую сторону, до того количества процессов, которые не роняют сервер из-за нехватки оперативной памяти. В среднем каждый процесс apache заниамет около 4-8 мегабайт оперативной памяти, так что необходимо чтобы суммарное количество помещалось в оперативной памяти. Редактируем /usr/local/etc/apache22/extra/httpd-default.conf уменьшаем параметры:
Timeout 300
MaxKeepAliveRequests 100
До 60 и 50 соответственно, дабы как можно скорее старые процессы apache прекратили существование. Firewall Прописываем правило:
allow tcp from any to me dst-port 80 limit src-addr 4
Этим Вы сможете ограничить максимальной число одновременных подключений (не нужно делать меньше) с одного IP-адреса. Используйте также утилиту netstat Используем утилиту netstat
# netstat -na | grep 80
# netstat -an | grep :80 | awk ‘{print $5}’ | awk -F: ‘{print $1}’ | sort | uniq
для определения большого количества подключений с одного IP.
Использование nginx
При использовании nginx в качестве Front-End к Apache (стандартная конфигурация при установки nginx совместно с ISPmanager) домен следует отключать в конфигурации nginx, в описании соответственного виртуалхоста. Например:
server {
listen 80;
server_name example.com www.example.com;
Пропишите ниже server_name строку
deny all;
Проделав эти действия nginx будет выдавать 403 Forbidden, а не перенаправлять запросы к apache.
Проявление атаки
Проявление атаки чаще всего проявляется в громадном количестве процессов apache, а сервер бывает недоступен, как раз из-за того, что превышено это максимальное количество процессов или как вариант из-за того, что серверу не хватает оперативной памяти.
Диагностика
Чтобы провести диагностику заходим на сервер по ssh. С помощью команд ps и top отметьте большое количество процессов httpd.
Действия администратора
Первым делом включаем firewall – редактируем /etc/rc.conf прописав строки:
firewall_enable=«YES»
firewall_type="/etc/firewall.conf"
Создаем файл /etc/firewall.conf и прописываем:
add allow ip from ip-адрес с_которого_администрируете_сервер
add deny tcp from any to me 80
После проделанных действий выполняем перезагрузку сервера. После нее у Вас будет недоступен apache извне, что озночает прекращение зависаний сервера. Теперь нам нужно определить, на какой конкретно сайт ведется атака. У apache есть свой модуль mod_status httpd.apache.org/docs/2.2 /mod/mod_status.html Данный мод позволяет производить мониторинг загрузки сервера в реальном времени.
Подключение mod_status в Apache 2.2
В apache 2.2 редактируем /usr/local/etc/apache22/httpd.conf Раскомментируем строки:
#LoadModule status_module libexec/apache22/mod_status.so
#Include etc/apache22/extra/httpd-info.conf
Редактируем файл конфигурации /usr/local/etc/apache22/extra/httpd-info.conf
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from .example.com
Меняем на
<Location /server-status>
SetHandler server-status
Раскомментируем строку:
#ExtendedStatus On
Перезапускаем apache.
Подключение mod_status в apache 1.3
Чтобы подключить модуль в apache 1.3, то подключение server_status осуществляется аналогично apache 2.2, за исключение настройки – все настраивается только в /usr/local/etc/apache/httpd.conf
Использование server-status
Теперь по адресу ip-aдрес.сервера/server-status доступна статистика запросов к нему. Аккуратно удаляем правило, запрещающее запросы к серверу по 80 порту.
# ipfw delete 200
И смотрим ip-aдрес.сервера/server-status Нас интересует следующее
0-0 86795 0/31/31 W 0.54 0 0 0.0 0.09 0.09 89.18.166.89 example.com GET / HTTP/1.0
1-0 86796 0/19/19 W 0.30 0 0 0.0 0.06 0.06 79.140.78.68 example.com GET / HTTP/1.0
2-0 86801 0/9/9 W 0.15 0 0 0.0 0.03 0.03 89.18.166.89 example.com GET / HTTP/1.0
3-0 86802 0/9/9 W 0.14 0 0 0.0 0.03 0.03 82.12.33.48 myhost.com GET /server-status/ HTTP/1.1
4-0 86805 0/4/4 W 0.07 1 0 0.0 0.01 0.01 79.140.78.68 example.com GET / HTTP/1.0
5-0 86806 0/3/3 W 0.06 2 0 0.0 0.01 0.01 89.18.166.89 example.com GET / HTTP/1.0
6-0 86807 0/4/4 W 0.07 0 0 0.0 0.01 0.01 89.18.166.89 example.com GET / HTTP/1.0
7-0 86808 1/4/4 C 0.08 0 2015 3.0 0.01 0.01 89.18.166.89 example.com GET / HTTP/1.0
8-0 86811 0/1/1 W 0.02 0 0 0.0 0.00 0.00 89.18.166.89 example.com GET / HTTP/1.0
9-0 86812 0/1/1 W 0.02 0 0 0.0 0.00 0.00 89.18.166.89 example.com GET / HTTP/1.0
10-0 86813 0/1/1 W 0.02 0 0 0.0 0.00 0.00 89.18.166.89 example.com GET / HTTP/1.0
В представленном случае, атака идет пустыми запросами GET / к серверу example.com Лучше всего откючить его. Выполняем это с помощью создания файла .htaccess в корневой папке домена с содержимым:
Deny from All
Теперь при попытке обращения к сайту будет выдаваться ошибка 403 Forbidden, а нагрузка на все остальные сайты на сервере значительно снизится. Обычно флуд-боты обращаются по имени самого сервера, соответственно, пропишите DNS данного домена на IP-адрес 127.0.0.1, когда же кэш DNS, то поток пустых пустых запросов окончательно прекратится.
Дополнительная оптимизация сервера
Дополнительные параметры, которые нужно использовать при настройке сервера: /usr/local/etc/apache22/extra/httpd-mpm.conf
<IfModule mpm_prefork_module>
StartServers 1
MinSpareServers 1
MaxSpareServers 1
MaxClients 150
MaxRequestsPerChild 100
Меняем MaxClients (это максимальное количество процессов) в меньгшую сторону, до того количества процессов, которые не роняют сервер из-за нехватки оперативной памяти. В среднем каждый процесс apache заниамет около 4-8 мегабайт оперативной памяти, так что необходимо чтобы суммарное количество помещалось в оперативной памяти. Редактируем /usr/local/etc/apache22/extra/httpd-default.conf уменьшаем параметры:
Timeout 300
MaxKeepAliveRequests 100
До 60 и 50 соответственно, дабы как можно скорее старые процессы apache прекратили существование. Firewall Прописываем правило:
allow tcp from any to me dst-port 80 limit src-addr 4
Этим Вы сможете ограничить максимальной число одновременных подключений (не нужно делать меньше) с одного IP-адреса. Используйте также утилиту netstat Используем утилиту netstat
# netstat -na | grep 80
# netstat -an | grep :80 | awk ‘{print $5}’ | awk -F: ‘{print $1}’ | sort | uniq
для определения большого количества подключений с одного IP.
Использование nginx
При использовании nginx в качестве Front-End к Apache (стандартная конфигурация при установки nginx совместно с ISPmanager) домен следует отключать в конфигурации nginx, в описании соответственного виртуалхоста. Например:
server {
listen 80;
server_name example.com www.example.com;
Пропишите ниже server_name строку
deny all;
Проделав эти действия nginx будет выдавать 403 Forbidden, а не перенаправлять запросы к apache.
- 0
- 10 апреля 2012, 17:55
- wiki
Комментарии (0)
RSS свернуть / развернуть