Защита http(s) web-сервера Apache2 от SYN/GET/POST флуда.

Базовая функциональность RouterOS
Аватара пользователя
promychev
Сообщения: 16
Зарегистрирован: 03 авг 2017, 21:36
Откуда: Sweden

Защита http(s) web-сервера Apache2 от SYN/GET/POST флуда.

Сообщение promychev »

И так здравствуйте. Пользуясь CISCO ASA Firewall стало понятно что можно отфильтровать любой тип атаки, а главное анализировать трафик и пакеты.
В Mikrotik все почти так же, но функциями он немного ограничен.
Для примера я взял 2 выделенных IPv4, выделил 2 VPS сервера и выключил фильтрацию через Общую сеть на CISCO ASA.
И так - у меня 2 IPv4 без так сказать l3/l4/l7 защиты:
Первый IP(1.1.1.1) это будет VPS Debian OS = Apache2 + php5 + mysql на котором будет стоять сайт с движком Xenforo, что бы атаки шли по полной.
Второй IP(2.2.2.2) это будет VPS Router OS Mikrotik 5.20 c крякнутой лицензией.
И так я поставил 2 VPS сервера с IPv4 внешними.
Пробросил NAT с Router VPS 2.2.2.2 => на Debian VPS 1.1.1.1
Запускаю SYN Flood на 80 порт = Сервер apache2 перестал отвечать(флуд вызвал нагрузку успешно), запустил GET/POST атаку = Сервер apache2 перестал отвечать(флуд вызвал нагрузку успешно). И так что же делать ? Задам сразу цепочку моих правил которые я прописал на быструю руку, что довольно эффективно повлияло на защиту http. Для начала я анализировал пакеты простых пользователей, а потом пакеты атакующих. Разница - огромная. Но даже если маленькая и то можно прописать целую цепочку правил для проверки и успешной фильтрации.

И так - правила лучше писать в той же последовательности как я укажу тут :

Правило 1 (Одобряем установленные соединения):

Код: Выделить всё

Chain = forward; Protocol = (6)tcp; Connection state = established; Action = accept;
Правило 2 (Одобряем выпущенные соединения):

Код: Выделить всё

Chain = forward; Protocol = (6)tcp; connection state = released; Action = accept;
Правило 3 (Запрещаем неверные запросы):

Код: Выделить всё

Chain = forward; Protocol = (6)tcp; connection state = released; Action = drop;
Правило 4 (Запрещаем фрагментированные пакеты для установленных соединений):

Код: Выделить всё

Chain = forward; Protocol = (6)tcp; connection state = released; Action = drop;
Правило 5 (Фильтруем SYN атаки - метод Чупаки):

Код: Выделить всё

Chain = forward; Protocol = (6)tcp; Dst. port = 80-443; connection state = new; Action = jump , Jupm Target = block-ddos;
Правило 6 (Проверка на Dst.Limit )

Код: Выделить всё

Chain = block-ddos; Protocol = (6)tcp; Dst. port = 80-443; Dst. Limit = Rate 10/s, Brust 50 Limit by dst. address, Expire 50.00 ; Action = return;
Правило 8 (Создания IP листа для ddoser)

Правило 7 (Создания IP листа для ddoser)

Код: Выделить всё

Chain = block-ddos; Protocol = (6)tcp; Dst. port = 80-443; Action = add src. address list, Address list = ddoser, time out = 00:10:00 
Правило 9 (Создания IP листа для ddosed)

Код: Выделить всё

Chain = block-ddos; Protocol = (6)tcp; Dst. port = 80-443; Action = add dst. address list, Address list = ddosed, time out = 00:10:00
Правило 10 (Защита от HTTP GET/POST)

Код: Выделить всё

Chain = forward; Protocol = (6)tcp; Dst. port = 80-443; Connection limit = Limit 200, Netmask 32;  Action = add dst. address list, Address list = Limitor, time out = 00:10:00
Правило 11 (Отбрасываем UDP протокол)

Код: Выделить всё

Chain = forward; Protocol = udp; Action = reject (icmp network unreachable);
Так же для тех у кого паранойя с apache2 - можете добавить Layer 7 протоколы regexp.
Список регэкспов :
Защита для PHP

Код: Выделить всё

^<HOST> -.*"(GET|POST).*\?.*\=http\:\/\/.* HTTP\/.*$
anti-hack-apache2 (WP и прочих дел)

Код: Выделить всё

\[client <HOST>\] (File does not exist|script not found or unable to stat): [^ ]*/([^ ]*\.asp|[^ ]*\.dll|[^ ]*\.exe|admin|Admin|Ads|ads|apps|archive|awstats|b0ard|bin|blog|board|cgi|clan|cms|community|cube|database|datenbank|directforum|drupal|f0rum|file:|forum|horde|Horde|html|mail|myadmin|mysql|padmin|page|php|pma|PMA|rc|README|rms|round|scgi|script|seite|sql|stat|ucp.php|wbb|WBB|web|wm|wp-login.php|xmlrpc|xmlsrv)
apache2-attacker

