Мне нужны правила для удаления вредоносного соединения Apache

10

Я отбрасываю весь трафик на портах за исключением 80 для моего веб-сервера.

У меня есть несколько таких правил на iptables:

iptables -A INPUT -p tcp -m tcp --dport 80 -m string --string "cgi" --algo bm --to 1000 -j DROP

Кто-то, кто еще может поделиться? Я знаю, что плохие хакеры все еще обновляются, но некоторые из них всегда начинаются с одного и того же кода. Мне нужно сбросить соединение на основе некоторых критериев. Вот некоторые из журналов Apache (я удаляю ips, но каждая атака происходит от одного и того же):

Атака 1: это я не знаю, что пытаюсь сделать, но сделаю это 50 раз с того же ip

GET / HTTP/1.1  301 224 -   Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.152 Safari/537.22
GET / HTTP/1.1  302 3387    -   Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.152 Safari/537.22

Атака 2: попытайтесь получить информацию только о сервере.

GET / HTTP/1.1  301 224 http://myip:80/ Go-http-client/1.1
GET / HTTP/1.1  302 3228    http mywebsite  Go-http-client/1.1
GET /es/ HTTP/1.1   200 40947   https mywebsite Go-http-client/1.1

Атака 3: они пытаются получить доступ к уязвимости страницы входа

GET /userlogin/login.aspx HTTP/1.1  302 186 -   -

Атака 4: это попытка получить доступ к cgi по первому запросу (см. Мое первое правило iptables, чтобы опустить это)

GET /hndUnblock.cgi HTTP/1.0    302 186 -   Wget(linux)
GET /tmUnblock.cgi HTTP/1.0 302 186 -   Wget(linux)

Я очень новичок в работе с сервером, это 4 атаки только за последние 12 часов ... Иметь тысячи в неделю.

Хавьер Палмеро
источник
Я не вижу какой-либо конкретной картины в этих HTTP-запросах. Откуда ты знаешь, что они злые? Я не понимаю, чего ты здесь пытаешься достичь. Не могли бы вы отредактировать свой вопрос, чтобы уточнить? Спасибо.
Дэвид Фёрстер
Здравствуйте, Дэвид! Некоторое время назад, когда я открывал порты, такие как ftp, я получил журнал от brute force, когда я вижу, что в fail2ban за 24 часа на iptables выпало более 100 ips. Я закрываю все порты, кроме 80. Теперь я пытаюсь сделать правила вроде fail2ban, но для apache.
Хавьер
2
Знаете ли вы о mod_security и mod_evasive для Apache?
pa4080
да, у вас есть правила, чтобы поделиться? или где найти? Я блокирую ips из blocklist.de
Хавьер
Я записал почти все, что я знаю о безопасности Apache2.
pa4080

Ответы:

18

Обновление: текущий ответ полностью обновлен.

В соответствии с этим обсуждением я создал репозиторий GitHub с именем WWW Security Assistant . Существует ask_ubuntuответная ветка , посвященная этому ответу. Все ссылки, ранее доступные здесь , удалены из-за ограничения по количеству символов - они доступны на GitHub.

Вот несколько рассмотренных способов, связанных с полным механизмом повышения безопасности Apache2 в Ubuntu 16.04.

Содержание:

  • Сценарий WWW Security Assistant (WSAS) ► Iptables
  • Iptables - базовая конфигурация - сохранение и восстановление
  • ModEvasive для Apache2
  • ModEvasive ► WSAS ► Iptables
  • ModSecurity 2.9 для Apache2
  • Набор базовых правил ModSecurity OWASP 3.x
  • Белый список правил ModSecurity
  • Правила ModSecurity ► WSAS ► Iptables
  • Файлы журналов ModSecurity и Apache
  • Файлы журнала ModSecurity ► Fail2Ban ► Iptables
  • ModSecurity GuardianLog ► HTTPD Guardian ► WSAS ► Iptables
  • ModSecurity GuardianLog ► Пользовательский анализ HTTPD ► WSAS ► Iptables

Кроме того, скажем, всегда полезно использовать HTTPS:


Сценарий WWW Security Assistant ► Iptables

Здесь представлен сценарий www-security-assistant.bash. Это может помочь вам в обработке вредоносных IP-адресов. Скрипт имеет два режима.

Автоматический режим

Когда внешняя программа, такая как Apache mod_security, предоставляет вредоносный $IPадрес. В этом случае синтаксис, который вызывает скрипт, должен быть:

