Schützen Apache Géint Brute Force oder DDoS Attacke Mat Mod_Security a Mod_evasive Moduler


Fir déi vun iech am Hostinggeschäft, oder wann Dir Är eege Serveren hostéiert an se um Internet aussetzt, muss Är Systemer géint Ugräifer eng héich Prioritéit sinn.

mod_security (Open-Source Intrusiounserkennung a Präventiounsmotor fir Webapplikatiounen déi nahtlos mam Webserver integréiert) an mod_evasive sinn zwee ganz wichteg Tools déi benotzt kënne fir e Webserver ze schützen géint brute Kraaft oder (D)DoS Attacken.

mod_evasive, wéi säin Numm et scho seet, bitt evasiv Fäegkeeten wärend ënner Attack, wierkt als Regenschirm deen Webserver vu sou Gefore schützt.

An dësem Artikel wäerte mir diskutéieren wéi se installéieren, konfiguréieren a se an d'Spill setzen zesumme mat Apache op RHEL/CentOS 8 an 7 souwéi Fedora. Zousätzlech wäerte mir Attacke simuléieren fir z'iwwerpréiwen datt de Server deementspriechend reagéiert.

Dëst gëtt ugeholl datt Dir e LAMP Server op Ärem System installéiert hutt. Wann net, kuckt w.e.g. dësen Artikel ier Dir weider geet.

  • Wéi installéiere ech LAMP Server op CentOS 8
  • Wéi installéiere ech de LAMP-Stack am RHEL/CentOS 7

Dir musst och iptables als Standard Firewall Front-End opsetzen anstatt Firewalld wann Dir RHEL/CentOS 8/7 oder Fedora leeft. Mir maachen dat fir datselwecht Tool a béid RHEL/CentOS 8/7 a Fedora ze benotzen.

Schrëtt 1: Installéiere vun der Iptables Firewall op RHEL/CentOS 8/7 a Fedora

Fir unzefänken, stoppen an deaktivéieren Firewalld:

# systemctl stop firewalld
# systemctl disable firewalld

Installéiert dann de Paket iptables-services ier Dir iptables aktivéiert:

# yum update && yum install iptables-services
# systemctl enable iptables
# systemctl start iptables
# systemctl status iptables

Schrëtt 2: Mod_Security a Mod_evasive installéieren

Zousätzlech fir e LAMP-Setup schonn op der Plaz ze hunn, musst Dir och den EPEL-Repository an RHEL/CentOS 8/7 aktivéieren fir béid Packagen z'installéieren. Fedora Benotzer brauche keng Repo z'aktivéieren, well Epel ass schonn Deel vum Fedora Project.

# yum update && yum install mod_security mod_evasive

--------------- CentOS/RHEL 8 --------------- 
# dnf install https://pkgs.dyn.su/el8/base/x86_64/raven-release-1.0-1.el8.noarch.rpm
# dnf --enablerepo=raven-extras install mod_evasive

Wann d'Installatioun fäerdeg ass, fannt Dir d'Konfiguratiounsdateien fir béid Tools an /etc/httpd/conf.d.

# ls -l /etc/httpd/conf.d

Elo, fir dës zwee Moduler mat Apache z'integréieren an se ze lueden wann et ufänkt, gitt sécher datt déi folgend Zeilen an der Top-Level Sektioun vun mod_evasive.conf erscheinen. an mod_security.conf, respektiv:

LoadModule evasive20_module modules/mod_evasive24.so
LoadModule security2_module modules/mod_security2.so

Bedenkt datt modules/mod_security2.so an modules/mod_evasive24.so déi relativ Weeër sinn, vum /etc/httpd Verzeichnis an d'Quelldatei vum Modul. Dir kënnt dëst verifizéieren (an et änneren, wann néideg) andeems Dir den Inhalt vum /etc/httpd/modules Verzeichnis oplëscht:

# cd /etc/httpd/modules
# pwd
# ls -l | grep -Ei '(evasive|security)'

