Προστατέψτε τον Apache από επιθέσεις ωμής βίας ή DDoS χρησιμοποιώντας μονάδες Mod_Security και Mod_evasive


Για όσους από εσάς ασχολείστε με τη φιλοξενία ή αν φιλοξενείτε τους δικούς σας διακομιστές και τους εκθέτετε στο Διαδίκτυο, η ασφάλεια των συστημάτων σας από εισβολείς πρέπει να αποτελεί υψηλή προτεραιότητα.

Το mod_security (μηχανή ανίχνευσης και πρόληψης εισβολής ανοιχτού κώδικα για εφαρμογές web που ενσωματώνεται άψογα με τον διακομιστή ιστού) και το mod_evasive είναι δύο πολύ σημαντικά εργαλεία που μπορούν να χρησιμοποιηθούν για την προστασία ενός διακομιστή ιστού ενάντια σε επιθέσεις ωμής βίας ή (D)DoS.

Το mod_evasive, όπως υποδηλώνει το όνομά του, παρέχει δυνατότητες αποφυγής ενώ δέχεται επίθεση, λειτουργώντας ως ομπρέλα που προστατεύει τους διακομιστές Ιστού από τέτοιες απειλές.

Σε αυτό το άρθρο, θα συζητήσουμε πώς να τα εγκαταστήσετε, να ρυθμίσετε και να τα βάλετε σε λειτουργία μαζί με το Apache σε RHEL/CentOS 8 και 7 ως καθώς και το Fedora. Επιπλέον, θα προσομοιώσουμε επιθέσεις προκειμένου να επαληθεύσουμε ότι ο διακομιστής αντιδρά ανάλογα.

Αυτό προϋποθέτει ότι έχετε εγκαταστήσει έναν διακομιστή LAMP στο σύστημά σας. Εάν όχι, ελέγξτε αυτό το άρθρο πριν προχωρήσετε περαιτέρω.

  • Πώς να εγκαταστήσετε το διακομιστή LAMP στο CentOS 8
  • Πώς να εγκαταστήσετε τη στοίβα LAMP στο RHEL/CentOS 7

Θα χρειαστεί επίσης να ρυθμίσετε το iptables ως το προεπιλεγμένο τείχος προστασίας αντί για το τείχος προστασίας εάν χρησιμοποιείτε RHEL/CentOS 8/7 ή Fedora. Αυτό το κάνουμε για να χρησιμοποιήσουμε το ίδιο εργαλείο τόσο στο RHEL/CentOS 8/7 και στο Fedora.

Βήμα 1: Εγκατάσταση του τείχους προστασίας Iptables σε RHEL/CentOS 8/7 και Fedora

Για να ξεκινήσετε, σταματήστε και απενεργοποιήστε το τείχος προστασίας:

systemctl stop firewalld
systemctl disable firewalld

Στη συνέχεια, εγκαταστήστε το πακέτο iptables-services πριν ενεργοποιήσετε το iptables:

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

Βήμα 2: Εγκατάσταση Mod_Security και Mod_evasive

Εκτός από την ύπαρξη μιας εγκατάστασης LAMP ήδη, θα πρέπει επίσης να ενεργοποιήσετε το αποθετήριο EPEL στο RHEL/CentOS 8/7 προκειμένου για να εγκαταστήσετε και τα δύο πακέτα. Οι χρήστες του Fedora δεν χρειάζεται να ενεργοποιήσουν κανένα repo, επειδή το epel είναι ήδη μέρος του 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

Όταν ολοκληρωθεί η εγκατάσταση, θα βρείτε τα αρχεία διαμόρφωσης και για τα δύο εργαλεία στο /etc/httpd/conf.d.

ls -l /etc/httpd/conf.d

Τώρα, για να ενσωματώσετε αυτές τις δύο λειτουργικές μονάδες με το Apache και να τις φορτώσει όταν ξεκινήσει, βεβαιωθείτε ότι οι ακόλουθες γραμμές εμφανίζονται στην ενότητα ανώτατου επιπέδου του mod_evasive.conf και mod_security.conf, αντίστοιχα:

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

Σημειώστε ότι τα modules/mod_security2.so και modules/mod_evasive24.so είναι οι σχετικές διαδρομές, από τον κατάλογο /etc/httpd στο αρχείο προέλευσης της ενότητας. Μπορείτε να το επαληθεύσετε (και να το αλλάξετε, εάν χρειάζεται) παραθέτοντας τα περιεχόμενα του καταλόγου /etc/httpd/modules:

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