www-security-assistant.bash <ip-address> Guardian
www-security-assistant.bash <ip-address> ModSecurity
www-security-assistant.bash <ip-address> ModEvasive
www-security-assistant.bash <ip-address> a2Analyst

В этом режиме сценарий предоставляет два этапа действий, и для каждого действия он отправляет электронное письмо администратору (-ам).

  • Первый этап: за первые несколько «нарушений» источник $IPбудет заблокирован на период времени, равный значению $BAN_TIME. В этом режиме используется команда at.

  • Второй этап: когда число нарушений от определенного $IPстановится равным значению $LIMIT, этот $IPадрес будет заблокирован навсегда через Iptables и будет добавлен в $BAN_LIST.

Ручной режим

Этот режим принимает следующие параметры:

  • www-security-assistant.bash <ip-address> --DROP "log notes"

    Создает запись в файле /var/www-security-assistant/iptables-DROP.listи генерирует правило как:

    iptables -A GUARDIAN -s $IP -j DROP
    
  • www-security-assistant.bash <ip-address> --DROP-CLEAR "log notes"

    Создает запись в файле /var/www-security-assistant/iptables-DROP-CLEAR.list, удаляет определенное правило Iptables, удаляет $IPиз истории и из $BAN_LIST:

    iptables -D GUARDIAN -s $IP -j DROP
    
  • www-security-assistant.bash <ip-address> --ACCEPT "log notes"

    Создает только запись в файл /var/www-security-assistant/iptables-ACCEPT.list.

  • www-security-assistant.bash <ip-address> --ACCEPT-CHAIN "log notes"

    Создает запись в файле /var/www-security-assistant/iptables-ACCEPT.listи генерирует правило как:

    iptables -A GUARDIAN -s $IP -j ACCEPT
    

зависимости

Скрипт использует iptables-save.shи iptablesцепочку GUARDIAN, объясненную в следующем разделе. Он будет создавать и поддерживать несколько файлов в пределах $WORK_DIR:

  • www-security-assistant.history - содержит данные для предыдущих нарушений IP.
  • www-security-assistant.mail - содержание последнего письма, отправленного скриптом.
  • iptables-ACCEPT.list; iptables-DROP.listи iptables-DROP-CLEAR.list.

Скрипт нуждается в минимальной конфигурации для отправки писем:

sudo apt install s-nail mutt mailutils postfix
sudo dpkg-reconfigure postfix  # For General type: Internet Site
echo 'Test passed.' | mail -s Test-Email email@example.com

Если есть какая-либо настроенная служба HTTPS, ее сертификат TLS может использоваться в службе Postfix.

Кроме того, скрипт использует at: sudo apt install at.

Монтаж

  • Создайте рабочий каталог, давайте назовем его /var/www-security-assistant. Скачайте www-security-assistant.bashи сделайте его исполняемым:

    sudo mkdir /var/www-security-assistant
    sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/www-security-assistant.bash -O /var/www-security-assistant/www-security-assistant.bash
    sudo chmod +x /var/www-security-assistant/www-security-assistant.bash
  • Сделать www-security-assistant.bashдоступным как пользовательскую команду:

    sudo ln -s /var/www-security-assistant/www-security-assistant.bash /usr/local/bin/
  • Предоставить разрешение на www-dataзапуск www-security-assistant.bashбез пароля через sudo. Используйте следующую команду для безопасного создания и редактирования нового файла с дополнительным sudoersправилом:

    sudo visudo -f /etc/sudoers.d/www-security-assistant

    Добавьте следующую строку внутри файла - сохраните файл и выйдите:

    www-data ALL=(ALL) NOPASSWD: /var/www-security-assistant/www-security-assistant.bash
  • Tweak www-security-assistant.bash. Измените хотя бы значение переменной $EMAIL_TO.

Проверить

  • Представьте себя как $AGENTи проверьте, правильно ли работает автоматический режим:

    www-security-assistant.bash 192.168.1.177 Guardian

    Затем проверьте свою электронную почту, введите iptables -L GUARDIAN -n, просмотрите файлы www-security-assistant.historyи www-security-assistant.mail. Выполните указанную выше команду 5 раз и просмотрите файлы iptables-DROP.listи iptables-CURRENT.conf.

  • Проверьте, работает ли ручной режим - добавьте свой локальный хост в белый список:

    www-security-assistant.bash 127.0.0.1 --ACCEPT "Server's localhost IP"

    Затем проверьте файл iptables-ACCEPT.list.