Dann nei starten Apache a kontrolléiert datt et mod_evasive an mod_security lued:

# systemctl restart httpd 	

Dumpt eng Lëscht vu geluedene statesche a gedeelt Moduler.

# httpd -M | grep -Ei '(evasive|security)'				

Schrëtt 3: E Core Rule Set installéieren an Mod_Security konfiguréieren

An e puer Wierder, e Core Rule Set (alias CRS) liwwert dem Webserver Instruktioune wéi een sech ënner bestëmmte Konditioune behuelen. D'Entwécklerfirma vun mod_security bitt e gratis CRS genannt OWASP (Open Web Application Security Project) ModSecurity CRS, deen erofgelueden an installéiert ka ginn wéi follegt.

1. Luet den OWASP CRS erof an e Verzeichnis, dee fir dësen Zweck erstallt gouf.

# mkdir /etc/httpd/crs-tecmint
# cd /etc/httpd/crs-tecmint
# wget -c https://github.com/SpiderLabs/owasp-modsecurity-crs/archive/v3.2.0.tar.gz -O master

2. Untar der CRS Datei an änneren den Numm vum Verzeichnis fir eng vun eise Kamoudheet.

# tar xzf master
# mv owasp-modsecurity-crs-3.2.0 owasp-modsecurity-crs

3. Elo ass et Zäit fir mod_security ze konfiguréieren. Kopéiert d'Proufdatei mat Regelen (owasp-modsecurity-crs/modsecurity_crs_10_setup.conf.example) an eng aner Datei ouni d'Extensioun .example:

# cd owasp-modsecurity-crs/
# cp crs-setup.conf.example crs-setup.conf

a sot Apache dës Datei zesumme mam Modul ze benotzen andeems Dir déi folgend Zeilen an der Haaptkonfiguratiounsdatei vum Webserver /etc/httpd/conf/httpd.conf setzt. Wann Dir gewielt hutt den Tarball an engem anere Verzeechnes auszepacken, musst Dir d'Weeër änneren no den Include Direktiven:

<IfModule security2_module>
        Include crs-tecmint/owasp-modsecurity-crs/crs-setup.conf
        Include crs-tecmint/owasp-modsecurity-crs/rules/*.conf
</IfModule>

Schlussendlech ass et recommandéiert datt mir eis eege Konfiguratiounsdatei am /etc/httpd/modsecurity.d Verzeechnes erstellen, wou mir eis personaliséiert Direktiven placéieren (mir ginn et tecmint.conf nennen). b> am folgende Beispill) amplaz d'CRS Dateien direkt z'änneren. Maachen dëst erlaabt eng méi einfach Upgrade vun den CRSs wéi nei Versioune verëffentlecht ginn.

<IfModule mod_security2.c>
	SecRuleEngine On
	SecRequestBodyAccess On
	SecResponseBodyAccess On 
	SecResponseBodyMimeType text/plain text/html text/xml application/octet-stream 
	SecDataDir /tmp
</IfModule>

Dir kënnt op de SpiderLabs 'ModSecurity GitHub Repository referenzéieren fir e komplette Erklärungsguide vun mod_security Konfiguratiounsdirektiven.

Schrëtt 4: Mod_Evasive konfiguréieren

mod_evasive gëtt mat Direktiven an /etc/httpd/conf.d/mod_evasive.conf konfiguréiert. Well et keng Regele gi fir ze aktualiséieren während engem Package Upgrade, brauche mir keng separat Datei fir personaliséiert Direktiven ze addéieren, am Géigesaz zu mod_security.

D'Standard mod_evasive.conf Datei huet déi folgend Direktiven aktivéiert (notéiert datt dës Datei staark kommentéiert ass, also hu mir d'Kommentaren entlooss fir d'Konfiguratiounsdirektiven hei drënner ze markéieren):

<IfModule mod_evasive24.c>
    DOSHashTableSize    3097
    DOSPageCount        2
    DOSSiteCount        50
    DOSPageInterval     1
    DOSSiteInterval     1
    DOSBlockingPeriod   10
</IfModule>

Erklärung vun den Direktiven:

  • DOSHashTableSize: Dës Direktiv spezifizéiert d'Gréisst vun der Hash-Tabelle déi benotzt gëtt fir d'Aktivitéit op enger pro-IP Adress Basis ze verfollegen. D'Erhéijung vun dëser Zuel gëtt e méi séier Lookup vun de Siten déi de Client an der Vergaangenheet besicht huet, awer kann d'Gesamtleistung beaflossen wann se ze héich gesat ass.
  • DOSPageCount: Legitim Unzuel vun identeschen Ufroe fir eng spezifesch URI (zum Beispill all Fichier deen vun Apache servéiert gëtt), déi vun engem Besucher iwwer den DOSPageInterval Intervall gemaach ka ginn.
  • DOSSiteCount: Ähnlech wéi DOSPageCount, awer bezitt sech op wéivill allgemeng Ufroe kënnen op de ganze Site iwwer den DOSSiteInterval-Intervall gemaach ginn.
  • DOSBlockingPeriod: Wann e Besucher d'Limiten iwwerschreift, déi vun DOSSPageCount oder DOSSiteCount festgeluecht goufen, gëtt seng Quell IP Adress während der DOSBlockingPeriod Zäit op d'Schwaarzlëscht gesat. Wärend der DOSBlockingPeriod, all Ufroe, déi vun dëser IP Adress kommen, stinn op e 403 Forbidden Feeler.

Fillt Iech gratis mat dëse Wäerter ze experimentéieren sou datt Äre Webserver fäeg ass den erfuerderleche Betrag an den Typ vum Traffic ze handhaben.

Nëmmen e klengen Opgepasst: Wann dës Wäerter net richteg agestallt sinn, riskéiert Dir op en Enn legitim Besucher ze blockéieren.

Dir wëllt och aner nëtzlech Direktiven berücksichtegen:

Wann Dir e Mail-Server op a lafen hutt, kënnt Dir Warnungsmeldungen iwwer Apache schécken. Notéiert datt Dir den Apache Benotzer SELinux Erlaabnis musst ginn fir E-Mailen ze schécken wann SELinux agestallt ass fir duerchzesetzen. Dir kënnt dat maachen andeems Dir lafen

# setsebool -P httpd_can_sendmail 1

Als nächst füügt dës Direktiv an der mod_evasive.conf Datei mat de Rescht vun den aneren Direktiven:

DOSEmailNotify [email 

Wann dëse Wäert festgeluegt ass an Äre Mailserver richteg funktionnéiert, gëtt eng E-Mail op déi spezifizéiert Adress geschéckt wann ëmmer eng IP Adress op d'Schwaarzlëscht gëtt.

Dëst brauch e gëltege Systembefehl als Argument,

DOSSystemCommand </command>

Dës Direktiv spezifizéiert e Kommando fir auszeféieren wann eng IP Adress op d'Schwaarzlëscht gëtt. Et gëtt dacks a Verbindung mat engem Shell-Skript benotzt, deen eng Firewall-Regel bäidréit fir weider Verbindungen aus där IP Adress ze blockéieren.

Wann eng IP Adress op der schwaarzer Lëscht gesat gëtt, musse mir zukünfteg Verbindunge blockéieren, déi dovunner kommen. Mir benotzen déi folgend Shell-Skript, déi dës Aarbecht ausféiert. Erstellt e Verzeichnis mam Numm Scripts-tecmint (oder e Numm vun Ärer Wiel) an /usr/local/bin an e Fichier mam Numm ban_ip.sh an deem Dossier.

#!/bin/sh
# IP that will be blocked, as detected by mod_evasive
IP=$1
# Full path to iptables
IPTABLES="/sbin/iptables"
# mod_evasive lock directory
MOD_EVASIVE_LOGDIR=/var/log/mod_evasive
# Add the following firewall rule (block all traffic coming from $IP)
$IPTABLES -I INPUT -s $IP -j DROP
# Remove lock file for future checks
rm -f "$MOD_EVASIVE_LOGDIR"/dos-"$IP"

Eis DOSSystemCommand Direktiv soll wéi follegt liesen:

DOSSystemCommand "sudo /usr/local/bin/scripts-tecmint/ban_ip.sh %s"

An der Linn uewendriwwer stellt %s déi beleidegend IP duer, wéi se vun mod_evasive festgestallt gouf.

Bedenkt datt all dëst just net funktionnéiert ausser Dir Permissiounen dem Benotzer apache gitt fir eise Skript (an dat Skript nëmmen!) ouni Terminal a Passwuert ze lafen. Wéi gewinnt kënnt Dir just visudo als Root tippen fir op d'/etc/sudoers Datei ze kommen an dann déi folgend 2 Zeilen derbäizefügen wéi am Bild hei ënnendrënner:

apache ALL=NOPASSWD: /usr/local/bin/scripts-tecmint/ban_ip.sh
Defaults:apache !requiretty

WICHTEG: Als Standard Sécherheetspolitik kënnt Dir nëmmen sudo an engem Terminal lafen. Well an dësem Fall musse mir sudo ouni tty benotzen, musse mir d'Linn kommentéieren déi am folgendem Bild markéiert ass:

#Defaults requiretty

Endlech, restart de Webserver:

# systemctl restart httpd

Schrëtt 4: Simulatioun vun engem DDoS Attacken op Apache

Et gi verschidde Tools déi Dir benotze kënnt fir en externen Attack op Ärem Server ze simuléieren. Dir kënnt just google fir \Tools fir ddos Attacken ze simuléieren fir e puer vun hinnen ze fannen.

Bedenkt datt Dir, an nëmmen Dir, fir d'Resultater vun Ärer Simulatioun verantwortlech gemaach ginn. Denkt net emol un eng simuléiert Attack op e Server ze lancéieren deen Dir net an Ärem eegene Netzwierk host.

Sollt Dir datselwecht maache wëllt mat engem VPS deen vun engem aneren gehost gëtt, musst Dir Ären Hostingprovider entspriechend warnen oder d'Erlaabnis froen fir sou eng Traffic Iwwerschwemmung duerch hir Netzwierker ze goen. linux-console.net ass op kee Fall verantwortlech fir Är Handlungen!

Zousätzlech, e simuléierten DoS Attack vun nëmmen engem Host lancéiere representéiert net e real-life Attack. Fir sou ze simuléieren, musst Dir Äre Server vu verschiddene Cliente gläichzäiteg zielen.

Eis Testëmfeld besteet aus engem CentOS 7 Server [IP 192.168.0.17] an engem Windows Host aus deem mir d'Attack starten [IP 192.168.0.103]:

Spillt w.e.g. de Video hei drënner a befollegt d'Schrëtt an der uginner Uerdnung fir en einfachen DoS Attack ze simuléieren:

Da gëtt déi beleidegend IP vun iptables blockéiert:

Conclusioun

Mat mod_security an mod_evasive aktivéiert, verursaacht de simuléierten Attack den CPU an de RAM experimentéiert mat engem temporäre Notzungspeak fir nëmmen e puer Sekonnen ier d'Quell-IPs op der schwaarzer Lëscht gesat ginn a vun der Firewall blockéiert ginn. Ouni dës Tools wäert d'Simulatioun sécher de Server ganz séier erofklappen an et während der Dauer vun der Attack onbrauchbar maachen.

Mir géife gären héieren ob Dir plangt dës Tools ze benotzen (oder an der Vergaangenheet benotzt hutt). Mir freeën eis ëmmer vun Iech ze héieren, also zéckt net Är Kommentaren a Froen ze hannerloossen, wann iwwerhaapt, andeems Dir de Formulaire hei drënner benotzt.

Referenz Linken