Код: Выделить всё

^<HOST> - - \[[^]]+\] "GET / HTTP/1.1"$
apache-common1

Код: Выделить всё

^<HOST>.* "HEAD / .*$
apache-common2

Код: Выделить всё

^<HOST>.* "POST /xmlrpc.php HTTP.*$
apache_error_client

Код: Выделить всё

\[[^]]*\] \[(error|\S+:\S+)\]( \[pid \d+:\S+ \d+\])? \[client <HOST>(:\d{1,5})?\]
appache-post

Код: Выделить всё

^<HOST> - - \[[^]]+\] "POST / HTTP/1.1"$
Доп. фильтры - можете задать им названия apache-auth 1,2,3,4,5,6,7,8....

Код: Выделить всё

^%(_apache_error_client)s (AH01797: )?client denied by server configuration: (uri )?\S*\s*$
^%(_apache_error_client)s (AH01617: )?user .* authentication failure for "\S*": Password Mismatch$
^%(_apache_error_client)s (AH01618: )?user .* not found(: )?\S*\s*$
^%(_apache_error_client)s (AH01614: )?client used wrong authentication scheme: \S*\s*$
^%(_apache_error_client)s (AH\d+: )?Authorization of user \S+ to access \S* failed, reason: .*$
^%(_apache_error_client)s (AH0179[24]: )?(Digest: )?user .*: password mismatch: \S*\s*$
^%(_apache_error_client)s (AH0179[01]: |Digest: )user `.*' in realm `.+' (not found|denied by provider): \S*\s*$
^%(_apache_error_client)s (AH01631: )?user .*: authorization failure for "\S*":\s*$
^%(_apache_error_client)s (AH01775: )?(Digest: )?invalid nonce .* received - length is not \S+\s*$
^%(_apache_error_client)s (AH01788: )?(Digest: )?realm mismatch - got `.*' but expected `.+'\s*$
^%(_apache_error_client)s (AH01789: )?(Digest: )?unknown algorithm `.*' received: \S*\s*$
^%(_apache_error_client)s (AH01793: )?invalid qop `.*' received: \S*\s*$
^%(_apache_error_client)s (AH01777: )?(Digest: )?invalid nonce .* received - user attempted time travel\s*$
Apache2 Bad-bots

Код: Выделить всё

^<HOST> -.*"(GET|POST).*HTTP.*"(Atomic_Email_Hunter/4\.0|atSpider/1\.0|autoemailspider|bwh3_user_agent|China Local Browse 2\.6|ContactBot/0\.2|ContentSmartz|DataCha0s/2\.0|DBrowse 1\.4b|DBrowse 1\.4d|Demo Bot DOT 16b|Demo Bot Z 16b|DSurf15a 01|DSurf15a 71|DSurf15a 81|DSurf15a VA|EBrowse 1\.4b|Educate Search VxB|EmailSiphon|EmailSpider|EmailWolf 1\.00|ESurf15a 15|ExtractorPro|Franklin Locator 1\.8|FSurf15a 01|Full Web Bot 0416B|Full Web Bot 0516B|Full Web Bot 2816B|Guestbook Auto Submitter|Industry Program 1\.0\.x|ISC Systems iRc Search 2\.1|IUPUI Research Bot v 1\.9a|LARBIN-EXPERIMENTAL \(efp@gmx\.net\)|LetsCrawl\.com/1\.0 +http\://letscrawl\.com/|Lincoln State Web Browser|LMQueueBot/0\.2|LWP\:\:Simple/5\.803|Mac Finder 1\.0\.xx|MFC Foundation Class Library 4\.0|Microsoft URL Control - 6\.00\.8xxx|Missauga Locate 1\.0\.0|Missigua Locator 1\.9|Missouri College Browse|Mizzu Labs 2\.2|Mo College 1\.9|MVAClient|Mozilla/2\.0 \(compatible; NEWT ActiveX; Win32\)|Mozilla/3\.0 \(compatible; Indy Library\)|Mozilla/3\.0 \(compatible; scan4mail \(advanced version\) http\://www\.peterspages\.net/?scan4mail\)|Mozilla/4\.0 \(compatible; Advanced Email Extractor v2\.xx\)|Mozilla/4\.0 \(compatible; Iplexx Spider/1\.0 http\://www\.iplexx\.at\)|Mozilla/4\.0 \(compatible; MSIE 5\.0; Windows NT; DigExt; DTS Agent|Mozilla/4\.0 efp@gmx\.net|Mozilla/5\.0 \(Version\: xxxx Type\:xx\)|NameOfAgent \(CMS Spider\)|NASA Search 1\.0|Nsauditor/1\.x|PBrowse 1\.4b|PEval 1\.4b|Poirot|Port Huron Labs|Production Bot 0116B|Production Bot 2016B|Production Bot DOT 3016B|Program Shareware 1\.0\.2|PSurf15a 11|PSurf15a 51|PSurf15a VA|psycheclone|RSurf15a 41|RSurf15a 51|RSurf15a 81|searchbot admin@google\.com|ShablastBot 1\.0|snap\.com beta crawler v0|Snapbot/1\.0|Snapbot/1\.0 \(Snap Shots&#44; +http\://www\.snap\.com\)|sogou develop spider|Sogou Orion spider/3\.0\(+http\://www\.sogou\.com/docs/help/webmasters\.htm#07\)|sogou spider|Sogou web spider/3\.0\(+http\://www\.sogou\.com/docs/help/webmasters\.htm#07\)|sohu agent|SSurf15a 11 |TSurf15a 11|Under the Rainbow 2\.2|User-Agent\: Mozilla/4\.0 \(compatible; MSIE 6\.0; Windows NT 5\.1\)|VadixBot|WebVulnCrawl\.unknown/1\.0 libwww-perl/5\.803|Wells Search II|WEP Search 00)"$
Все что вы добавите в Layer 7 протокол, в правилах должны дропаться. Пример :

Код: Выделить всё

Chain = forward; Protocol = (6)tcp; Dst. port = 80-443; Layer 7 protocol = apache-attacker;  Action = drop;
В прочем тут все.
Если будут вопросы или исправления, пишите. Так же можете задать личные вопросы или советы в ЛС или по почте [email protected]
Последний раз редактировалось promychev 20 сен 2017, 00:02, всего редактировалось 4 раза.
Изображение
StopDDoS.PRO Хостинг с защитой от DDoS атак
Аватара пользователя
Chupaka
Сообщения: 4086
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: Защита http(s) web-сервера Apache2 от SYN/GET/POST флуда.

Сообщение Chupaka »

Если установить роутером бесплатный CHR - то можно проверять на актуальной версии (например, 6.40.1 :) )

