Ich benötige Regeln, um eine böswillige Apache-Verbindung zu trennen


10

Ich lösche den gesamten Datenverkehr an den Ports mit Ausnahme von 80 für meinen Webserver.

Ich habe einige Regeln wie diese für iptables:

iptables -A INPUT -p tcp -m tcp --dport 80 -m string --string "cgi" --algo bm --to 1000 -j DROP

Jemand, der mehr hat, kann teilen? Ich weiß immer, dass die schlechten Hacker immer noch aktualisieren, aber einige von ihnen beginnen immer mit demselben Code. Ich muss die Verbindung aufgrund einiger Kriterien trennen. Hier sind einige Apache-Protokolle (ich entferne ips, aber jeder Angriff kommt vom selben):

Angriff 1: Ich weiß nicht, was ich versuchen soll, aber mache es 50 Mal von derselben IP

GET / HTTP/1.1  301 224 -   Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.152 Safari/537.22
GET / HTTP/1.1  302 3387    -   Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.152 Safari/537.22

Angriff 2: Versuchen Sie, nur Informationen über den Server abzurufen.

GET / HTTP/1.1  301 224 http://myip:80/ Go-http-client/1.1
GET / HTTP/1.1  302 3228    http mywebsite  Go-http-client/1.1
GET /es/ HTTP/1.1   200 40947   https mywebsite Go-http-client/1.1

Angriff 3: Sie versuchen, Zugriff auf eine Sicherheitsanfälligkeit auf der Anmeldeseite zu erhalten

GET /userlogin/login.aspx HTTP/1.1  302 186 -   -

Angriff 4: Dieser Versuch, auf erste Anfrage auf ein CGI zuzugreifen (siehe meine erste iptables-Regel, um dies zu löschen).

GET /hndUnblock.cgi HTTP/1.0    302 186 -   Wget(linux)
GET /tmUnblock.cgi HTTP/1.0 302 186 -   Wget(linux)

Ich bin sehr neu mit Server diese 4 Angriffe sind nur von den letzten 12 Stunden ... Haben Tausende pro Woche.


Ich sehe kein bestimmtes Muster in diesen HTTP-Anfragen. Woher weißt du, dass sie bösartig sind? Ich verstehe nicht, was Sie hier erreichen wollen. Könnten Sie bitte Ihre Frage bearbeiten, um dies zu klären? Vielen Dank.
David Foerster

Hallo David, vor einiger Zeit, als ich Ports wie ftp öffne, habe ich ein Protokoll von Brute Force erhalten, als ich sehe, dass fail2ban in 24 Stunden mehr als 100 ips auf iptables fallen lässt. Ich schließe alle Ports außer 80. Jetzt versuche ich, Regeln wie fail2ban zu erstellen, aber für Apache.
Javier Palmero

2
Kennen Sie mod_security und mod_evasive für Apache?
pa4080

Ja, haben Sie Regeln zu teilen? oder wo zu finden? Ich bin block ips von blocklist.de
Javier Palmero

Ich habe fast alles aufgeschrieben, was ich über Apache2-Sicherheit weiß.
pa4080

Antworten:


18

Update: Die aktuelle Antwort wird vollständig aktualisiert.

Entsprechend dieser Diskussion habe ich ein GitHub-Repository namens WWW Security Assistant erstellt . Es gibt einen Zweig ask_ubuntu, der dieser Antwort gewidmet ist. Alle zuvor hier verfügbaren Referenzen werden aufgrund der Zeichenbeschränkung entfernt - sie sind auf GitHub verfügbar.

Hier finden Sie einige Möglichkeiten, wie Sie die Apache2-Sicherheit in Ubuntu 16.04 erhöhen können .

Inhaltsverzeichnis:

  • WWW Security Assistant Script (WSAS) ► Iptables
  • Iptables - Grundkonfiguration - Speichern und Wiederherstellen
  • ModEvasive für Apache2
  • ModEvasive ► WSAS ► Iptables
  • ModSecurity 2.9 für Apache2
  • ModSecurity OWASP-Kernregelsatz 3.x.
  • Whitelisting für ModSecurity-Regeln
  • ModSecurity-Regeln ► WSAS ► Iptables
  • ModSecurity- und Apache-Protokolldateien
  • ModSecurity-Protokolldateien ► Fail2Ban ► Iptables
  • ModSecurity GuardianLog ► HTTPD Guardian ► WSAS ► Iptables
  • ModSecurity GuardianLog ► Benutzerdefinierte HTTPD-Analyse ► WSAS ► Iptables

