mod_evasive не видит DOSSystemCommand

Автор wegas9393, 21 января 2015, 07:19:36

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

wegas9393

OC:Debian GNU/Linux 7.8
Apache/2.2.22

Поставил mod_evasive
Ставил так:
apt-get install libapache2-mod-evasive
Встал отлично
В файле mod-evasive.load [/etc/nginx/sites-available]
Прописал конфиги

LoadModule evasive20_module /usr/lib/apache2/modules/mod_evasive20.so

DOSHashTableSize 4096
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 300
DOSSystemCommand "sudo /usr/local/bin/ddos_system.sh %s"
DOSLogDir           "/tmp"


Так вот всё работает отлично,кроме команды
DOSSystemCommand,пробивал по разному
DOSSystemCommand "sudo /sbin/iptables -A INPUT -s %s -j DROP" и так
DOSSystemCommand "/bin/echo hi >> /tmp/out.txt" файл не создаёт

Во время проверки всё срабатывает идеально и блокирует на время что в конфиге DOSBlockingPeriod 300 (Вместо сайта показывает 403 Forbidden)
Ну а вот команду выполнять не в какую не хочет,в чом может быть проблема?
Либо может есть у кого скрипт который будет по крону работать и по логам заносить в бан iptables

endru

Цитата: wegas9393 от 21 января 2015, 07:19:36
Apache/2.2.22
....
Поставил mod_evasive
В файле mod-evasive.load [/etc/nginx/sites-available]
ничего не напутал?

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

если уж так нужна блокировка, посмотри fail2ban, возможно он тебе поможет.

wegas9393

#2
Цитата: endru от 21 января 2015, 07:36:37
Цитата: wegas9393 от 21 января 2015, 07:19:36
Apache/2.2.22
....
Поставил mod_evasive
В файле mod-evasive.load [/etc/nginx/sites-available]
ничего не напутал?

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

если уж так нужна блокировка, посмотри fail2ban, возможно он тебе поможет.
Если создать свой конфиг он не читает из него

Вот пример создавал
nano /etc/apache2/mods-available/mod-evasive.conf

Содержимое
<IfModule mod_evasive20.c>
#Размер таблицы адресов
DOSHashTableSize 4096
#Количество одновременно открытых одинаковых страниц сайта для каждого хоста в интервал времени
DOSPageCount 5
#Количество открытых страниц сайта для каждого хоста в интервал времени
DOSSiteCount 50
#Интервал времени для DOSPageCount в секундах
DOSPageInterval 1
#Интервал времени для DOSSiteCount в секундах
DOSSiteInterval 1
#Период блокировки хоста в секундах
DOSBlockingPeriod 10
#Файл логов
DOSLogDir /var/log/mod_evasive.log
#Email для уведомлений о блокировке
DOSEmailNotify test@example.com
#Список адресов для которых не будут работать ограничения
DOSWhitelist 127.0.0.1
DOSWhitelist 192.168.1.1
</IfModule>

От туда не хочет читать,порыскал в интернете пишут что можно прописать и в mod-evasive.load

Либо может кто сможет написать простенький скрипт
Открыть содержимое (спойлер)
Функционал:
Берёт ипы из логов,вид лога dos-53.146.233.323
iptables даёт бан на 10 минут
По окончанию как возьмёт все ипы и забанит чистит папку с логами,так как логи не удаляются
Ну и конечно скрипт будет работать по крону каждую минуту
[свернуть]

Основа скрипта,нужно только добавить что бы ипы брал и в конец очистка логов
Открыть содержимое (спойлер)
#!/bin/bash
#set -x
[ -z $1 ] && (echo "Usage: $0 <sourceip>"; exit 1)
[ -x /usr/bin/at ] || (echo "Please, install 'at'"; exit 1)

#############
## OPTIONS
#

SOURCEIP="$1"
HOSTNAME=$(/bin/hostname -f)
BODYMAIL="/tmp/bodymailddos"
MODEVASIVE_DOSLogDir="/tmp"

FROM="Anti DDOS System <mail@mail.ru>"

# Multiple accounts separated by commas
TO="mail@mail.ru"

# Time-units can be minutes, hours, days, or weeks
BANNEDTIME="10 minute"

#
##
############

# Custom mail message
{
echo "Massive connections has been detected from this source IP: $SOURCEIP

The system has blocked the IP in the firewall for $BANNEDTIME. If the problem persist you should block that IP permanently.

- Anti DDOS System -"
} > $BODYMAIL

/sbin/iptables -I INPUT -s $SOURCEIP -j DROP
echo "/sbin/iptables -D INPUT -s $SOURCEIP -j DROP" | at now + $BANNEDTIME
cat $BODYMAIL | /usr/bin/mail -r "$FROM" -s "DDOS Attack Detected - $HOSTNAME" $TO
rm -f "$MODEVASIVE_DOSLogDir/dos-$SOURCEIP"
[свернуть]

endru

Цитата: wegas9393 от 21 января 2015, 08:12:54Либо может кто сможет написать простенький скрипт

сроку в моём сообщении упустил?
подними fail2ban, напиши регулярное выражение и не парься с кроном.

wegas9393

#4
Цитата: endru от 21 января 2015, 09:40:44
Цитата: wegas9393 от 21 января 2015, 08:12:54Либо может кто сможет написать простенький скрипт

сроку в моём сообщении упустил?
подними fail2ban, напиши регулярное выражение и не парься с кроном.

Хорошо,попробую изучить fail2ban,просто не когда с ним не сталкивался

Сообщение объединено: 22 января 2015, 00:41:34

