Показаны сообщения с ярлыком Apache. Показать все сообщения
Показаны сообщения с ярлыком Apache. Показать все сообщения

четверг, 12 декабря 2013 г.

Защищаем Apache2 от SlowLoris DDoS


Что такое SlowLoris

У вас случалось такое, когда на сервере нагрузки нет, свободной памяти достаточно, и при этом ваш сайт не открывается?
Если при этом на статусной страничке апача все треды в состоянии R (reading), весьма вероятно, что вы находитесь под атакой SlowLoris.
SlowLoris означает, что злоумышленники открывают множество коннектов к серверу, однако не посылают много-много запросов, а, наоборот, посылают один и медленно-медленно. В таком случае серверу не остается ничего другого, кроме как ждать, когда же вы запрос наконец придёт. А он всё не приходит и не приходит.
В результате все треды (или потоки) апача заняты тем, что ждут, когда же всё-таки запрос придёт.

Nginx перед или вместо Апача

Nginx атаке SlowLoris практически не подвержен. Конечно, у него есть лимит открытых соединений, который по дефолту довольно маленький, однако его можно увеличивать практически безболезненно для системы. Не забывая, конечно, при этом увеличивать значение worker_rlimit_nofile. 
Однако иногда бывает, что по каким-то причинам Нжинкс перед Апачем не поставить. Делать нечего, надо отбиваться другими силами.

Так и как бороться?

Я для этой цели написал небольшой скрипт, который делает следующее:

  1. Выбираем из /server-status список PID'ов процессов апача, которые заняты чтением (reading).
  1. Из вывода netstat смотрим, с каких IP идут коннекты
  1. Баним эти IP
#!/bin/bash
date >> /tmp/banned
lynx -dump  localhost/server-status | grep reading | awk '{if ($6 > 10 ) print $2}' > /tmp/processes
for pid in `cat /tmp/processes`; do
        IP=`netstat -ntp | grep EST| grep $pid | awk '{print $5}' | cut -d: -f1`;
        echo $IP >>  /tmp/banned
        iptables -t raw -I PREROUTING -s $IP -j DROP 2>/dev/null
done
И запускаем этот скрипт по крону раз в сколько-то минут.
Для его работы необходим lynx, который можно установить командой:
$ sudo aptitude install lynx
Не забудьте включить mod_status у апача. В моём случае он отвечает на localhost/server-status.


среда, 2 июня 2010 г.

RoR: связываем Ruby on Rails и Apache2

Про то, как установить Ruby On Rails, я писал в этой статье. Теперь же постараюсь описать, как запускать ROR-приложения под Apache2.
Итак, приступим.

воскресенье, 6 декабря 2009 г.

Взаимодействие PHP и MySQL

В этом посте расскажу о том, как с помощью PHP осуществлять запросы к базе данных на основе MySQL. Использовать для этого будем web-сервер apache 2 с установленным модулем PHP. Все эти три компоненты практически бесплатны и распространяются под лицензией GNU. Подробнее о том, как устанавливать PHP, Apache и MySQL постараюсь написать в одной из следующих статей. Сейчас же представим, что все это уже установлено и сконфигурировано у вас дома, либо вы используете хостинг с поддержкой PHP и MySQL.
Итак, пусть у нас в MySQL есть база world, а в ней таблица people с полями name и age, где name - это имя, а age - возраст человека. И мы ставим себе целью выбрать из этой таблицы всех людей моложе 20 лет. Очевидно, для этого нам надо использовать запрос SELECT.
Начнем. Создаем в папке, которую Apache считает корневой, файл со следующим содержанием
<!DOCTYPE html>
<html>
<head>
<title>Запрос к базе данных</title>
</head>
<body>
<?
//прописываем параметры для соединения с БД
$hostname='localhost';//Имя хоста с БД MySQL, в нашем случае это localhost
$dbName='world';//Имя базы данных, которая нам нужна
$dbUser='username';//Имяпользователя MySQL
$dbPasswd='password';//Его паролт
$dblink=mysql_connect($hostname,$dbUser,$dbPasswd) or exit (3); //Соединяемся с сервером или ошибка
$db_selected=mysql_select_db($dbName,$dblink) or exit(3);//Выбираем БД world
//Подготавливаем наш запрос SELECT
$query="SELECT * FROM people WHERE people.age<20";
//Отправляем запрос в базу
$result=mysql_query($query,$dblink);
//Функция mysql_query отправляет запрос $query по указателю $dblink на базу.
//Обрабатываем результат
while ($man=mysql_fetch_array($result))
//Функция mysql_fetch_array обрабатывает результат, занося по строчке из него в ассоциативный массив $man по полям, которые называются так же, как заголовки столбцов в MySQL
{
 echo "Name = ".$man['name']." Age= ".$man['age']."<br>";//выводим каждую строчки из результата на экран
};
?>
</body>
<html>
Сохраняем этот файл как testquery.php и переходим браузером по адресу http://your_host_name/testquery.php
Все готово) Apache запускает PHP скрипт, и тот выводит нам внутри вашей веб-страницы содержимое таблицы MySQL.