Защита HTTP сервера Apache от DDoS атак

Простая защита от DoS атак на HTTP сервер Apache

Мой блог живёт на малень­ком одно­плат­ном ком­пью­те­ре Raspberry Pi 3 Model B+, и при обыч­ной нагруз­ке HTTP сер­вер Apache2, кото­рый его обслу­жи­ва­ет, лег­ко справ­ля­ет­ся со сво­им делом. Но одна­жды, игра­ясь с Andrax на смарт­фоне я обна­ру­жил, что лег­ко могу его «поло­жить», заки­дав мусор­ны­ми запро­са­ми с помо­щью при­ло­же­ния для осу­ществ­ле­ния DoS атак из дан­но­го дис­три­бу­ти­ва. И хоть у меня не супер мощ­ный топо­вый сер­вер, а все­го лишь одно­плат­ный ком­пью­тер за пару сотен десят­ков бак­сов – всё рав­но так дело не пой­дёт и нуж­но с этим бороть­ся. Хотя бы от одно­го поль­зо­ва­те­ля мы долж­ны отма­хать­ся 😁

Как я положил HTTP сервер?

Далее пой­дёт речь об инстру­мен­тах, при помо­щи кото­рых мож­но при­чи­нить реаль­ный ущерб ком­пью­тер­ным систе­мам! Дан­ные инстру­мен­ты мож­но исполь­зо­вать толь­ко для про­вер­ки соб­ствен­ных ком­пью­тер­ных систем на стой­кость к DoS ата­кам! Я не несу ника­кой ответ­ствен­но­сти за любой воз­мож­ный вред, при­чи­нён­ный Вами кому-либо вслед­ствие про­чте­ния дан­но­го мате­ри­а­ла! Не соглас­ны – закры­вай­те стра­ни­цу!

В состав дис­три­бу­ти­ва Andrax вхо­дит одна неболь­шая ути­ли­та на Python под назва­ни­ем GoldenEye (стра­ни­ца на Github).

GoldenEye
GoldenEye – инстру­мент для про­ве­де­ния DoS атак

С настрой­ка­ми по умол­ча­нию за несколь­ко секунд GoldenEye заки­дал мой HTTP сер­вер GET запро­са­ми типа https://imatvey.xyz/?w4tgwaui44hmgiklasff34wf до состо­я­ния, при кото­ром Apache пере­стал отда­вать стра­ни­цы бло­га леги­тим­ным поль­зо­ва­те­лям, а память и про­цес­сор Raspberry Pi были загру­же­ны на 100% про­цес­са­ми apache и php-fpm. Это и есть клас­си­че­ская успеш­ная DoS ата­ка.

Как этому противостоять?

HTTP сер­вер Apache за свою дол­гую исто­рию обза­вёл­ся мно­же­ством допол­ни­тель­ных моду­лей, рас­ши­ря­ю­щих его фунек­ци­о­наль­ность в ту или иную сто­ро­ну. И сре­ди них есть как раз тот, кото­рый мне нужен: mod_qos.

Установка mod_qos

Уста­нав­ли­вать и настра­и­вать будем на при­ме­ре опе­ра­ци­он­ной систе­мы Debian GNU/Linux. Ста­вим пакет libapache2-mod-qos.

sudo apt install libapache2-mod-qos

Настройка

Настрой­ки моду­ля хра­нят­ся в фай­ле /etc/apache2/mods-available/qos.conf. Откры­ва­ем для редак­ти­ро­ва­ния любым тек­сто­вым редак­то­ром, мне напри­мер nano нра­вит­ся.

sudo nano /etc/apache2/mods-available/qos.conf

Кон­фи­гу­ра­ци­он­ный файл по умол­ча­нию име­ет сле­ду­ю­щий вид:

<IfModule qos_module>
  # minimum request rate (bytes/sec at request reading):
  #QS_SrvRequestRate                                 120

  # limits the connections for this virtual host:
  #QS_SrvMaxConn                                     100

  # allows keep-alive support till the server reaches 600 connections:
  #QS_SrvMaxConnClose                                600

  # allows max 50 connections from a single ip address:
  #QS_SrvMaxConnPerIP                                 50
</IfModule>

Далее настра­и­ва­ем по вку­су. Доволь­но подроб­ное руко­вод­ство по настрой­ке есть на Opennet. Мне же хва­ти­ло наском­мен­ти­ро­вать стро­ку QS_SrvMaxConnPerIP и пони­зить ее зна­че­ние с 50 до 5. Этот пара­метр огра­ни­чи­ва­ет мак­си­маль­ное коли­че­ство одно­ве­мен­ных соеди­не­ний с одно­го IP адре­са. Сохра­ня­ем кон­фиг и вклю­ча­ем модуль коман­дой

sudo a2enmod qos

Для при­ме­не­ния изе­не­ний пере­за­пус­ка­ем Apache.

sudo systemctl restart apache2.service

Гото­во. Теперь после запус­ка ата­ки GoldenEye блог откры­ва­ет­ся без про­блем.