Поставил fail2ban ну так толком и не разобрался,перечитал кучу манулов ну так и не вышло сделать что бы IP заносились в бан
Может кто помочь с mod_evasive либо помочь с fail2ban?

ihammers

В настройках fail2ban, нужно сказать, чтобы он проверял логи apache2. В /etc/fail2ban/jail.conf правте пункт <<HTTP servers>>, проверяйте путь до логов и ставьте true вместо false в параметре enabled. Также смотрите на параметр maxretry, который может потребуется понизить.

Насчёт mod_evasive, то тут проблема другая, apache2 запущен от пользователя www-data, а вызов iptables нужно от root. Есть костыль, но я бы его не использовал, а попробовал настроить без вызова DOSSystemCommand.
Ссылки по mod_evasive: 1, 2.

Может потребуется проверить настройку (mod_evasive), через различные скрипты, в ссылках выше используется perl. Ниже представлен скрипт на python с GET запросом (GET можно заменить на POST).

import http.client
import urllib.parse

params = urllib.parse.urlencode({'@number': 12524, '@type': 'issue', '@action': 'show'})
headers = {"Content-type": "application/x-www-form-urlencoded",
            "Accept": "text/plain"}

for i in range(100):
    conn = http.client.HTTPConnection("URL")
    conn.request("GET", "", params, headers)
    response = conn.getresponse()
    print(response.status, response.reason, i)
    conn.close()

conn.close()

Debian GNU/Linux Bookworm, LXQt/OpenBox: AMD Ryzen 5 5600G / 64Gb RAM
_______________________________
Debian GNU/Linux Bookworm, без графики: AMD Phenon X4 / 16Gb RAM
_______________________________
Debian GNU/Linux Bookworm, LXQt/OpenBox: Acer Aspire One 722 AMD C60 / 8Gb RAM / ATI HD6290

wegas9393

Цитата: ihammers от 22 января 2015, 05:40:08
В настройках fail2ban, нужно сказать, чтобы он проверял логи apache2. В /etc/fail2ban/jail.conf правте пункт <<HTTP servers>>, проверяйте путь до логов и ставьте true вместо false в параметре enabled. Также смотрите на параметр maxretry, который может потребуется понизить.

Насчёт mod_evasive, то тут проблема другая, apache2 запущен от пользователя www-data, а вызов iptables нужно от root. Есть костыль, но я бы его не использовал, а попробовал настроить без вызова DOSSystemCommand.
Ссылки по mod_evasive: 1, 2.

Может потребуется проверить настройку (mod_evasive), через различные скрипты, в ссылках выше используется perl. Ниже представлен скрипт на python с GET запросом (GET можно заменить на POST).

import http.client
import urllib.parse

params = urllib.parse.urlencode({'@number': 12524, '@type': 'issue', '@action': 'show'})
headers = {"Content-type": "application/x-www-form-urlencoded",
            "Accept": "text/plain"}

for i in range(100):
    conn = http.client.HTTPConnection("URL")
    conn.request("GET", "", params, headers)
    response = conn.getresponse()
    print(response.status, response.reason, i)
    conn.close()

conn.close()



С fail2ban решил не связываться
На счёт mod_evasive пробивал уже всё,включая то что указано по ссылкам что вы дали
Вся проблема в том что сама команда DOSSystemCommand не работает а причина так и не ясна

ihammers

Debian GNU/Linux Bookworm, LXQt/OpenBox: AMD Ryzen 5 5600G / 64Gb RAM
_______________________________
Debian GNU/Linux Bookworm, без графики: AMD Phenon X4 / 16Gb RAM
_______________________________
Debian GNU/Linux Bookworm, LXQt/OpenBox: Acer Aspire One 722 AMD C60 / 8Gb RAM / ATI HD6290

wegas9393

Цитата: ihammers от 22 января 2015, 16:53:28
В студию:
/etc/sudoers

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root ALL=(ALL:ALL) ALL

# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#i1cludedir /etc/sudoers.1
www-data ALL=NOPASSWD: /sbin/iptables *, /usr/bin/at *
www-data ALL=(ALL) NOPASSWD: /sbin/iptables -A INPUT -p tcp --dport 80 -s [0-9.]* -j DROP

ihammers

#9
Цитата: wegas9393 от 23 января 2015, 00:06:47
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
...
www-data ALL=NOPASSWD: /sbin/iptables *, /usr/bin/at *
www-data ALL=(ALL) NOPASSWD: /sbin/iptables -A INPUT -p tcp --dport 80 -s [0-9.]* -j DROP

На выходных постараюсь на виртуалке проверить и написать мини инструкцию.

...Вот к чему пришел... В общем пока в apache2, которая в Debian GNU/Linux, команда DOSSystemcommand неработает. Данная ошибка существует с 2010 года для версий 1.10.1-1/3, bugs.debian.org.

Вывод: либо использовать собранную версию модуля, либо fail2ban, к которому потребуется написать свой фильтр, который будет брать данные от mod_evasive, или из другого места.

Дополнительная информация, мне посоветовали посмотреть в сторону ipset, вместо использования iptables, строк для блокировки. По некоторым иследованиям эта команда работает в 11 раз быстрее: 1, 2
Debian GNU/Linux Bookworm, LXQt/OpenBox: AMD Ryzen 5 5600G / 64Gb RAM
_______________________________
Debian GNU/Linux Bookworm, без графики: AMD Phenon X4 / 16Gb RAM
_______________________________
Debian GNU/Linux Bookworm, LXQt/OpenBox: Acer Aspire One 722 AMD C60 / 8Gb RAM / ATI HD6290