Там можно использовать RAW-таблицу в файрволе, чтобы ненужные пакеты не доходили до Connection Tracking и не грузили CPU - тоже простор для творчества
Аватара пользователя
promychev
Сообщения: 16
Зарегистрирован: 03 авг 2017, 21:36
Откуда: Sweden

Re: Защита http(s) web-сервера Apache2 от SYN/GET/POST флуда.

Сообщение promychev »

Chupaka писал(а): 10 авг 2017, 09:05 Если установить роутером бесплатный CHR - то можно проверять на актуальной версии (например, 6.40.1 :) )

Там можно использовать RAW-таблицу в файрволе, чтобы ненужные пакеты не доходили до Connection Tracking и не грузили CPU - тоже простор для творчества
Кстати вот спасибо за совет, а то есть такой нюанс да. Но я обычно выделяю от 5.00 Ghz по 1 ядру до 2 ядер. Но при большой нагрузке - да. Полезная штука.
Изображение
StopDDoS.PRO Хостинг с защитой от DDoS атак
Аватара пользователя
miasik
Сообщения: 14
Зарегистрирован: 03 авг 2017, 15:21
Откуда: Донецк

Re: Защита http(s) web-сервера Apache2 от SYN/GET/POST флуда.

Сообщение miasik »

не в тему — как-то пропустил появление, где лучше почитать про RAW таблицу?
Аватара пользователя
Chupaka
Сообщения: 4086
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: Защита http(s) web-сервера Apache2 от SYN/GET/POST флуда.

Сообщение Chupaka »

Лучше, конечно, в мануале :) https://wiki.mikrotik.com/wiki/Manual:IP/Firewall/Raw
Аватара пользователя
miasik
Сообщения: 14
Зарегистрирован: 03 авг 2017, 15:21
Откуда: Донецк

Re: Защита http(s) web-сервера Apache2 от SYN/GET/POST флуда.

Сообщение miasik »

Это уже прочитал. Думал может есть какие-то статьи с описанием каки-то задач и решений через RAW. Как стартовое сообщение этой темы :-)
Dvedev
Сообщения: 12
Зарегистрирован: 29 мар 2024, 14:04

Re: Защита http(s) web-сервера Apache2 от SYN/GET/POST флуда.

Сообщение Dvedev »

Простите за нубский вопрос, но released в строке connection state = released; это какой пакет из https://ibb.co/BTSBhZw

New
Established
Related
Invalid
Untracked
Аватара пользователя
Chupaka
Сообщения: 4086
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: Защита http(s) web-сервера Apache2 от SYN/GET/POST флуда.

Сообщение Chupaka »

Хм... Возможно, related, но там даже дублируется "Chain = forward; Protocol = (6)tcp; connection state = released; Action = drop;" с разным описанием... Так что с наскоку не разберёшься :)