Первая часть здесь «Настройка защищённого VPS (VDS) на Debian, часть первая: установка Apache, PHP, MySQL ».
В первой части мы настроили наш веб-сервер на VPS (VDS) на Debian. Этот сервер и размещённые на нём ваши сайты доступны для всех в Интернете, в том числе и для атак. Я рекомендую проверить ваш сервер одним или всеми этими инструментами:
Устанавливаем mod_evasive
Начнём с mod_evasive. После его установки Low Orbit Ion Cannon (LOIC) и GoldenEye потеряют свою магическую силу над нашим сервером.
Установка несложная:
Теперь открываем конфигурационный файл:
И копируем туда
Здесь:
И добавляем туда строку
Вы можете изменить эти значения в соответствии с количеством и типом трафика, которое вашему серверу нужно обрабатывать. Пожалуйста примите к сведению, если эти величины установлены не должным образом, всё может закончится блокировкой легитимных посетителей.
Здесь другие полезные директивы для mod_evasive:
1) DOSEmailNotify: Отправляет email по определённому адресу, когда IP заносится в чёрный список. В качестве аргумента нужен реальный адрес электронной почты. Если статус SELinux установлен на исполнение, вам нужно предоставить пользователю apache разрешение SELinux для отправки электронной почты. Это делается так, запустите эту команду как рут:
Затем добавьте эту директиву в файл mod_evasive.conf:
2. DOSSystemCommand: Выполняет настроенную системную команду, когда IP адрес добавляется в чёрный список. Это может пригодиться для добавления правил файервола для совместной блокировки IP нарушителей.
Мы будем использовать эту директиву для добавления правила файервола через следующий скрипт
Наша директива DOSSystemCommand будет выглядеть так:
В файл sudoers
добавляем строки (если файла нет, то установите программу sudo):
К сожалению на Debian (воможно, только на некоторых) команда в директиве DOSSystemCommand категорически отказывается запускаться.
Можно уже сейчас перезапустить Apache или сделать это в самом конце после окончания всей настройки:
Останавливаем атаки Slowloris (установка модуля libapache2-mod-qos)
Теперь лишим своих чар и SlowHTTPTest. Для этого мы подключим модуль libapache2-mod-qos. Делается это следующей командой:
Проверяем конфигурационный файл в qos.conf:
Установка mod_reqtimeout
Совсем недавно libapache2-mod-qos поддерживал ещё одну директиву — QS_SrvMinDataRate, но в списке изменений веб-сервера Apache указано, что теперь она не работает и вместо неё рекомендуется использовать mod_reqtimeout. Действительно, если добавить QS_SrvMinDataRate в конфигурационный файл, который приведёт чуть выше, то сервер не запустится из-за ошибки.
Ничего страшного, сейчас мы установим mod_reqtimeout, тем более, что это нетрудно.
И… всё готово. Можно перезапускать сервер, чтобы изменения вступили в силу:
Проверить загруженные модуля Apache можно так:
Настройка файервола для защиты сервера (VPS) от DoS-атак
Файервол может успешно противостоять большинству видам флуда. Эти правила сводили на нет весь флуд кроме SYN-флуда (также не совсем понятно, работают ли правила для ACK-флуда). Основное содержание этого файла заимствована отсюда:
В файле исправлены ошибки и добавлены новые правила. Хотелось бы, чтобы понимающие люди провели аудит файла и дали свои советы.
Правила файервола действуют до перезагрузки, поэтому если вы хотите, чтобы они работали при каждом запуске сервера, то сделайте так:
Переходим в каталог
Создаём файл для редактирования firewall.sh
Делаем его исполнимым
Добавляем его в автозапуск
Запускаем его вручную
Смотрим сообщения:
Заключение
Проверьте ещё раз ваш сервер программами, ссылки на которые даны в начале статьи. Вы увидите, что ни по отдельности, ни все вместе они не могут парализовать работу сервера. Сервер тратит некоторые ресурсы на них, но это не критично.
Тем не менее, процесс настройки сервера ещё не завершён. Не завершена даже настройка от DoS атак. Например, сервер подвержен различного рода флудингам. Для защиты от подобного рода атак необходимо правильно настроенный файервол. Об этом — в одной из следующих статей.
В первой части мы настроили наш веб-сервер на VPS (VDS) на Debian. Этот сервер и размещённые на нём ваши сайты доступны для всех в Интернете, в том числе и для атак. Я рекомендую проверить ваш сервер одним или всеми этими инструментами:
- Стресс-тест сети: DoS веб-сайта в Kali Linux с GoldenEye
- Стресс-тест сети (DoS веб-сайта) со SlowHTTPTest в Kali Linux: slowloris, slow body и slow read атаки в одном инструменте
- Стресс-тест сети с Low Orbit Ion Cannon (LOIC)
Устанавливаем mod_evasive
Начнём с mod_evasive. После его установки Low Orbit Ion Cannon (LOIC) и GoldenEye потеряют свою магическую силу над нашим сервером.
Установка несложная:
Код:
apt-get -y install libapache2-mod-evasive
mkdir -p /var/log/apache2/evasive
chown -R www-data:root /var/log/apache2/evasive
Код:
vim /etc/apache2/mods-available/mod-evasive.conf
Код:
DOSHashTableSize 2048
DOSPageCount 20
DOSSiteCount 300
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
DOSLogDir “/var/log/apache2/evasive”
DOSEmailNotify admin@domain.com
DOSSystemCommand "sudo /usr/local/bin/scripts/ban_ip.sh %s"
Код:
DOSPageCount 20 # максимальное число запросов одной и той же страницы
DOSSiteCount 300 # общее число запросов любого объекта для одного IP на том же listener
DOSPageInterval 1.0 # интервал для порога количества страниц
DOSSiteInterval 1.0 # интервал для порога отсчёта сайта
DOSBlockingPeriod 10.0 # время, на которое клиентский IP будет заблокирован
DOSSystemCommand "sudo /usr/local/bin/scripts/ban_ip.sh %s" # скрипт для блокировки - очень действенно, подробности ниже
- DOSHashTableSize: Размер хэш таблицы, которая используется для хранения трэка активности на один IP. Увеличение этого числа обеспечит более быстрый поиск сайтов, которые клиент посетил в прошлом, но может повлиять на общую производительность, если оно слишком велико.
- DOSPageCount: Числоо идентичных запросов к определённому URI (например, к файлу, который обслуживает Apache), которые посетитель может сделать через интервал DOSPageInterval.
- DOSSiteCount: похоже на DOSPageCount, но относится к тому, как много общих запросов может быть сделано к сайту за интервал DOSPageCount.
- DOSBlockingPeriod: Если посетитель превысил лимиты, установленные DOSSPageCount или DOSSiteCount, он/она будут занесены в чёрный список на период времени DOSBlockingPeriod. Во время этого интервала, любой запрос, приходящий от него/неё, будет возвращён с ошибкой 403 Forbidden.
Код:
vim /etc/apache2/apache2.conf
Код:
Include mods-available/mod-evasive.conf
Здесь другие полезные директивы для mod_evasive:
1) DOSEmailNotify: Отправляет email по определённому адресу, когда IP заносится в чёрный список. В качестве аргумента нужен реальный адрес электронной почты. Если статус SELinux установлен на исполнение, вам нужно предоставить пользователю apache разрешение SELinux для отправки электронной почты. Это делается так, запустите эту команду как рут:
Код:
setsebool -P httpd_can_sendmail 1
Код:
DOSEmailNotify you@yourdomain.com
Код:
DOSSystemCommand <command>
/usr/local/bin/scripts/ban_ip.sh
:
Код:
mkdir /usr/local/bin/scripts
touch /usr/local/bin/scripts/ban_ip.sh
chmod +x /usr/local/bin/scripts/ban_ip.sh
vim /usr/local/bin/scripts/ban_ip.sh
#!/bin/sh
# mod_evasive выявил IP нарушителя
IP=$1
# Пусть к бинарнику iptables исполнимым под пользователем apache через sudo
IPTABLES="/sbin/iptables"
# mod_evasive блокируем директорию
MOD_EVASIVE_LOGDIR=/var/tmp
# Добавляем следующее правило файервола (блокируем IP)
$IPTABLES -I INPUT -s $IP -j DROP
# Разблокируем IP нарушителя после 2 часов через команду 'at' ; смотрите 'man at' для дальнейших деталей
echo "$IPTABLES -D INPUT -s $IP -j DROP" | at now + 2 hours
# Удаляем блокировку директории для дальнейших проверок
rm -f "$MOD_EVASIVE_LOGDIR"/dos-"$IP"
Код:
DOSSystemCommand "sudo /usr/local/bin/scripts/ban_ip.sh %s"
Код:
vim /etc/sudoers
Код:
www-data ALL=NOPASSWD: /usr/local/bin/scripts/ban_ip.sh
Defaults:www-data !requiretty
Можно уже сейчас перезапустить Apache или сделать это в самом конце после окончания всей настройки:
Код:
service apache2 restart
Теперь лишим своих чар и SlowHTTPTest. Для этого мы подключим модуль libapache2-mod-qos. Делается это следующей командой:
Код:
apt-get -y install libapache2-mod-qos
Код:
vim /etc/apache2/mods-available/qos.conf
<IfModule qos_module>
# обрабатывать соединений до 100000 с различных IP
QS_ClientEntries 100000
# будет разрешено только 50 соединений на один IP
QS_SrvMaxConnPerIP 50
# максимальное количество TCP соединений ограничено 256
MaxClients 256
# отключить keep-alive когда 70% TCP соединений заняты:
QS_SrvMaxConnClose 70%
# и ограничить запросы header и body (аккуратнее, это также uploads и
# post запросы):
# LimitRequestFields 30
# QS_LimitRequestBody 102400
</IfModule>
Совсем недавно libapache2-mod-qos поддерживал ещё одну директиву — QS_SrvMinDataRate, но в списке изменений веб-сервера Apache указано, что теперь она не работает и вместо неё рекомендуется использовать mod_reqtimeout. Действительно, если добавить QS_SrvMinDataRate в конфигурационный файл, который приведёт чуть выше, то сервер не запустится из-за ошибки.
Ничего страшного, сейчас мы установим mod_reqtimeout, тем более, что это нетрудно.
Код:
a2enmod reqtimeout
Код:
service apache2 restart
Код:
apachectl -M
Файервол может успешно противостоять большинству видам флуда. Эти правила сводили на нет весь флуд кроме SYN-флуда (также не совсем понятно, работают ли правила для ACK-флуда). Основное содержание этого файла заимствована отсюда:
Ссылка скрыта от гостей
Код:
#!/bin/bash
########################################
# Firewall #
########################################
# Variaveis
#
if_ext=eth0
#
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# ------------------------------------------------
# Protection against TCP syncookies
echo "1" > /proc/sys/net/ipv4/tcp_syncookies
# Ignore ICMP
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all
# Allow access to localhost
iptables -I INPUT -p all -s 127.0.0.1 -j ACCEPT
# Allow connections from origin
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allow external access to ports
iptables -I INPUT -i $if_ext -p tcp --dport 80 -j ACCEPT # HTTP
iptables -I INPUT -i $if_ext -p tcp --dport 22 -j ACCEPT # SSH
iptables -I INPUT -i $if_ext -p tcp --dport 21 -j ACCEPT # SFTP
# Limit connections on Tibia Ports
iptables -A INPUT -p tcp -m recent --rcheck --seconds 60 -j REJECT
iptables -A INPUT -p tcp --dport 7171 -m connlimit --connlimit-above 10 -m recent --set -j REJECT
iptables -A INPUT -p tcp --dport 7172 -m connlimit --connlimit-above 10 -m recent --set -j REJECT
# Limit connections
iptables -I INPUT -p tcp -m state --state NEW,ESTABLISHED -m recent --set -j ACCEPT
iptables -I INPUT -p tcp -m state --state NEW -m recent --update --seconds 3 --hitcount 20 -j DROP
# Block TCP-CONNECT scan attempts (SYN bit packets)
#iptables -A INPUT -p tcp --syn -j DROP
# Block TCP-SYN scan attempts (only SYN bit packets)
iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH SYN -j DROP
# Block TCP-FIN scan attempts (only FIN bit packets)
iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH FIN -j DROP
# Block TCP-ACK scan attempts (only ACK bit packets)
iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH ACK -j DROP
# Block TCP-NULL scan attempts (packets without flag)
iptables -A INPUT -m conntrack --ctstate INVALID -p tcp ! --tcp-flags SYN,RST,ACK,FIN,URG,PSH SYN,RST,ACK,FIN,URG,PSH -j DROP
#Block "Christmas Tree" TCP-XMAS scan attempts (packets with FIN, URG, PSH bits)
iptables -A INPUT -m conntrack --ctstate NEW -p tcp --tcp-flags SYN,RST,ACK,FIN,URG,PSH FIN,URG,PSH -j DROP
# Block DOS - Teardrop
iptables -A INPUT -p UDP -f -j DROP
# Block DDOS - Smurf
iptables -A INPUT -m pkttype --pkt-type broadcast -j DROP
iptables -A INPUT -p ICMP --icmp-type echo-request -m pkttype --pkt-type broadcast -j DROP
iptables -A INPUT -p ICMP --icmp-type echo-request -m limit --limit 3/s -j ACCEPT
# Block DDOS - SYN-flood
#iptables -A INPUT -p TCP --syn -m limit --iplimit-above 9 -j DROP
#iptables -A INPUT -p tcp --syn --dport http -m connlimit --connlimit-above 4 -j REJECT
#iptables -t mangle -N syn-flood
#iptables -t mangle -A syn-flood -m limit --limit 24/s --limit-burst 48 -j RETURN
#iptables -t mangle -A syn-flood -m limit --limit 10/s --limit-burst 10 -j LOG --log-prefix "IPT: DOS (dropped): "
#iptables -t mangle -A syn-flood -j DROP
#iptables -t mangle -A PREROUTING -p tcp --syn -j syn-flood
iptables -A INPUT -p tcp -m state --state NEW -m recent --update --seconds 60 --hitcount 20 -j DROP
iptables -A INPUT -p tcp -m state --state NEW -m recent --set -j ACCEPT
iptables -t mangle -I PREROUTING -p tcp -m tcp --dport 80 -m state --state NEW -m tcpmss ! --mss 536:65535 -j DROP
# Block DDOS - SMBnuke
iptables -A INPUT -p UDP --dport 135:139 -j DROP
iptables -A INPUT -p TCP --dport 135:139 -j DROP
# Block DDOS - Jolt
iptables -A INPUT -p ICMP -f -j DROP
# Block DDOS - Fraggle
iptables -A INPUT -p UDP -m pkttype --pkt-type broadcast -j DROP
iptables -A INPUT -p UDP -m limit --limit 3/s -j ACCEPT
# ACK
iptables -A INPUT -m state --state INVALID -j DROP
/sbin/sysctl -w net/netfilter/nf_conntrack_tcp_loose=0
#-------------------------------------------------------
# "Block DOS - Ping of Death"
iptables -A INPUT -p ICMP --icmp-type echo-request -m length --length 60:65535 -j ACCEPT
# "Block DDOS - UDP-flood (Pepsi)"
iptables -A INPUT -p UDP --dport 7 -j DROP
iptables -A INPUT -p UDP --dport 19 -j DROP
# "Block DDOS - Connection-flood"
iptables -A INPUT -p TCP --syn -m connlimit --connlimit-above 3 -j DROP
#-------------------------------------------------------
# Creates logs of the rest of the connections
iptables -A INPUT -i $if_ext -p all -j LOG --log-prefix " - FIREWALL: droped -> "
Правила файервола действуют до перезагрузки, поэтому если вы хотите, чтобы они работали при каждом запуске сервера, то сделайте так:
Переходим в каталог
/etc/init.d/
Код:
cd /etc/init.d/
Код:
vim firewall.sh
Код:
chmod +x firewall.sh
Код:
update-rc.d firewall.sh defaults
Код:
sh firewall.sh
Код:
cat /var/log/messages
Проверьте ещё раз ваш сервер программами, ссылки на которые даны в начале статьи. Вы увидите, что ни по отдельности, ни все вместе они не могут парализовать работу сервера. Сервер тратит некоторые ресурсы на них, но это не критично.
Тем не менее, процесс настройки сервера ещё не завершён. Не завершена даже настройка от DoS атак. Например, сервер подвержен различного рода флудингам. Для защиты от подобного рода атак необходимо правильно настроенный файервол. Об этом — в одной из следующих статей.