Остальная часть этого урока - как интегрироваться www-security-assistantс вашей системой.


Iptables - базовая конфигурация - сохранение и восстановление

Базовая конфигурация

Пожалуйста, прочтите это руководство перед добавлением следующих правил.

sudo iptables -F

sudo iptables -I INPUT 1 -i lo -j ACCEPT
sudo iptables -I INPUT 2 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# This rule may lock you out of the system!
sudo iptables -P INPUT DROP
sudo iptables -P OUTPUT ACCEPT

Перед выполнением следующих действий откройте новое соединение SSH и попробуйте войти в свою систему, чтобы проверить, все ли работает нормально!

Сохранить и восстановить

Это может быть достигнуто с помощью пользовательских сценариев, которые будут сохранять и восстанавливать iptablesконстанту во время процесса остановки или запуска системы. (Если мы используем UFW для настройки правил Iptables, этот шаг не нужен.)

printf '#!/bin/sh\n/sbin/iptables-save > /var/www-security-assistant/iptables-CURRENT.conf\nexit 0\n' | sudo tee /var/www-security-assistant/iptables-save.sh
printf '#!/bin/sh\n/sbin/iptables-restore < /var/www-security-assistant/iptables-CURRENT.conf\nexit 0\n' | sudo tee /var/www-security-assistant/iptables-restore.sh
sudo chmod +x /var/www-security-assistant/iptables-restore.sh /var/www-security-assistant/iptables-save.sh
sudo ln -s /var/www-security-assistant/iptables-save.sh /etc/network/if-post-down.d/iptables-save
sudo ln -s /var/www-security-assistant/iptables-restore.sh /etc/network/if-pre-up.d/iptables-restore

Создать новую цепочку

Создайте новую цепочку с названием GUARDIANи вставьте ее под номером 3 в INPUTцепочку:

sudo iptables -N GUARDIAN
sudo iptables -I INPUT 3 -j GUARDIAN

Проверить

Перезагрузите систему и проверьте конфигурацию. Пожалуйста, используйте sudo systemctl reboot(не используйте параметр силы reboot -f). Когда система вернется в рабочее состояние, мы можем проверить, существует ли недавно созданная цепочка:

sudo iptables -L GUARDIAN -n


ModEvasive для Apache2

ModEvasive - это модуль уклончивых маневров для Apache, обеспечивающий уклоняющиеся действия в случае атаки HTTP DoS или DDoS или атаки методом "грубой силы". Прочитайте больше...

Монтаж

  • Установите и активируйте модуль:

    sudo apt install libapache2-mod-evasive
    sudo a2enmod evasive
  • Создайте каталог журналов и сделайте его доступным для www-data:

    sudo mkdir -p /var/log/apache2_mod_evasive
    sudo chown www-data /var/log/apache2_mod_evasive
  • Настройте основную конфигурацию - раскомментируйте и отредактируйте определенные директивы в файле конфигурации:

    /etc/apache2/mods-enabled/evasive.conf
  • Перезапустите Apache: sudo systemctl restart apache2.service.

Проверить

  • Откройте веб-страницу с вашего сервера и несколько раз интенсивно обновляйте окно браузера (нажмите F5) - вы должны получить сообщение об ошибке 403 Forbidden . В каталог журнала будет сгенерирован новый файл блокировки. Этот файл должен быть удален для дальнейшего обнаружения нарушений с этого IP-адреса.


ModEvasive ► WSAS ► Iptables

Здесь мы настроим mod_evasiveобщение iptablesчерез www-security-assistant.bashсозданный в предыдущем разделе раздел.

  • Отредактируйте /etc/apache2/mods-available/evasive.confтаким образом:

    <IfModule mod_evasive20.c>
        DOSHashTableSize    3097
        DOSPageCount        9
        DOSSiteCount        70
        DOSPageInterval     2
        DOSSiteInterval     2
        DOSBlockingPeriod   10
    
        #DOSEmailNotify     your@email.foo
        DOSLogDir           "/var/log/apache2_mod_evasive"
        DOSSystemCommand    "sudo /var/www-security-assistant/www-security-assistant.bash %s 'ModEvasive' 'AutoMode' >> /var/www-security-assistant/www-security-assistant.execlog 2>&1"
    </IfModule>
  • Создайте файл журнала и перезапустите Apache:

    sudo touch /var/www-security-assistant/www-security-assistant.execlog && sudo chown www-data /var/www-security-assistant/www-security-assistant.execlog