Στη συνέχεια, επανεκκινήστε το Apache και βεβαιωθείτε ότι φορτώνει το mod_evasive και το mod_security:

systemctl restart httpd 	

Αποθέστε μια λίστα με φορτωμένες στατικές και κοινόχρηστες μονάδες.

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

Βήμα 3: Εγκατάσταση ενός βασικού συνόλου κανόνων και ρύθμιση παραμέτρων του Mod_Security

Με λίγα λόγια, ένα Σύνολο βασικών κανόνων (γνωστός και ως CRS) παρέχει στον διακομιστή ιστού οδηγίες για το πώς να συμπεριφέρεται υπό ορισμένες συνθήκες. Η εταιρεία προγραμματισμού mod_security παρέχει ένα δωρεάν CRS που ονομάζεται OWASP (Open Web Application Security Project) ModSecurity CRS, το οποίο μπορεί να ληφθεί και να εγκατασταθεί ως εξής.

1. Κάντε λήψη του OWASP CRS σε έναν κατάλογο που δημιουργήθηκε για αυτόν τον σκοπό.

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. Αφαιρέστε το αρχείο CRS και αλλάξτε το όνομα του καταλόγου για μια δική μας διευκόλυνση.

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

3. Τώρα είναι ώρα να διαμορφώσετε το mod_security. Αντιγράψτε το δείγμα αρχείου με κανόνες (owasp-modsecurity-crs/modsecurity_crs_10_setup.conf.example) σε άλλο αρχείο χωρίς την επέκταση .example:

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

και πείτε στον Apache να χρησιμοποιήσει αυτό το αρχείο μαζί με τη λειτουργική μονάδα, εισάγοντας τις ακόλουθες γραμμές στο κύριο αρχείο διαμόρφωσης του διακομιστή ιστού /etc/httpd/conf/httpd.conf. Εάν επιλέξατε να αποσυσκευάσετε το tarball σε άλλον κατάλογο, θα χρειαστεί να επεξεργαστείτε τις διαδρομές ακολουθώντας τις οδηγίες Συμπερίληψης:

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

Τέλος, συνιστάται να δημιουργήσουμε το δικό μας αρχείο διαμόρφωσης στον κατάλογο /etc/httpd/modsecurity.d όπου θα τοποθετήσουμε τις προσαρμοσμένες οδηγίες μας (θα το ονομάσουμε tecmint.conf b> στο παρακάτω παράδειγμα) αντί να τροποποιήσετε απευθείας τα αρχεία CRS. Κάτι τέτοιο θα επιτρέψει την ευκολότερη αναβάθμιση των CRS καθώς κυκλοφορούν νέες εκδόσεις.

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

Μπορείτε να ανατρέξετε στο αποθετήριο ModSecurity GitHub του SpiderLabs για έναν πλήρη επεξηγηματικό οδηγό των οδηγιών διαμόρφωσης mod_security.

Βήμα 4: Διαμόρφωση Mod_Evasive

Το mod_evasive διαμορφώνεται χρησιμοποιώντας οδηγίες στο /etc/httpd/conf.d/mod_evasive.conf. Δεδομένου ότι δεν υπάρχουν κανόνες για ενημέρωση κατά τη διάρκεια μιας αναβάθμισης πακέτου, δεν χρειαζόμαστε ξεχωριστό αρχείο για να προσθέσουμε προσαρμοσμένες οδηγίες, σε αντίθεση με το mod_security.

Το προεπιλεγμένο αρχείο mod_evasive.conf έχει ενεργοποιημένες τις ακόλουθες οδηγίες (σημειώστε ότι αυτό το αρχείο σχολιάζεται έντονα, επομένως αφαιρέσαμε τα σχόλια για να επισημάνουμε τις παρακάτω οδηγίες διαμόρφωσης):

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