Nehmen wir außerdem an, es ist immer gut, HTTPS zu verwenden:


WWW Security Assistant-Skript ► Iptables

Hier wird das Skript vorgestellt www-security-assistant.bash. Es könnte Ihnen beim Umgang mit den schädlichen IP-Adressen helfen. Das Skript verfügt über zwei Modi.

Automatischer Modus

Wenn ein externes Programm wie das von Apache mod_securityeine schädliche $IPAdresse bereitstellt . In diesem Fall sollte die Syntax, die das Skript aufruft, wie folgt lauten:

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

In diesem Modus bietet das Skript zwei Aktionsstufen und sendet für jede Aktion eine E-Mail an den / die Administrator (en).

  • Erste Stufe: für die ersten paar ‚Übertretungen‘ die Quelle $IPwird für einen bestimmten Zeitraum gesperrt , um den Wert gleich $BAN_TIME. Dieser Modus verwendet den Befehl at.

  • Zweite Stufe: Wenn die Anzahl der Übertretungen von bestimmten $IPgleich dem Wert von wird $LIMIT, wird diese $IPAdresse durch Iptables dauerhaft gesperrt und dem hinzugefügt $BAN_LIST.

Manueller Modus

Dieser Modus akzeptiert die folgenden Optionen:

  • www-security-assistant.bash <ip-address> --DROP "log notes"

    Erstellt einen Eintrag in die Datei /var/www-security-assistant/iptables-DROP.listund generiert eine Regel wie folgt :

    iptables -A GUARDIAN -s $IP -j DROP
    
  • www-security-assistant.bash <ip-address> --DROP-CLEAR "log notes"

    Erstellt einen Eintrag in die Datei /var/www-security-assistant/iptables-DROP-CLEAR.list, entfernt die bestimmte Iptables-Regel, entfernt die $IPaus dem Verlauf und aus dem $BAN_LIST:

    iptables -D GUARDIAN -s $IP -j DROP
    
  • www-security-assistant.bash <ip-address> --ACCEPT "log notes"

    Erstellt nur einen Eintrag in die Datei /var/www-security-assistant/iptables-ACCEPT.list.

  • www-security-assistant.bash <ip-address> --ACCEPT-CHAIN "log notes"

    Erstellt einen Eintrag in die Datei /var/www-security-assistant/iptables-ACCEPT.listund generiert eine Regel wie folgt :

    iptables -A GUARDIAN -s $IP -j ACCEPT
    

Abhängigkeiten

Das Skript verwendet iptables-save.shund die iptablesKette GUARDIAN, die im nächsten Abschnitt erläutert wird. Es werden nur wenige Dateien erstellt und verwaltet in $WORK_DIR:

  • www-security-assistant.history - enthält die Daten für die Übertretungen der vorherigen IP.
  • www-security-assistant.mail - den Inhalt der letzten vom Skript gesendeten E-Mail.
  • iptables-ACCEPT.list;; iptables-DROP.listund iptables-DROP-CLEAR.list.

Das Skript benötigt eine minimale Konfiguration zum Senden von E-Mails:

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

Wenn ein HTTPS-Dienst konfiguriert ist, kann sein TLS-Zertifikat innerhalb des Postfix-Dienstes verwendet werden.

Zusätzlich verwendet das Skript at: sudo apt install at.

Installation

  • Arbeitsverzeichnis erstellen, nennen wir es /var/www-security-assistant. Laden Sie www-security-assistant.bashes herunter und machen Sie es ausführbar:

    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
    
  • Machen Sie www-security-assistant.bashals benutzerdefinierten Befehl zur Verfügung:

    sudo ln -s /var/www-security-assistant/www-security-assistant.bash /usr/local/bin/
  • Erteilen Sie die Berechtigung zum www-dataAusführen www-security-assistant.bashohne Kennwort über sudo. Verwenden Sie den folgenden Befehl, um eine neue Datei mit einer zusätzlichen sudoersRegel sicher zu erstellen und zu bearbeiten :

    sudo visudo -f /etc/sudoers.d/www-security-assistant

    Fügen Sie der Datei die folgende Zeile hinzu - speichern Sie die Datei und beenden Sie sie:

    www-data ALL=(ALL) NOPASSWD: /var/www-security-assistant/www-security-assistant.bash
  • Optimieren www-security-assistant.bash. Ändern Sie mindestens den Wert der Variablen $EMAIL_TO.