Чтобы протестировать эту конфигурацию, мы можем смоделировать DDOS-атаку с помощью F5метода, упомянутого выше, или мы можем использовать команды as ab, hping3и т. Д.

Внимание: будьте осторожны, потому что iptablesправило, используемое в WSAS, удалит все новые соединения из источника $IP, включая ваши соединения SSH. Во время тестов хорошо иметь резервный способ подключения к серверу. Вы можете изменить это правило для работы только с портами HTTP / HTTPS.


ModSecurity 2.9 для Apache2

ModSecurity - это механизм брандмауэра для веб-приложений, который сам по себе обеспечивает очень небольшую защиту. Чтобы стать полезным, ModSecurity должен быть настроен с правилами. Чтобы пользователи могли в полной мере воспользоваться преимуществами ModSecurity, Spider Labs от Trustwave предоставляет бесплатный сертифицированный набор правил ... Подробнее ...

Монтаж

  • Установите и активируйте модуль:

    sudo apt install libapache2-mod-security2
    sudo a2enmod security2
  • Создать файл конфигурации:

    sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf

    Читайте и редактируйте /etc/modsecurity/modsecurity.confвнимательно! Добавьте или измените по крайней мере следующие директивы:

    # -- Rule engine initialization ----------------------------------------------
    SecRuleEngine On
    
    # -- Debug log configuration -------------------------------------------------
    SecDebugLogLevel 2
    SecDebugLog "/var/log/apache2_mod_security/modsec_debug.log"
    
    # -- Audit log configuration -------------------------------------------------
    SecAuditLog "/var/log/apache2_mod_security/modsec_audit.log"
    
    # -- Guardian log configuration -------------------------------------------------
    SecGuardianLog /var/log/apache2_mod_security/modsec_guardian.log
  • Файл /etc/apache2/mods-enabled/security2.confвключается /etc/modsecurity/modsecurity.confв конфигурацию Apache. На этом этапе security2.confбудем выглядеть так:

    <IfModule security2_module>
        SecDataDir /var/cache/modsecurity
        IncludeOptional /etc/modsecurity/*.conf
    </IfModule>
  • Создать каталог журналов:

    sudo mkdir -p /var/log/apache2_mod_security
  • Настройка журнала ротации. Сначала создайте файл конфигурации:

    sudo cp /etc/logrotate.d/apache2 /etc/logrotate.d/apache2-modsec

    Затем отредактируйте новый файл следующим образом:

    /var/log/apache2_mod_security/*.log {  }
  • Перезапустите Apache.

Проверить

  • Создайте дополнительный файл конфигурации /etc/modsecurity, назовите его, например z-customrules.conf, и добавьте следующее правило в качестве его содержимого:

    # Directory traversal attacks
    SecRule REQUEST_URI "../" "t:urlDecodeUni, deny, log, id:109"

    Перезапустите сервер: sudo systemctl restart apache2.service. Откройте браузер и введите https://example.com/?abc=../. Результат будет: 403 Запрещено . Проверьте файлы журнала /var/log/apache2_mod_securityдля более подробной информации.

  • Чтобы сделать вещи более увлекательными, поместите скрипт issues.phpв соответствующее место внутри вашего DocumentRoot(здесь я предполагаю, что это место /var/www/html):

    sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/appendix/var/www/html/issues.php -O /var/www/html/issues.php

    Затем измените вышеприведенное правило следующим образом:

    # Directory traversal attacks with redirection (or use URL instead of URI: redirect:'https://example.com/issues.php')
    SecRule REQUEST_URI "../" "t:urlDecodeUni, deny, log, id:109, redirect:'/issues.php'"

    Перезапустите Apache, затем откройте ваш браузер и введите https://example.com/?abc=../;-) Идея заимствована из скрипта SE BotLovin.cs.

  • /etc/modsecurity/z-customrules.confЕще раз отредактируйте и закомментируйте (отключите) правило - это был всего лишь тестовый пример, и он описан в OWASP CRS, описанном в следующем разделе.

  • Вот еще один пример, где мы будем перенаправлять все wp-adminзапросы страниц, но только с определенных IP-адресов (обратите внимание chain):

    # Block wp-admin access
    SecRule REQUEST_URI "^/wp-admin" "id:108, log, deny, status:403, t:lowercase, chain, redirect:'/issues.php'"
        SecRule REMOTE_ADDR "!@ipMatch 192.168.1.11,99.77.66.12"

    Здесь у нас есть два разрушительных действия: (1) deny, status:403и (2) redirect:'/issues.php'. На самом деле нам не нужно denyдействие, потому что оно будет переопределено redirectдействием.


Набор базовых правил ModSecurity OWASP 3.x

В Ubuntu 16.04 можно установить CSR 2.x: apt install modsecurity-crs. Здесь мы установим CSR 3.x , подробные инструкции приведены в руководстве по установке ( gitобязательно).

Монтаж

  • Клонируйте CSR в папке /usr/share/modsecurity-crs.3:

    sudo git clone https://github.com/SpiderLabs/owasp-modsecurity-crs /usr/share/modsecurity-crs.3
  • Обновите и автоматически обновите базу данных GeoIP. (БД GeoIP больше не входит в CRS. Вместо этого рекомендуется регулярно загружать ее.) Сценарий util/upgrade.pyпредоставляет эту функцию. Вы можете использовать его в cron следующим образом sudo crontab -e:

    0 2 * * * /usr/share/modsecurity-crs.3/util/upgrade.py --geoip --crs --cron >> /var/log/apache2_mod_security/owasp-crs-upgrade.log 2>&1
  • Создайте файлы конфигурации:

    sudo cp /usr/share/modsecurity-crs.3/crs-setup.conf{.example,}
    sudo cp /usr/share/modsecurity-crs.3/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf{.example,}
    sudo cp /usr/share/modsecurity-crs.3/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf{.example,}

    Внимательно прочитайте и отредактируйте эти файлы! Раскомментируйте хотя бы SecGeoLookupDBдирективу:

    SecGeoLookupDB util/geo-location/GeoIP.dat
  • Примените конфигурацию Apache. Отредактируйте /etc/apache2/mods-available/security2.confтаким образом:

    <IfModule security2_module>
        SecDataDir /var/cache/modsecurity
        IncludeOptional /etc/modsecurity/*.conf
        IncludeOptional /usr/share/modsecurity-crs.3/crs-setup.conf
        IncludeOptional /usr/share/modsecurity-crs.3/rules/*.conf
    </IfModule>

    Сохраните файл и перезапустите Apache.


Белый список правил ModSecurity

Белый список правил ModSecurity может быть выполнен с помощью следующих директив ModSec, которые могут использоваться во всей системе или в конфигурации виртуального хоста, в том числе и глобально, для определенных каталогов или совпадений расположений:

SecRuleRemoveById
SecRuleRemoveByMsg
SecRuleRemoveByTag
SecRuleUpdateTargetById
SecRuleUpdateTargetByMsg
SecRuleUpdateTargetByTag
SecRuleUpdateActionById

Отключить mod_security2для PhpMyAdmin. Изменить /etc/phpmyadmin/apache.confтаким образом:

<Directory /usr/share/phpmyadmin>
    <IfModule security2_module>
        SecRuleEngine Off
    </IfModule>
</Directory>

Отключить определенные правила для определенного каталога:

<Directory /var/www/html>
    <IfModule security2_module>
        SecRuleRemoveById 973301
    </IfModule>
</Directory>

Отключить правила глобально. Для этого мы должны добавить наши директивы где-нибудь в конфигурационных файлах Apache: /etc/modsecurity/z-customrules.confэто хорошее место.

  • Отключите правила во всей конфигурации Apache:

    SecRuleRemoveById 973301 950907
  • Внесите в белый список IP-адрес, чтобы он мог проходить через ModSecurity:

    SecRule REMOTE_ADDR "@ipMatch 192.168.110.1" "phase:1,nolog,allow,ctl:ruleEngine=Off,ctl:auditEngine=Off"
  • Отключить правила в каталоге соответствия:

    <Directory /var/www/mediawiki/core>
        SecRuleRemoveById 973301 950907
    </Directory>
  • Обновить действие правила по его идентификатору в соответствии с местоположением:

    <LocationMatch "/index.php.*">
        SecRuleUpdateActionById 973301 "pass"
        SecRuleUpdateActionById 950907 "pass"
    </LocationMatch>

В приведенных выше примерах мы предполагаем , что 973301и 950907являются правила идентификаторы , которые препятствуют нормальной работе наших веб - приложений. Мы можем найти правила как эти путем анализа modsec_audit.log.


Правила ModSecurity ► WSAS ► Iptables

Здесь приведены еще несколько примеров, как создавать собственные SecRules, а также как мы можем через них вызывать WWW Security Assistant Script (WSAS).

Начальная настройка

Нам нужен дополнительный скрипт запуска modsecurity-assistant.sh. Причина в том, что execдействие ModSecurity имеет слишком простой и ограниченный синтаксис.

sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/modsecurity-assistant.sh -O /var/www-security-assistant/modsecurity-assistant.sh
sudo chmod +x /var/www-security-assistant/modsecurity-assistant.sh

Если вы заглянете внутрь скрипта, вы увидите несколько переменных, которые экспортируются ModSecurity. К ним относятся: $REQUEST_URI, $ARGS, $SERVER_NAME, $REMOTE_ADDR, $REMOTE_HOSTи $UNIQUE_ID. Другие переменные объясняются внутри скрипта.

Создайте собственное правило и вызывайте наши скрипты через него

Сначала давайте создадим правило, которое будет выполняться modsecurity-assistant.sh(и вызываться www-security-assistant.bash), когда URI запроса содержит слово, которое включено в наш черный список. Откройте /etc/modsecurity/z-customrules.confи добавьте следующие строки внизу:

# REQUEST_URI words blacklist
#
SecRule REQUEST_URI "@pmFromFile /var/www-security-assistant/modsecurity-uri-black.list" \
    "id:150, log, t:lowercase, chain, \
    drop, deny, status:403, redirect:'/issues.php'"
    SecRule REMOTE_ADDR "!@ipMatchFromFile /var/www-security-assistant/modsecurity-ip-white.list" \
        "setenv:REMOTE_HOST=%{REMOTE_HOST}, \
         setenv:ARGS=%{ARGS}, \
         exec:/var/www-security-assistant/modsecurity-assistant.sh"
  • REQUEST_URI- эта переменная содержит полный URI из текущего запроса. Правило должно быть более широким:SecRule REQUEST_URI|ARGS|REQUEST_BODY ...

  • @pmFromFileбудет читать файл modsecurity-uri-black.list, содержащий список фраз, где каждая конкретная фраза или слово помещается в новую строку. Вы можете собирать интересные слова и фразы из файлов журнала. Если есть конкретное соответствие между REQUEST_URIнашим списком шаблонов и правилом, то будет применяться правило. Файл может быть пустым, но вы должны создать ( touch) его.

  • logДействие приведет к созданию записей журнала в лог - файлы для этого правила с id:150.

  • drop, denystatus) и redirectдействия относятся к подрывной группе действий, они должны быть в начале правила chain(если есть цепочка). Второе действие переопределит первое, а третье переопределит второе, поэтому вы должны выбрать, какое действие вы хотите выполнить, и можете удалить остальные.

  • chainдействие вызовет следующее правило цепочки, обратите внимание, что второе правило не имеет id.

  • REMOTE_ADDR содержит IP-адрес запроса.

  • @ipMatchFromFileБудет ли файл, modsecurity-ip-white.listкоторый содержит белый список IP-адресов, разделенных на новых строках. Записи CIDR также приемлемы. Поскольку разрушительное действие всегда находится в главном правиле цепочки, оно будет применено, но когда определенный IP-адрес находится в этом белом списке, execдействие не будет применено. Файл может быть пустым, но вы должны создать ( touch) его.

  • execДействие вызовет наш внешний скрипт. Это действие не нарушает работу и будет выполнено, когда текущее правило вернет true. Когда это действие будет применено, удаленный IP будет обрабатываться через наши скрипты.

  • setenvэто действие экспортирует определенные внутренние переменные =%{...} как envvars, экспортированные имена могут отличаться от внутренних. Некоторые переменные должны быть экспортированы вручную, некоторые другие экспортируются автоматически - возможно, это небольшая ошибка (в некоторых случаях ручной экспорт с такими же именами, например setenv:REQUEST_URI=%{REQUEST_URI}, приведет к пустому значению экспортируемой переменной).

Проверить

Предположим, у вас нет Joomla на вашем сервере, отредактируйте файл modsecurity-uri-black.listи добавьте строку с контентом /joomla. Затем введите в своем браузере https://exemple.com/joomla. Вы должны быть перенаправлены и заблокированы через Iptables. Очистите записи sudo www-security-assistant.bash <your-ip> --DROP-CLEAR 'some note', добавьте свой IP modsecurity-ip-white.listи повторите упражнение. Теперь вы должны быть перенаправлены, но не заблокированы.

Соедините наши скрипты с OWASP Core Rule Set 3.x

Для этого мы обновим действие по умолчанию Правил режима аномалии (949110 и 959100). Для этого отредактируйте файл /usr/share/modsecurity-crs.3/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.confи добавьте следующие строки внизу:

# -- Anomaly Mode - Update actions by ID -----
#

SecRuleUpdateActionById 949110 "t:none, drop, deny, status:403, redirect:'/issues.php', \
     setenv:REMOTE_HOST=%{REMOTE_HOST}, setenv:ARGS=%{ARGS}, \
     exec:/var/www-security-assistant/modsecurity-assistant.sh"

SecRuleUpdateActionById 959100 "t:none, drop, deny, status:403, redirect:'/issues.php', \
     setenv:REMOTE_HOST=%{REMOTE_HOST}, setenv:ARGS=%{ARGS}, \
     exec:/var/www-security-assistant/modsecurity-assistant.sh"

# -- Anomaly Mode - Whitelist some URI and IP addresses -----
#

SecRule REQUEST_URI "^/wp-admin/admin-ajax.php*|^/index\.php\?title=.*&action=(submit|raw&ctype=text/javascript|raw&ctype=text/css)$" \
    "id:'999010', t:none, phase:1, pass, \
     ctl:ruleRemoveById=949110, \
     ctl:ruleRemoveById=959100"

SecRule REMOTE_ADDR "@ipMatchFromFile /var/www-security-assistant/modsecurity-ip-white.list" \
    "id:'999020', t:none, phase:1, pass, \
     ctl:ruleRemoveById=949110, \
     ctl:ruleRemoveById=959100"

Проверить

Не забудьте перезапустить (или перезагрузить) Apache, чтобы применить изменения конфигурации. Не забывайте периодически очищать записи во время тестов, иначе вы можете быть заблокированы навсегда :-)

Имитация атаки через каталог:

https://example.com/?abc=../../../                         # This should be redirected and blocked
https://example.com/wp-admin/admin-ajax.php?abc=../../../  # This should pass because of the whitelist rule

Имитация атаки SQL-инъекций:

https://example.com/?username=1'%20or%20'1'%20=%20'1&password=1'%20or%20'1'%20=%20'1
https://example.com/index.php?username=1'%20or%20'1'%20=%20'1'))/*&password=foo


Файлы журналов ModSecurity и Apache

Веб-сервер Apache можно настроить для предоставления администратору сервера важной информации о том, как он работает ... Основным способом обеспечения обратной связи с администратором является использование файлов журнала. Прочитайте больше...

ModSecurity имеет мощный механизм регистрации. В соответствии с директивой SecGuardianLogон предоставляет фид логов, специально разработанный для работы с внешними скриптами.

В настоящее время единственный инструмент , как известно, работу с протоколированием хранителя является httpd-guardian, который является частью HTTPD инструментов проекта Apache . httpd-guardianИнструмент предназначен для защиты от атак отказа в обслуживании. Он использует blacklist toolдля взаимодействия с брандмауэром на основе iptables ..., динамически занося в черный список нарушающие IP-адреса. Прочитайте больше...


Файлы журнала ModSecurity ► Fail2Ban ► Iptables

Можно настроить Fail2Ban для анализа данных файлов журнала Apache. modsec_audit.logэто, пожалуй, лучший выбор, но посмотрите также разделы, о которых мы говорим SecGuardianLog.

Позаботьтесь о том, чтобы SecAuditLogRelevantStatusв /etc/modsecurity/modsecurity.confкомментариях. В противном случае все, кто получит страницу с ошибкой 404, будут заблокированы fail2ban.

SecAuditEngine RelevantOnly
#SecAuditLogRelevantStatus "^(?:5|4(?!04))"

В настоящее время Fail2Ban никак не реализован в этом проекте.


ModSecGuardianLog ► HTTPD-Guardian ► WSAS ► Iptables

httpd-guardian- обнаружение DoS-атак путем мониторинга запросов Apache Security, Copyright (C) 2005 Ivan Ristic - предназначен для мониторинга всех запросов веб-сервера с помощью механизма регистрации по трубопроводам. Он отслеживает количество запросов, отправленных с каждого IP-адреса ... httpd-guardian может либо выдать предупреждение, либо выполнить скрипт для блокировки IP-адреса ...

Этот сценарий можно использовать с механизмом ведения журнала Apache2 или с ModSecurity (лучше).

Установка и настройка в текущих условиях

Скачайте httpd-guardianи сделайте его исполняемым:

sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/httpd-guardian.pl -O /var/www-security-assistant/httpd-guardian.pl
sudo chmod +x /var/www-security-assistant/httpd-guardian.pl

Прочитайте строки, 98-119чтобы увидеть, как скрипт связан с нашим скриптом WSAS.

Примените следующее изменение в конфигурации Apache ( /etc/modsecurity/modsecurity.conf), затем перезапустите его:

#SecGuardianLog /var/log/apache2_mod_security/modsec_guardian.log
SecGuardianLog "|/var/www-security-assistant/httpd-guardian.pl"

Проверить

Чтобы протестировать скрипт, отключите ModEvasive ( sudo a2dismod evasiveне забудьте включить его позже) и перезапустите Apache. Тогда tailжурнал exec:

tail -F /var/www-security-assistant/www-security-assistant.execlog

А из другого экземпляра выполните DoS-атаку, например, используйте abтаким образом:

for i in {1..20}; do (ab -n 200 -c 10 https://example.com/ &); done


ModSecGuardianLog ► Пользовательский анализ ► WSAS ► Iptables

Здесь представлен простой скрипт под названием httpd-custom-analyze.bash, который не является чем-то особенным, но может быть хорошим примером. Его особенности описаны в теле скрипта.

Установка и настройка

Скачайте httpd-custom-analyze.bashи сделайте его исполняемым:

sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/httpd-custom-analyze.bash -O /var/www-security-assistant/httpd-custom-analyze.bash
sudo chmod +x /var/www-security-assistant/httpd-custom-analyze.bash

Примените следующее изменение в конфигурации Apache ( /etc/modsecurity/modsecurity.conf) и перезапустите его:

#SecGuardianLog /var/log/apache2_mod_security/modsec_guardian.log
#SecGuardianLog "|/var/www-security-assistant/httpd-guardian.pl"
SecGuardianLog "|/var/www-security-assistant/httpd-custom-analyze.bash"
  • Скрипт будет вызывать WSAS при достижении порога - прочитать строку 86и 35.

  • Чтобы оба httpd-сценария работали одновременно, отредактируйте modsecurity.confи передайте SecGuardianLogих обоим.

  • Для проведения теста следуйте советам из приведенного выше раздела.

pa4080
источник
Пожалуйста, не часто редактируйте свой пост. Постоянное редактирование вашего поста много-много раз в день постоянно натыкается на первую страницу, а также создает шум для нас, модераторов. Вместо этого рассмотрите возможность перетаскивания вашего контента на другую страницу или в текстовый редактор , а затем редактируйте его в массовом порядке, а не индивидуально редактируйте детали. (Этот пост заблокирован на час, чтобы временно ограничить редактирование, выполняемое здесь)
Томас Уорд
1
Спасибо за замечание, @ThomasWard. Я буду иметь ввиду! Разве это не хорошая идея, чтобы что-то вроде песочницы на странице «Пользователи», рядом с «Редактировать профиль и настройки» ?
pa4080
1
Это было предложено, и я считаю, отклонено. Я хотел бы предложить вам внести изменения без сохранения и сохранить копию вопроса как есть в текстовом файле в вашей системе, затем вы можете отредактировать его, скопировать обратно, когда вы хотите отредактировать сообщение, а затем исправить для уценки и тому подобное. Кроме того, все зачеркивания ... затрудняют чтение. Попробуйте просто удалить эти разделы. (История изменений сохранит данные)
Томас Уорд
Смешно, что Stack Exchange не позволяет не вносить изменения в первую страницу
Franck Dernoncourt
1

Я понимаю, что pa4080 дал подробный и, вероятно, очень полезный ответ, чтобы позаботиться обо всем этом самостоятельно. Хотя самостоятельное решение проблем может показаться вам приятным, это также может занять много времени .

  1. Ознакомьтесь с Cloudflare, поскольку они предоставляют бесплатную защиту от DDoS.
  2. Если вы в настоящее время используете только Apache, подумайте о том, как работает NGINX, чтобы сбалансировать вашу нагрузку. NGINX отлично подходит для балансировки нагрузки Apache, как показано здесь и здесь .
  3. Ознакомьтесь с советами Apache по безопасности в своих документах .
асфиксия
источник