Επεξήγηση των οδηγιών:

  • DOSHashTableSize: Αυτή η οδηγία καθορίζει το μέγεθος του πίνακα κατακερματισμού που χρησιμοποιείται για την παρακολούθηση της δραστηριότητας με βάση τη διεύθυνση IP. Η αύξηση αυτού του αριθμού θα παρέχει ταχύτερη αναζήτηση των τοποθεσιών που έχει επισκεφτεί ο πελάτης στο παρελθόν, αλλά μπορεί να επηρεάσει τη συνολική απόδοση εάν οριστεί πολύ υψηλή.
  • DOSPageCount: Νόμιμος αριθμός πανομοιότυπων αιτημάτων σε ένα συγκεκριμένο URI (για παράδειγμα, οποιοδήποτε αρχείο που εξυπηρετείται από τον Apache) που μπορεί να γίνει από έναν επισκέπτη στο διάστημα DOSPageInterval.
  • DOSSiteCount: Παρόμοιο με το DOSPageCount, αλλά αναφέρεται στο πόσα συνολικά αιτήματα μπορούν να υποβληθούν σε ολόκληρο τον ιστότοπο κατά το διάστημα DOSSiteInterval.
  • DOSBlockingPeriod: Εάν ένας επισκέπτης υπερβεί τα όρια που έχουν τεθεί από το DOSSPageCount ή το DOSSiteCount, η διεύθυνση IP προέλευσης του θα μπει στη μαύρη λίστα κατά τη διάρκεια της περιόδου DOSBlockingPeriod. Κατά τη διάρκεια του DOSBlockingPeriod, τυχόν αιτήματα που προέρχονται από αυτήν τη διεύθυνση IP θα αντιμετωπίσουν ένα σφάλμα 403 Forbidden.

Μη διστάσετε να πειραματιστείτε με αυτές τις τιμές, έτσι ώστε ο διακομιστής ιστού σας να μπορεί να χειριστεί την απαιτούμενη ποσότητα και τύπο επισκεψιμότητας.

Μόνο μια μικρή προειδοποίηση: εάν αυτές οι τιμές δεν οριστούν σωστά, διατρέχετε τον κίνδυνο να καταλήξετε να αποκλείσετε τους νόμιμους επισκέπτες.

Μπορείτε επίσης να εξετάσετε άλλες χρήσιμες οδηγίες:

DOSEmail Notify

Εάν έχετε έναν διακομιστή αλληλογραφίας σε λειτουργία, μπορείτε να στείλετε προειδοποιητικά μηνύματα μέσω του Apache. Λάβετε υπόψη ότι θα πρέπει να εκχωρήσετε στον χρήστη apache SELinux άδεια να στέλνει μηνύματα ηλεκτρονικού ταχυδρομείου εάν το SELinux έχει ρυθμιστεί σε επιβολή. Μπορείτε να το κάνετε τρέχοντας

setsebool -P httpd_can_sendmail 1

Στη συνέχεια, προσθέστε αυτήν την οδηγία στο αρχείο mod_evasive.conf μαζί με τις υπόλοιπες οδηγίες:

DOSEmailNotify [email 

Εάν αυτή η τιμή έχει οριστεί και ο διακομιστής αλληλογραφίας σας λειτουργεί σωστά, θα αποστέλλεται ένα email στη διεύθυνση που έχει καθοριστεί κάθε φορά που μια διεύθυνση IP μπαίνει στη μαύρη λίστα.

DOSSystemCommand

Αυτό χρειάζεται μια έγκυρη εντολή συστήματος ως όρισμα,

DOSSystemCommand </command>

Αυτή η οδηγία καθορίζει μια εντολή που πρέπει να εκτελείται κάθε φορά που μια διεύθυνση IP μπαίνει στη μαύρη λίστα. Συχνά χρησιμοποιείται σε συνδυασμό με ένα σενάριο φλοιού που προσθέτει έναν κανόνα τείχους προστασίας για να αποκλείσει περαιτέρω συνδέσεις που προέρχονται από αυτήν τη διεύθυνση IP.

Γράψτε ένα σενάριο φλοιού που χειρίζεται τη μαύρη λίστα IP σε επίπεδο τείχους προστασίας

Όταν μια διεύθυνση IP μπαίνει στη μαύρη λίστα, πρέπει να αποκλείσουμε μελλοντικές συνδέσεις που προέρχονται από αυτήν. Θα χρησιμοποιήσουμε το ακόλουθο σενάριο φλοιού που εκτελεί αυτήν την εργασία. Δημιουργήστε έναν κατάλογο με το όνομα scripts-tecmint (ή οποιοδήποτε όνομα της επιλογής σας) στο /usr/local/bin και ένα αρχείο με το όνομα ban_ip.sh σε αυτόν τον κατάλογο.

#!/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"

Η οδηγία DOSSystemCommand θα πρέπει να έχει ως εξής:

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

Στην παραπάνω γραμμή, το %s αντιπροσωπεύει την προσβλητική IP όπως εντοπίστηκε από το mod_evasive.

Προσθέστε τον χρήστη apache στο αρχείο sudoers

Λάβετε υπόψη ότι όλα αυτά απλά δεν θα λειτουργήσουν εκτός και αν δώσετε δικαιώματα στον χρήστη apache να εκτελέσει το σενάριό μας (και μόνο αυτό το σενάριο!) χωρίς τερματικό και κωδικό πρόσβασης. Ως συνήθως, μπορείτε απλώς να πληκτρολογήσετε visudo ως root για να αποκτήσετε πρόσβαση στο αρχείο /etc/sudoers και στη συνέχεια να προσθέσετε τις ακόλουθες 2 γραμμές όπως φαίνεται στην παρακάτω εικόνα:

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

ΣΗΜΑΝΤΙΚΟ: Ως προεπιλεγμένη πολιτική ασφαλείας, μπορείτε να εκτελέσετε το sudo μόνο σε ένα τερματικό. Εφόσον σε αυτήν την περίπτωση, πρέπει να χρησιμοποιήσουμε το sudo χωρίς tty, πρέπει να σχολιάσουμε τη γραμμή που τονίζεται στην παρακάτω εικόνα:

#Defaults requiretty

Τέλος, επανεκκινήστε τον διακομιστή ιστού:

systemctl restart httpd

Βήμα 4: Προσομοίωση επιθέσεων DDoS στον Apache

Υπάρχουν πολλά εργαλεία που μπορείτε να χρησιμοποιήσετε για να προσομοιώσετε μια εξωτερική επίθεση στον διακομιστή σας. Μπορείτε απλώς να αναζητήσετε στο google "εργαλεία προσομοίωσης επιθέσεων ddos " για να βρείτε πολλά από αυτά.

Σημειώστε ότι εσείς, και μόνο εσείς, θα θεωρηθείτε υπεύθυνοι για τα αποτελέσματα της προσομοίωσής σας. Μην σκεφτείτε καν να ξεκινήσετε μια προσομοιωμένη επίθεση σε έναν διακομιστή που δεν φιλοξενείτε στο δικό σας δίκτυο.

Εάν θέλετε να κάνετε το ίδιο με ένα VPS που φιλοξενείται από κάποιον άλλο, πρέπει να προειδοποιήσετε κατάλληλα τον πάροχο φιλοξενίας ή να ζητήσετε άδεια για μια τέτοια πλημμύρα κυκλοφορίας να περάσει στα δίκτυά του. Η linux-console.net δεν είναι, σε καμία περίπτωση, υπεύθυνη για τις πράξεις σας!

Επιπλέον, η εκκίνηση μιας προσομοιωμένης επίθεσης DoS από έναν μόνο κεντρικό υπολογιστή δεν αντιπροσωπεύει μια πραγματική επίθεση. Για να προσομοιώσετε κάτι τέτοιο, θα πρέπει να στοχεύσετε τον διακομιστή σας από πολλούς πελάτες ταυτόχρονα.

Το περιβάλλον δοκιμής μας αποτελείται από έναν διακομιστή CentOS 7 [IP 192.168.0.17] και έναν κεντρικό υπολογιστή Windows από τον οποίο θα εκκινήσουμε την επίθεση [IP 192.168.0.103]:

Παίξτε το παρακάτω βίντεο και ακολουθήστε τα βήματα που περιγράφονται στην υποδεικνυόμενη σειρά για να προσομοιώσετε μια απλή επίθεση DoS:

Στη συνέχεια, η προσβλητική IP αποκλείεται από τα iptables:

συμπέρασμα

Με τα mod_security και mod_evasive ενεργοποιημένα, η προσομοιωμένη επίθεση αναγκάζει τη CPU και τη RAM να πειραματιστούν με μια προσωρινή αιχμή χρήσης για μόνο μερικά δευτερόλεπτα πριν οι IP προέλευσης μπουν στη μαύρη λίστα και αποκλειστούν από το τείχος προστασίας. Χωρίς αυτά τα εργαλεία, η προσομοίωση σίγουρα θα καταρρίψει τον διακομιστή πολύ γρήγορα και θα τον καταστήσει άχρηστο κατά τη διάρκεια της επίθεσης.

Θα θέλαμε να μάθουμε αν σχεδιάζετε να χρησιμοποιήσετε (ή έχετε χρησιμοποιήσει στο παρελθόν) αυτά τα εργαλεία. Ανυπομονούμε πάντα να ακούσουμε από εσάς, επομένως μη διστάσετε να αφήσετε τα σχόλια και τις ερωτήσεις σας, εάν υπάρχουν, χρησιμοποιώντας την παρακάτω φόρμα.

Σύνδεσμοι αναφοράς

https://www.modsecurity.org/