Untersuchung

  • Stellen Sie sich als dar $AGENTund prüfen Sie, ob der automatische Modus ordnungsgemäß funktioniert:

    www-security-assistant.bash 192.168.1.177 Guardian

    Überprüfen Sie dann Ihre E-Mails, geben Sie ein iptables -L GUARDIAN -n, überprüfen Sie die Dateien www-security-assistant.historyund www-security-assistant.mail. Führen Sie den obigen Befehl fünfmal aus und überprüfen Sie die Dateien iptables-DROP.listund iptables-CURRENT.conf.

  • Überprüfen Sie, ob der manuelle MODUS ordnungsgemäß funktioniert. Fügen Sie Ihren lokalen Host zur weißen Liste hinzu:

    www-security-assistant.bash 127.0.0.1 --ACCEPT "Server's localhost IP"

    Überprüfen Sie dann die Datei iptables-ACCEPT.list.


Der Rest dieses Tutorials ist die Integration www-security-assistantin Ihr System.


Iptables - Grundkonfiguration - Speichern und Wiederherstellen

Grundlegende Einstellung

Bitte lesen Sie dieses Handbuch, bevor Sie die folgenden Regeln hinzufügen.

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

Bevor Sie die nächsten Aktionen ausführen, öffnen Sie eine neue SSH-Verbindung und versuchen Sie, sich bei Ihrem System anzumelden, um zu überprüfen, ob alles einwandfrei funktioniert!

Speichern und wiederherstellen

Dies kann über benutzerdefinierte Skripte erreicht werden, die den iptablesConing während des Stopp-Start-Prozesses (oder Neustarts) des Systems speichern und wiederherstellen . (Wenn wir UFW zum Einrichten von Iptables-Regeln verwenden, ist dieser Schritt nicht erforderlich.)

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

Neue Kette erstellen

Erstellen Sie eine neue Kette, GUARDIANrufen Sie sie auf und fügen Sie sie als Nummer 3 in die INPUTKette ein:

sudo iptables -N GUARDIAN
sudo iptables -I INPUT 3 -j GUARDIAN

Untersuchung

Starten Sie das System neu und überprüfen Sie die Konfiguration. Bitte verwenden Sie sudo systemctl reboot(verwenden Sie nicht die Force-Option reboot -f). Wenn das System wieder online ist, können wir überprüfen, ob die neu erstellte Kette vorhanden ist, indem:

sudo iptables -L GUARDIAN -n


ModEvasive für Apache2

ModEvasive ist ein Ausweichmanöver-Modul für Apache, das Ausweichaktionen im Falle eines HTTP-DoS- oder DDoS-Angriffs oder eines Brute-Force-Angriffs ermöglicht. Weiterlesen...

Installation

  • Installieren und aktivieren Sie das Modul:

    sudo apt install libapache2-mod-evasive
    sudo a2enmod evasive
    
  • Erstellen Sie ein Protokollverzeichnis und machen Sie es zugänglich für www-data:

    sudo mkdir -p /var/log/apache2_mod_evasive
    sudo chown www-data /var/log/apache2_mod_evasive
    
  • Passen Sie die Grundkonfiguration an - kommentieren Sie bestimmte Anweisungen in der Konfigurationsdatei aus und bearbeiten Sie sie:

    /etc/apache2/mods-enabled/evasive.conf
  • Starten Sie Apache neu : sudo systemctl restart apache2.service.

Untersuchung

  • Öffnen Sie eine Webseite von Ihrem Server und aktualisieren Sie das Browserfenster einige Male intensiv (drücken Sie F5) - Sie müssen die Fehlermeldung 403 Forbidden erhalten . In das Protokollverzeichnis wird eine neue Sperrdatei generiert. Diese Datei sollte gelöscht werden, um weitere Verstöße gegen diese IP-Adresse zu erkennen.


