Оновлення: Поточна відповідь повністю оновлена.
Відповідно до цієї дискусії я створив сховище GitHub під назвою Помічник з безпеки WWW . ask_ubuntu
Ця галузь, яка називається , присвячена цій відповіді. Усі посилання, раніше доступні тут , видаляються через обмеження кількості символів - вони доступні на GitHub.
Ось декілька способів перегляду, які задіяні в повному механізмі, як підвищити безпеку Apache2 в Ubuntu 16.04.
Зміст:
- Сценарій помічника безпеки WWW (WSAS) ► Iptables
- Iptables - Основна конфігурація - Збереження та відновлення
- ModEvasive для Apache2
- ModEvasive ► WSAS ► Iptables
- ModSecurity 2.9 для Apache2
- ModSecurity OWASP Набір основних правил 3.x
- Білий список правил мод безпеки
- Правила безпеки ModS ► WSAS ► Iptables
- Файли журналу ModSecurity та Apache
- Файли журналу ModSecurity ► Fail2Ban ► Iptables
- ModSecurity GuardianLog ► HTTPD Guardian ► WSAS ► Iptables
- ModSecurity GuardianLog ► Спеціальний аналіз HTTPD ► WSAS ► Iptables
Крім того, скажімо, що завжди добре використовувати HTTPS:
Сценарій асистента з безпеки WWW ► 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
Підкрутити 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 повідомлення про заборонену помилку. У каталог журналів буде створений новий файл блокування. Цей файл слід видалити для подальшого виявлення злочинів із цієї 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
згаданого вище методу, або ми можемо використовувати команди як ab
, hping3
і т.д.
Увага: Будьте уважні, тому що iptables
правило, яке використовується в WSAS, перерве всі нові з'єднання з джерела $IP
, включаючи ваші SSH-з'єднання. Добре мати резервний спосіб підключення до сервера під час тестів. Ви можете змінити це правило для роботи тільки з портами HTTP / HTTPS.
ModSecurity 2.9 для Apache2
ModSecurity - це механізм брандмауера веб-додатків, який забезпечує дуже низький захист. Для того, щоб стати корисним, ModSecurity має бути налаштований на правила. Для того, щоб користувачі могли повністю використовувати ModSecurity поза коробкою, Trustwave's Spider Labs надає безкоштовний сертифікований набір правил ... Детальніше ...
Установка
Встановіть і ввімкніть модуль:
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
потрібно).
Установка
Клоніруйте КСВ у папці /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 може бути здійснено за допомогою наступних директив 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>
Оновіть дію правила за його ідентифікатором у межах матчу Location:
<LocationMatch "/index.php.*">
SecRuleUpdateActionById 973301 "pass"
SecRuleUpdateActionById 950907 "pass"
</LocationMatch>
У наведених вище прикладах ми припускаємо, що це 973301
і 950907
є ідентифікатори правил, які перешкоджають нормальній роботі наших веб-додатків. Ми можемо знайти такі правила як за допомогою аналізу modsec_audit.log
.
Правила безпеки ModS ► WSAS ► Iptables
Тут наведено ще кілька прикладів, як створити користувацькі SecRules, а також як ми можемо викликати через них сценарій помічника безпеки WW WWW.
Початкова настройка
Нам потрібен додатковий сценарій запуску - 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
, deny
(з status
) і redirect
дії належать до групи руйнівних дій, вони повинні бути на початку правила chain
(якщо є ланцюжок). Друга дія перекриє першу, а третя перевизначить другу, тому ви повинні вибрати, який ви хочете виконати, і можете видалити інші.
chain
дія буде викликати наступне правило ланцюга, зауважимо, що другого правила не має id
.
REMOTE_ADDR
містить IP-адресу запиту.
@ipMatchFromFile
буде файл, modsecurity-ip-white.list
який містить білий список IP-адрес, розділених у нових рядках. Записи CIDR також прийнятні. Оскільки руйнівна дія завжди знаходиться в провідній нормі ланцюга, вона буде застосована, але коли певний IP знаходиться в цьому білому списку, exec
дія не застосовуватиметься. Файл може бути порожнім, але його потрібно створити ( touch
).
exec
дії викликатиме наш зовнішній сценарій. Ця дія не є руйнівною і буде виконуватися, коли поточне правило повернеться в істинне значення. Якщо ця дія застосовується, віддалений 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
і повторіть вправу. Тепер ви повинні бути переспрямовані, але не заблоковані.
Підключіть наші сценарії з набором правил 3.x для основного правила OWASP
Для цього ми оновимо дію за замовчуванням Правил режиму аномалії (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 Іван 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
журнал виконання:
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
їх обом.
Щоб виконати тест, дотримуйтесь порад з наведеного вище розділу.