Wenn Sie Webanwendungen entwickeln oder warten, müssen Sie sich zu einem bestimmten Zeitpunkt mit der Notwendigkeit befassen, WAF (Web Application Firewall) zu verwenden. Wenn Sie keine Erfahrung mit dieser Lösungsklasse haben oder die ständigen Fehlalarme satt haben, werde ich Ihnen erklären, wie Sie die Aufgabe vereinfachen und Tipps und Tricks austauschen können. Als Tool verwenden wir Nemesida WAF Free - eine kostenlose Version von Nemesida WAF.
Visualisierung, oder fangen wir am Ende an
Sie können die Arbeit von Nemesida WAF Free über einen Browser überwachen. Nach einer kurzen Einrichtung des Systems erhalten Sie Zugriff auf die Weboberfläche, auf der Informationen zu blockierten Angriffen, Blockierungsgründen, Informationen zu IP-Adressen usw. verfügbar sind. Außerdem werden Abschnitte mit zusammenfassenden Statistiken in Form von Diagrammen, Diagrammen und Daten zum Datenverkehr vom VTS-Modul (falls verwendet) angezeigt.
Demonstrationsstand: demo.lk.nemesida-security.com (demo@pentestit.ru / pentestit) Fahren
wir mit der Installation fort.
Installation von Nemesida WAF Free
Trotz der Tatsache, dass die kostenlose Version eine Abzweigung der vollwertigen Version ist, enthält sie eine Vielzahl von Funktionen zum Erkennen, Blockieren und Visualisieren von Angriffen auf Webanwendungen. Unter einer Webanwendung verstehen wir alles, was auf dem HTTP-Protokoll basiert: Websites, persönliche Konten, Online-Shops, Schulungsseiten, APIs und alles andere.
Im vorherigen Absatz habe ich die Funktionalität des Blockierens von Angriffen speziell in Erkennung und Blockierung unterteilt, da es zwei (sogar drei) Betriebsmodi des Produkts gibt: IDS, IPS und PseudoIDS (LM-Modus).
IDS-Modus
Im IDS-Modus können Sie WAF für eine Verkehrskopie verwenden, um Angriffe zu erkennen, aber nicht zu blockieren. Diese Betriebsart ist beispielsweise für den Erststart oder für die passive Überwachung nützlich, um ein Blockieren von Anforderungen oder eine noch so geringe Verlängerung der Antwortzeit zu vermeiden. Für die Beispielkonfiguration verwenden wir Nginx für den sendenden Server (obwohl Sie auch jeden anderen verwenden können, z. B. Apache2 oder IIS).
Konfigurieren des sendenden Servers:
location / {
mirror /mirror;
...
}
location = /mirror {
internal;
proxy_pass http://192.168.0.1$request_uri;
}
(Anstelle von 192.168.0.1 müssen Sie die Adresse des Servers angeben, auf dem Nemesida WAF installiert ist.)
Nach dem Vornehmen von Änderungen und dem Neustart des Webservers werden Anforderungen, die an diesen Server gesendet werden, an den Server 192.168.0.1 mit installiertem Nemesida WAF übertragen (die Konfiguration ist einfach und wird unten beschrieben). Mit diesem Arbeitsschema können Sie Angriffe überwachen, ohne sie zu blockieren, ohne jedoch den Hauptserver zu beeinträchtigen.
IPS-Modus und PseudoIDS
Die verbleibenden 2 Betriebsmodi setzen die Verwendung von WAF "umgekehrt" voraus, während im IPS-Modus erkannte Sicherheitsvorfälle blockiert werden, im PseudoIDS-Modus werden sie aufgezeichnet, aber nicht blockiert. Der letzte Modus ist praktisch, da das Umschalten zwischen diesen beiden Modi mithilfe einfacher Optionen erfolgt: Die Möglichkeit, sowohl über den Servernamen (Option
nwaf_host_lm
) als auch über die IP-Adresse des Clients (Option ) in den PseudoIDS-Modus zu wechseln
nwaf_ip_lm
.
Im Allgemeinen bietet Nemesida WAF Free viele Parameter für die "Feinabstimmung" des Systems: flexible Funktionen zum Erstellen eigener Blockierungs- und Ausschlussregeln, die Möglichkeit, die IP eines Clients zur "Ausschlussliste" hinzuzufügen, die Option, ein Verbot für alle und für jeden einzelnen virtuellen Host einzurichten usw. ... All diese Wirtschaftlichkeit kann durch eine Konfigurationsdatei in der kostenlosen Version und in der Vollversion auch durch API-Aufrufe gesteuert werden.
Kehren wir zum Installationsvorgang zurück. Nemesida WAF wird in Form mehrerer Komponenten dargestellt:
- Dynamisches Modul für Nginx
- Nemesida WAF API (akzeptiert Ereignisse von Nemesida WAF und platziert sie in Postgres zur späteren Anzeige im LC oder zur Integration in SIEM-Systeme)
- Persönliches Konto (Webschnittstelle zur Überwachung von Vorfällen)
- Nemesida AI Modul für maschinelles Lernen
- Sicherheitslücken-Scanner Nemesida WAF-Scanner
- Nemesida WAF Signtest - Webschnittstelle zur Verwaltung eines Moduls für maschinelles Lernen
In Nemesida WAF Free benötigen wir nur die ersten drei - das dynamische Modul selbst, die Nemesida WAF-API und das persönliche Konto. Alle Komponenten sind als Installationsdistributionen verfügbar und ermöglichen es Ihnen, Nemesida WAF ab Version 1.12 mit einer bereits installierten Nginx-Instanz zu verbinden (Stable-, Mainline- und Plus-Versionen von Nginx werden unterstützt).
Dynamisches Modul Nemesida WAF
Für diejenigen, die das Distributionskit nicht zum ersten Mal installieren, dauert die Installation und Ausführung des dynamischen Moduls etwa 5 bis 10 Minuten. Das dynamische Nemesida WAF-Modul kann mit einem bereits installierten Nginx verbunden werden (oder mit eigenen Modulen aus dem Quellcode kompiliert werden).
Nemesida WAF-Repositorys sind für das folgende Betriebssystem verfügbar: Debian 9/10, Ubuntu 16.04 / 18.04 / 20.04, Centos 7/8. Videoanweisungen zur Installation und Erstkonfiguration von Komponenten werden auf dem Youtube-Kanal veröffentlicht. Wir empfehlen, dass Sie sich mit einem davon vertraut machen. Wir empfehlen jedoch, die Installation und Konfiguration gemäß der Dokumentation auf der Hauptwebsite durchzuführen, da einige Parameter möglicherweise veraltet sind und andere hinzugefügt werden.
Installation des dynamischen Moduls Nemesida WAF (Video)
Verbinden Sie nach der Konfiguration von Nginx das Ihrem Betriebssystem entsprechende Nemesida WAF-Repository und fahren Sie mit der Installation fort. Das Produkt wird auch aus dem Repository aktualisiert. Installationsanweisungen finden Sie unter: github.com/nemesida-waf/nemesida_waf_free .
Nemesida WAF API und persönliches Konto
Nachdem das dynamische Modul installiert und gestartet wurde, ist es Zeit, mit der Installation der verbleibenden zwei Komponenten fortzufahren: Nemesida WAF API und Personal Account.
Die Nemesida WAF-API wird in Form einer mit Flask geschriebenen API dargestellt und dient zum Empfangen von Ereignissen von Nemesida WAF, Nemesida WAF Scanner und Nemesida AI und zum anschließenden Platzieren dieser Ereignisse in der Datenbank. PostgreSQL wird als DBMS verwendet. In der kostenlosen Version von Nemesida WAF werden nur Informationen zu blockierten Anforderungen an die Datenbank übertragen.
Nachdem die Nemesida WAF-API konfiguriert und mit PostgreSQL verbunden wurde, können Sie Ihr persönliches Konto starten. Gemäß der Dokumentation installieren, konfigurieren, führen wir eine Migration durch und geben den Benutzer und das Kennwort an, die eingegeben werden sollen.
Erfahrungsgemäß verursacht die Installation der letzten beiden Komponenten größere Schwierigkeiten (normalerweise werden einige Schritte übersprungen, z. B. vergessen sie die Migration oder erlauben die Verbindung zu Postgres). Für einen schnellen Start haben wir eine virtuelle Appliance vorbereitet (virtuelle Festplatte mit Debian 10- und Nemesida WAF-Komponenten, 3 GB bis entpacken) und machte auch 2 Docker-Images : für das dynamische Modul und für die Nemesida WAF API / Personal Account.
Nun, der langweiligste Teil ist vorbei, jetzt können wir WAF in Aktion testen.
Erster Hack
Um den Betrieb einer bereits konfigurierten WAF zu testen, müssen nicht verschiedene Angriffsvarianten berücksichtigt werden. Wir haben eine Testsignatur erstellt, die überprüft, ob Nemesida WAF funktioniert und ob blockierte Angriffe im LC angezeigt werden. Der aktuell verwendete Satz verwendeter Signaturen kann immer unter rlinfo.nemesida-security.com eingesehen werden .
Wir senden eine Anfrage (ich habe es über die Konsole gemacht, aber es ist aus Gründen der Klarheit besser, es über den Browser zu machen):
curl --noproxy '*' example.com/nwaftest
oder, wenn Sie etwas näher an der Realität wollen:
curl --noproxy '*' example.com/?cmd=;+cat+/etc/passwd
Als Antwort erhalten wir einen 403-Antwortcode:
<html> <head><title>403 Forbidden</title></head> <body> <center><h1>403 Forbidden</h1></center> <hr><center>nginx/1.18.0</center> </body> </html>
Und in wenigen Sekunden sollte ein Angriff im LC erscheinen:
Wenn die Anfrage nicht blockiert ist - WAF ist falsch verbunden oder konfiguriert (möglicherweise wurde die Adresse oder der Host zu WL / LM hinzugefügt), wenn die Anfrage blockiert wurde, aber keine Informationen im LC vorhanden sind - überprüfen Sie die Richtigkeit der Interaktion mit Nemesida WAF API und LC. In jedem Fall können Sie im Forum jederzeit eine Frage stellen .
Benutzerdefinierte 403-Seite
Standardmäßig ist die 403-Seite (Seite mit 403-Antwortcode) unattraktiv und mit Informationen geizig. Mit Nemesida WAF in Verbindung mit Nginx können Sie es schöner und informativer gestalten.
Damit Ihr Server eine solche Seite
bereitstellen kann, müssen Sie: 1. eine Konfigurationsdatei für benutzerdefinierte Seiten erstellen (z. B. in
/etc/nginx/snippets/custom_pages.conf
);
Fügen Sie Nginx die erforderlichen Parameter hinzu
— 222 403 405
;
( example.com/403.html — ), ID ($request_id), ($host), , IP ($remote_addr) ( ) Nemesida WAF ($nwaf_block_type). Nemesida WAF , , 1 2 — , 3 — , 4 — ..
## Error pages
error_page 403 405 = 222 /403.html;
## Locations
location /403.html {
internal;
root /var/www/custom_pages/;
proxy_no_cache 1;
proxy_cache_bypass 1;
add_header X-Request-ID $request_id always;
add_header Host $host always;
add_header X-Remote-IP $remote_addr always;
add_header NemesidaWAF-BT $nwaf_block_type always;
}
Beschreibung:
error_page 403 405 = 222 /403.html;
— 222 403 405
/403.html
;
/403.html
( example.com/403.html — ), ID ($request_id), ($host), , IP ($remote_addr) ( ) Nemesida WAF ($nwaf_block_type). Nemesida WAF , , 1 2 — , 3 — , 4 — ..
2. Verbinden Sie die erstellte Datei:
Verbinden Sie die erstellte Datei mit der Nginx-Konfiguration
(,
):
/etc/nginx/conf.d/example.com.conf
):
server {
...
## Custom pages
include snippets/custom_pages.conf;
....
}
3. Erstellen Sie eine benutzerdefinierte Seite (zum Beispiel
/var/www/custom_pages/403.html
) mit folgendem Inhalt (zum Beispiel):
Beispiel einer benutzerdefinierten 403-Seite
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="refresh" content="7; URL=/" />
<style type="text/css">
.error {color:#000; font-family:Arial, sans-serif; text-align: center; position: absolute; top: 50%; left: 50%; -moz-transform: translateX(-50%) translateY(-50%); -webkit-transform: translateX(-50%) translateY(-50%); transform: translateX(-50%) translateY(-50%);}
.error-fon {font-weight:bold; color:#d0e3f7;}
.error-text-top {font-size:16px; color:#434141}
hr { display: block; height: 10px; border: 0; border-top: 1px solid #ccc; margin: 1em 0; padding: 0; }
</style>
<title>403 Access denied</title>
</head>
<body>
<div class="error">
<div class="error-fon">
<font style="font-size:240px;">403</font>
<br>
<font style="font-size:40px;">ACCESS IS BLOCKED</font>
</div>
<br>
<div class="error-text-wrap">
<div class="error-text-top">
<p>
<hr>
<p style="text-align: justify;">
Suspicious activity. If the request is blocked by mistake, please email us at <a href="mailto:blocked@example.com">blocked@example.com</a> and be sure to include technical information below (domain, IP, request ID), or try again in 5 minutes.
<br><br>
. , , <a href="mailto:blocked@example.com">blocked@example.com</a>, (domain, IP, request ID), 5 .
</p>
<hr>
<table style="text-align: left; margin: auto">
<tr>
<td>
<code style="font-size:14px;"> Domain:</code>
</td>
<td>
<code style="font-size:14px;"> <span id="domain">-</span> </code>
</td>
</tr>
<tr>
<td>
<code style="font-size:14px;"> IP address:</code>
</td>
<td>
<code style="font-size:14px;"> <span id="ip">-</span> </code>
</td>
</tr>
<tr>
<td>
<code style="font-size:14px;"> Request ID:</code>
</td>
<td>
<code style="font-size:14px;"> <span id="id">-</span> </code>
</td>
</tr>
</table>
</p>
</div>
<script type="application/javascript">
function replace() {
window.location.replace('/');
}
const req = new XMLHttpRequest();
req.open('GET', document.location, false);
req.send(null);
const req_id = req.getResponseHeader('x-request-id');
const req_domain = req.getResponseHeader('host');
let req_ip = req.getResponseHeader('x-remote-ip');
const req_bt = req.getResponseHeader('nemesidawaf-bt');
if (req_bt == 6)
{
req_ip = req_ip + " (banned)";
}
if (req_bt ==7)
{
req_ip = req_ip + " (banned, bruteforce)";
}
document.getElementById('domain').innerHTML = req_domain;
document.getElementById('ip').innerHTML = req_ip;
document.getElementById('id').innerHTML = req_id;
if (req_bt != 6 & req_bt !=7)
{
setTimeout(replace,3000);
}
</script>
</div>
</div>
</body>
</html>
Nach dem Neustart von Nginx (mit installiertem Nemesida WAF) sehen alle Seiten mit den Antwortcodes 403 und 405 folgendermaßen aus:
In diesem Fall wird die benutzerdefinierte Seite alle 7 Sekunden aktualisiert. Wenn die IP- Adresse des Clients nicht gesperrt ist, wird die Stammseite der Site zurückgegeben.
Automatisches Verbot
Sie haben wahrscheinlich automatische Verbotsysteme wie Fail2ban gehört oder sogar verwendet und kennen deren Vor- und Nachteile. Nemesida WAF verwendet einen integrierten und einfach zu konfigurierenden Sperrmechanismus, mit dem Sie eine beliebige Sperrfrist für virtuelle Serverhosts festlegen können. Die Blockierung erfolgt nach IP-Adresse, und die folgenden Optionen stehen zur Steuerung zur Verfügung:
- Die Anzahl der IP-Angriffe, die zum Blockieren führen.
- Sperrfrist;
- Der virtuelle Host, an den die Angriffe gerichtet sind (optional).
Der automatische Blockierungsparameter wird durch den
nwaf_limit
in der Datei verfügbaren Parameter gesteuert
/etc/nginx/nwaf/conf/global/nwaf.conf
. Die Verwendung dieses Parameters ist nützlich, wenn die Site nach Sicherheitslücken durchsucht wird oder wenn versucht wird, eine entdeckte Sicherheitsanfälligkeit zu fördern.
Während Listen
Die WAF-Arbeit basiert auf dem Prinzip der Analyse von Anforderungen und Antworten, die an den Server gesendet werden, wenn sie Anzeichen eines Angriffs oder von Anomalien enthalten. Die Verwendung von Algorithmen für maschinelles Lernen in Verbindung mit einer verbesserten Normalisierungstechnologie in der Vollversion von Nemesida WAF ermöglicht es uns, solche Angriffe genau und mit einer extrem minimalen Anzahl von Fehlalarmen (etwa 0,01%) zu erkennen. In der kostenlosen Version, um die Anzahl von Fehlalarmen zu verringern, stoßen wir jedoch auf Einschränkungen, die der Architektur inhärent sind Signaturanalyse. Daher enthält die kostenlose Version mehr Fehlalarme, und Sie müssen Ausschlusslisten (oder "weiße Listen") verwenden, um dieses Problem zu lösen. Die Erstellung von Ausschlussregeln ist auch in Nemesida WAF verfügbar.
In den meisten Fällen werden Fehlalarme angezeigt, wenn der Administrator / Moderator einer Webressource über die Weboberfläche eine Aktualisierung oder Änderung vornimmt und Konstruktionen überträgt, die für den Benutzer im Anforderungshauptteil untypisch sind: Eine legitime Anforderung wird blockiert, da sie einen Funktionseintrag enthält , während solche Anforderungen für normale Besucher nicht typisch sind Webressource. In Fällen, in denen Anwendungsadministratoren unter Umgehung der WAF nicht mit ihr interagieren können, können Sie die IP-Adresse, von der aus sie auf die Ressource zugreifen, zur Liste der Ausnahmen hinzufügen oder die Adresse in den PseudoIDS-Modus (optional ) wechseln , um Ereignisse ohne Blockierung zu erfassen . Aber Sie sollten bei solchen Aktionen immer vorsichtig genug sein.
...
$html = curl_exec($ch);
curl_close($ch);
return json_decode($html,true);
...
json_decode()
nwaf_ip_lm
Mit Nemesida WAF können Sie übrigens nicht nur IP-Adressen, sondern bei Bedarf auch Subnetze hinzufügen.
Fazit
Unabhängig davon, wie gut der Code Ihrer Meinung nach geschrieben ist, verwendet er Eingabefilterfunktionen und spezielle Frameworks wie HTML Purifier, mit denen nicht nur bösartiger Code entfernt werden kann. In den meisten Fällen müssen Sie WAF verwenden, um die Sicherheitsstufe zu erhöhen.
Wenn Sie beabsichtigen, WAF zum ersten Mal zu verwenden, oder wenn Sie es satt haben, endlose Ausschlussregeln hinzuzufügen, empfehlen wir Ihnen, Nemesida WAF Free auszuprobieren. Für den professionellen Einsatz (Blockieren komplexer Angriffe, Brute-Force-Angriffe, SMS-Flooding; Suchen nach Schwachstellen; Vorhandensein eines virtuellen Patch-Systems usw.) ist eine Vollversion von Nemesida WAF mit einem Modul für maschinelles Lernen und einem Schwachstellenscanner erforderlich. Trotzdem ist Nemesida WAF Free für die meisten nicht zielgerichteten Angriffe und Bulk-Scans ein gutes und praktisches Werkzeug.
In dem Artikel habe ich versucht, Situationen aufzudecken, die am häufigsten bei der Verwendung von Lösungen dieser Klasse auftreten. Ich würde mich freuen, wenn Sie sich in den Kommentaren an mehr erinnern.