ModEvasive ► WSAS ► Iptables

Hier werden wir konfigurieren, mod_evasiveum mit iptablesdem www-security-assistant.bashim obigen Abschnitt erstellten zu sprechen .

  • Bearbeiten Sie /etc/apache2/mods-available/evasive.confauf diese Weise:

    <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>
    
  • Erstellen Sie eine Protokolldatei und starten Sie Apache neu:

    sudo touch /var/www-security-assistant/www-security-assistant.execlog && sudo chown www-data /var/www-security-assistant/www-security-assistant.execlog

Um diese Konfiguration zu testen wir DDoS - Attacke über das simulieren können F5Verfahren, oben genannten, oder wir können einen Befehl verwenden ab, hping3etc.

Achtung: Seien Sie vorsichtig, da die iptablesin WSAS verwendete Regel alle neuen Verbindungen von der Quelle $IP, einschließlich Ihrer SSH-Verbindungen , trennt . Es ist gut, eine Sicherungsmethode zu haben, um während der Tests eine Verbindung zum Server herzustellen. Sie können diese Regel so ändern, dass sie nur mit den HTTP / HTTPS-Ports funktioniert.


ModSecurity 2.9 für Apache2

ModSecurity ist eine Webanwendungs-Firewall-Engine, die für sich genommen nur sehr wenig Schutz bietet. Um nützlich zu werden, muss ModSecurity mit Regeln konfiguriert werden. Damit Benutzer ModSecurity sofort nutzen können, bietet Spiderws von Trustwave einen kostenlosen zertifizierten Regelsatz ... Weiterlesen ...

Installation

  • Installieren und aktivieren Sie das Modul:

    sudo apt install libapache2-mod-security2
    sudo a2enmod security2
    
  • Konfigurationsdatei erstellen:

    sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf

    Lesen und bearbeiten Sie /etc/modsecurity/modsecurity.confsorgfältig! Fügen Sie mindestens die folgenden Anweisungen hinzu oder ändern Sie sie:

    # -- 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
    
  • Die Datei /etc/apache2/mods-enabled/security2.confbeinhaltet /etc/modsecurity/modsecurity.confin Apache - Konfiguration. In diesem Stadium security2.confsoll so aussehen:

    <IfModule security2_module>
        SecDataDir /var/cache/modsecurity
        IncludeOptional /etc/modsecurity/*.conf
    </IfModule>
    
  • Protokollverzeichnis erstellen:

    sudo mkdir -p /var/log/apache2_mod_security
  • Protokollrotation einrichten. Erstellen Sie zuerst eine Konfigurationsdatei:

    sudo cp /etc/logrotate.d/apache2 /etc/logrotate.d/apache2-modsec

    Bearbeiten Sie dann die neue Datei folgendermaßen:

    /var/log/apache2_mod_security/*.log {  }
  • Starten Sie Apache neu.

Untersuchung

  • Erstellen Sie eine zusätzliche Konfigurationsdatei in /etc/modsecurity, rufen Sie sie beispielsweise auf z-customrules.confund fügen Sie die folgende Regel als Inhalt hinzu:

    # Directory traversal attacks
    SecRule REQUEST_URI "../" "t:urlDecodeUni, deny, log, id:109"
    

    Starten Sie den Server neu : sudo systemctl restart apache2.service. Öffnen Sie Ihren Browser und geben Sie ein https://example.com/?abc=../. Das Ergebnis ist: 403 Verboten . Überprüfen Sie die Protokolldateien /var/log/apache2_mod_securityfür weitere Details.

  • Damit die Dinge mehr Spaß machen, platzieren Sie das Skript issues.phpan einer geeigneten Stelle in Ihrem DocumentRoot(hier gehe ich davon aus, dass dieser Ort ist /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

    Ändern Sie dann die obige Regel folgendermaßen:

    # 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'"
    

    Starten Sie Apache neu, öffnen Sie Ihren Browser und geben Sie ein https://example.com/?abc=../;-) Die Idee stammt aus dem Skript der SE BotLovin.cs.

  • Bearbeiten Sie /etc/modsecurity/z-customrules.confdie Regel erneut und kommentieren Sie sie (deaktivieren Sie sie) - dies war nur ein Testbeispiel und wird von OWASP CRS behandelt, das im nächsten Abschnitt beschrieben wird.

  • Hier ist ein weiteres Beispiel, in dem wir alle wp-adminSeitenanforderungen umleiten , jedoch mit Ausnahme dieser von bestimmten IP-Adressen (beachten Sie Folgendes 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"
    

    Hier haben wir zwei störende Aktionen: (1) deny, status:403und (2) redirect:'/issues.php'. Eigentlich brauchen wir die denyAktion nicht, weil sie von der redirectAktion überschrieben wird .


ModSecurity OWASP-Kernregelsatz 3.x.

In Ubuntu 16.04 können Sie CSR 2.x installieren : apt install modsecurity-crs. Hier installieren wir CSR 3.x. Detaillierte Anweisungen finden Sie im Installationshandbuch ( giterforderlich).

Installation

  • Klonen Sie CSR in den Ordner /usr/share/modsecurity-crs.3:

    sudo git clone https://github.com/SpiderLabs/owasp-modsecurity-crs /usr/share/modsecurity-crs.3
  • Aktualisieren und erneuern Sie die GeoIP-Datenbank automatisch. (Die GeoIP-Datenbank ist nicht mehr im CRS enthalten. Stattdessen wird empfohlen, sie regelmäßig herunterzuladen.) Das Skript util/upgrade.pybietet diese Funktionalität. Sie können es wie folgt in cron - verwenden 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
  • Konfigurationsdateien erstellen:

    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,}
    

    Lesen und bearbeiten Sie diese Dateien sorgfältig! Kommentar zumindest SecGeoLookupDBRichtlinie:

    SecGeoLookupDB util/geo-location/GeoIP.dat
  • Wenden Sie die Apache-Konfiguration an. Bearbeiten Sie /etc/apache2/mods-available/security2.confauf diese Weise:

    <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>
    

    Speichern Sie die Datei und starten Sie Apache neu.


Whitelisting für ModSecurity-Regeln

Das Whitelisting von ModSecurity-Regeln kann über die folgenden ModSec-Anweisungen erfolgen, die systemweit oder innerhalb der Konfiguration des virtuellen Hosts auch global für bestimmte Verzeichnisse oder Standortübereinstimmungen verwendet werden können:

SecRuleRemoveById
SecRuleRemoveByMsg
SecRuleRemoveByTag
SecRuleUpdateTargetById
SecRuleUpdateTargetByMsg
SecRuleUpdateTargetByTag
SecRuleUpdateActionById

Deaktivieren Sie mod_security2für PhpMyAdmin. Ändern Sie /etc/phpmyadmin/apache.confauf diese Weise:

<Directory /usr/share/phpmyadmin>
    <IfModule security2_module>
        SecRuleEngine Off
    </IfModule>
</Directory>

Deaktivieren Sie bestimmte Regeln für ein bestimmtes Verzeichnis:

<Directory /var/www/html>
    <IfModule security2_module>
        SecRuleRemoveById 973301
    </IfModule>
</Directory>

Regeln global deaktivieren. Zu diesem Zweck müssen wir unsere Anweisungen irgendwo in den Konfigurationsdateien von Apache hinzufügen: /etc/modsecurity/z-customrules.confist ein guter Ort.

  • Deaktivieren Sie Regeln in der gesamten Apache-Konfiguration:

    SecRuleRemoveById 973301 950907
  • Whitelist eine IP-Adresse, damit sie ModSecurity passieren kann:

    SecRule REMOTE_ADDR "@ipMatch 192.168.110.1" "phase:1,nolog,allow,ctl:ruleEngine=Off,ctl:auditEngine=Off"
  • Regeln innerhalb der Verzeichnisübereinstimmung deaktivieren:

    <Directory /var/www/mediawiki/core>
        SecRuleRemoveById 973301 950907
    </Directory>
    
  • Aktualisieren Sie die Aktion der Regel anhand ihrer ID innerhalb der Standortübereinstimmung:

    <LocationMatch "/index.php.*">
        SecRuleUpdateActionById 973301 "pass"
        SecRuleUpdateActionById 950907 "pass"
    </LocationMatch>
    

In den obigen Beispielen gehen wir davon aus, dass 973301und 950907sind Regel - IDs, die die normale Arbeit unserer Web - Anwendungen behindern. Wir können Regeln wie diese durch eine Analyse von finden modsec_audit.log.


ModSecurity-Regeln ► WSAS ► Iptables

Im Folgenden finden Sie einige weitere Beispiele zum Erstellen benutzerdefinierter SecRules sowie zum Aufrufen des WWW Security Assistant Script (WSAS).

Ersteinrichtung

Wir brauchen einen zusätzlichen Startup-Scrip - modsecurity-assistant.sh. Der Grund dafür ist, dass die execAktion von ModSecurity eine zu einfache und eingeschränkte Syntax aufweist.

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

Wenn Sie in das Skript schauen, sehen Sie einige Variablen, die von ModSecurity exportiert werden. Diese sind: $REQUEST_URI, $ARGS, $SERVER_NAME, $REMOTE_ADDR, $REMOTE_HOSTund $UNIQUE_ID. Die anderen Variablen werden im Skript erläutert.

Erstellen Sie eine benutzerdefinierte Regel und rufen Sie unsere Skripte auf

Zuerst erstellen wir eine Regel, die ausgeführt modsecurity-assistant.sh(und aufgerufen www-security-assistant.bash) wird, wenn der Anforderungs-URI ein Wort enthält, das in unserer Blacklist enthalten ist. Öffnen /etc/modsecurity/z-customrules.confSie die folgenden Zeilen und fügen Sie sie unten hinzu:

# 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- Diese Variable enthält den vollständigen URI der aktuellen Anforderung. Die Regel könnte weiter gefasst sein:SecRule REQUEST_URI|ARGS|REQUEST_BODY ...

  • @pmFromFileliest die Datei modsecurity-uri-black.list, die eine Liste von Phrasen enthält, wobei jede bestimmte Phrase oder jedes Wort in eine neue Zeile eingefügt wird. Sie können interessante Wörter und Sätze aus den Protokolldateien sammeln. Wenn es eine bestimmte Übereinstimmung zwischen REQUEST_URIund unserer Liste von Mustern gibt, wird die Regel angewendet. Die Datei könnte leer sein, aber Sie müssen sie erstellen ( touch).

  • Die logAktion erstellt Protokolleinträge in den Protokolldateien für diese Regel mit id:150.

  • drop, deny(mit status) und redirectAktionen gehören zur störenden Gruppe von Aktionen, sie müssen am Anfang der Regel stehen chain(wenn es eine Kette gibt). Die zweite Aktion überschreibt die erste und die dritte die zweite. Sie müssen also auswählen, welche Aktion ausgeführt werden soll, und die anderen löschen.

  • chainDie Aktion ruft die nächste Regel der Kette auf. Beachten Sie, dass die zweite Regel keine hat id.

  • REMOTE_ADDR enthält die IP-Adresse der Anfrage.

  • @ipMatchFromFilewird die Datei modsecurity-ip-white.list, die eine weiße Liste von IP-Adressen enthält, in neuen Zeilen getrennt. CIDR-Einträge sind ebenfalls zulässig. Da sich die störende Aktion immer in der führenden Regel der Kette befindet, wird sie angewendet. Wenn sich jedoch eine bestimmte IP in dieser weißen Liste befindet, wird die execAktion nicht angewendet. Die Datei könnte leer sein, aber Sie müssen sie erstellen ( touch).

  • execAktion ruft unser externes Skript auf. Diese Aktion ist nicht störend und wird ausgeführt, wenn die aktuelle Regel true zurückgibt. Wenn diese Aktion angewendet wird, wird die Remote-IP über unsere Skripte verarbeitet.

  • setenvDiese Aktion exportiert bestimmte interne Variablen =%{...} als Envvars. Exportierte Namen können sich von den internen unterscheiden. Einige Variablen müssen manuell exportiert werden, andere werden automatisch exportiert - wahrscheinlich handelt es sich um einen kleinen Fehler (in einigen Fällen führt der manuelle Export mit denselben Namen beispielsweise setenv:REQUEST_URI=%{REQUEST_URI}zu einem leeren Wert der exportierten Variablen).

Untersuchung

Nehmen wir an, Sie haben Joomla nicht auf Ihrem Server, bearbeiten die Datei modsecurity-uri-black.listund fügen eine Zeile mit Inhalt hinzu /joomla. Geben Sie dann Ihren Browser ein https://exemple.com/joomla. Sie sollten über Iptables umgeleitet und blockiert werden. Löschen Sie die Datensätze sudo www-security-assistant.bash <your-ip> --DROP-CLEAR 'some note', fügen Sie Ihre IP hinzu modsecurity-ip-white.listund wiederholen Sie die Übung. Jetzt sollten Sie umgeleitet, aber nicht blockiert werden.

Verbinden Sie unsere Skripte mit OWASP Core Rule Set 3.x.

Dazu aktualisieren wir die Standardaktion der Regeln für den Anomaliemodus (949110 und 959100). Bearbeiten Sie zu diesem Zweck die Datei /usr/share/modsecurity-crs.3/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.confund fügen Sie die nächsten Zeilen unten hinzu:

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

Untersuchung

Vergessen Sie nicht, Apache neu zu starten (oder neu zu laden), um die Konfigurationsänderungen zu übernehmen. Vergessen Sie nicht, die Aufzeichnungen während der Tests regelmäßig zu löschen, da Sie sonst dauerhaft gesperrt werden können :-)

Verzeichnisüberquerungsangriff simulieren:

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 Injection-Angriff simulieren:

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- und Apache-Protokolldateien

Der Apache-Webserver kann so konfiguriert werden, dass er dem Serveradministrator wichtige Informationen zur Funktionsweise gibt. Der Hauptweg, um dem Administrator Feedback zu geben, ist die Verwendung von Protokolldateien. Weiterlesen...

ModSecurity verfügt über einen leistungsstarken Protokollierungsmechanismus. Durch die Direktive SecGuardianLogwird ein Protokoll-Feed bereitgestellt, der speziell für die Arbeit mit externen Skripten entwickelt wurde.

Derzeit ist das einzige Tool, das für die Verwendung mit der Guardian-Protokollierung bekannt ist httpd-guardian, Teil des Apache httpd-Tools-Projekts . Das httpd-guardianTool wurde entwickelt, um sich gegen Denial-of-Service-Angriffe zu verteidigen. Es verwendet die, blacklist toolum mit einer auf iptables basierenden ... Firewall zu interagieren und die fehlerhaften IP-Adressen dynamisch auf die schwarze Liste zu setzen. Weiterlesen...


ModSecurity-Protokolldateien ► Fail2Ban ► Iptables

Es ist möglich, Fail2Ban für die Datenanalyse der Apache-Protokolldateien einzurichten. modsec_audit.logist wahrscheinlich die beste Wahl, aber siehe auch die Abschnitte, über die wir sprechen SecGuardianLog.

Achten Sie darauf, dass SecAuditLogRelevantStatusin /etc/modsecurity/modsecurity.confkommentiert wird. Andernfalls würde jeder, der eine 404-Fehlerseite erhält, von fail2ban blockiert.

SecAuditEngine RelevantOnly
#SecAuditLogRelevantStatus "^(?:5|4(?!04))"

Derzeit ist Fail2Ban in diesem Projekt in keiner Weise implementiert.


ModSecGuardianLog ► HTTPD-Guardian ► WSAS ► Iptables

httpd-guardian- Erkennen von DoS-Angriffen durch Überwachen von Anforderungen Apache Security, Copyright (C) 2005 Ivan Ristic - Entwickelt alle Webserver-Anforderungen über den Pipe-Protokollierungsmechanismus. Es verfolgt die Anzahl der von jeder IP-Adresse gesendeten Anforderungen ... httpd-guardian kann entweder eine Warnung ausgeben oder ein Skript ausführen, um die IP-Adresse zu blockieren ...

Dieses Skript kann mit dem Apache2-Protokollierungsmechanismus oder mit ModSecurity (besser) verwendet werden.

Installation und Einrichtung unter den aktuellen Umständen

Laden Sie httpd-guardianes herunter und machen Sie es ausführbar:

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

Lesen Sie die Zeilen, um 98-119zu sehen, wie das Skript mit unserem WSAS-Skript verbunden ist.

Übernehmen Sie die folgende Änderung in Apaches Konfiguration ( /etc/modsecurity/modsecurity.conf) und starten Sie sie neu:

#SecGuardianLog /var/log/apache2_mod_security/modsec_guardian.log
SecGuardianLog "|/var/www-security-assistant/httpd-guardian.pl"

Untersuchung

Um das Skript zu testen, deaktivieren Sie ModEvasive ( sudo a2dismod evasivevergessen Sie nicht, es später zu aktivieren) und starten Sie Apache neu. Dann taildas Exec-Protokoll:

tail -F /var/www-security-assistant/www-security-assistant.execlog

Führen Sie von einer anderen Instanz aus einen DoS-Angriff aus, indem Sie ihn beispielsweise folgendermaßen verwenden ab:

for i in {1..20}; do (ab -n 200 -c 10 https://example.com/ &); done


ModSecGuardianLog ► Benutzerdefinierte Analyse ► WSAS ► Iptables

Hier wird ein einfaches Skript mit dem Namen vorgestellt httpd-custom-analyze.bash, das nichts Besonderes ist, aber ein schönes Beispiel sein könnte. Seine Funktionen werden im Hauptteil des Skripts beschrieben.

Installation und Einrichtung

Laden Sie httpd-custom-analyze.bashes herunter und machen Sie es ausführbar:

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

Übernehmen Sie die folgende Änderung in Apaches Konfiguration ( /etc/modsecurity/modsecurity.conf) und starten Sie sie neu:

#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"
  • Das Skript ruft WSAS auf, wenn der Schwellenwert erreicht ist - Zeile lesen 86und 35.

  • Damit beide httpd-Skripte gleichzeitig funktionieren, bearbeiten modsecurity.confund leiten Sie sie SecGuardianLogan beide weiter.

  • Befolgen Sie zum Durchführen eines Tests die Tipps aus dem obigen Abschnitt.


Bitte bearbeiten Sie Ihren Beitrag nicht häufig. Wenn Sie Ihren Beitrag an einem Tag viele Male ständig bearbeiten, wird dies immer wieder auf die Titelseite verschoben und es entsteht auch Lärm für uns Moderatoren. Ziehen Sie stattdessen in Betracht , Ihren Inhalt auf einer anderen Seite oder in einem Texteditor zu entwerfen und ihn dann in großen Mengen zu bearbeiten, anstatt Details einzeln zu bearbeiten. (Dieser Beitrag ist für eine Stunde gesperrt, um die hier vorübergehend vorgenommene Bearbeitung zu beschränken.)
Thomas Ward

1
Vielen Dank für die Bemerkung, @ThomasWard. Ich werde daran denken! Ist es nicht eine gute Idee, auf der Benutzerseite neben Profil und Einstellungen bearbeiten etwas als Sandbox zu haben ?
pa4080

1
Es wurde vorgeschlagen und ich glaube abgelehnt. Ich würde vorschlagen, dass Sie Änderungen vornehmen, ohne sie zu speichern, und eine Kopie Ihrer Frage so wie sie ist in einer Textdatei auf Ihrem System speichern. Dann können Sie diese bearbeiten, wieder kopieren, wenn Sie den Beitrag bearbeiten möchten, und dann Fix für Abschriften und so. Außerdem machen alle Streiks ... die Dinge schwer lesbar. Entfernen Sie stattdessen nur diese Abschnitte. (Revisionsverlauf behält die Daten bei)
Thomas Ward

Es ist lächerlich, dass Stack Exchange nicht zulässt, dass Änderungen an der Startseite vorgenommen werden
Franck Dernoncourt,

1

Mir ist klar, dass pa4080 eine detaillierte und wahrscheinlich sehr hilfreiche Antwort gegeben hat, um sich selbst darum zu kümmern. Es kann sich zwar gut anfühlen, sich selbst um Probleme zu kümmern, dies kann jedoch auch viel Zeit in Anspruch nehmen .

  1. Machen Sie sich mit Cloudflare vertraut, da es kostenlosen DDoS-Schutz bietet.
  2. Wenn Sie derzeit nur Apache verwenden, sollten Sie lernen, wie NGINX funktioniert, um Ihre Last auszugleichen. NGINX eignet sich hervorragend für den Lastausgleich von Apache, wie hier und hier gezeigt .
  3. Bewertung von Apache - Tipps für die Sicherheit auf ihren Dokumenten .
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.