Wie aktiviere ich den DDoS-Schutz?

82

DDoS (Distributed Denial of Service Attacks) werden im Allgemeinen auf Serverebene blockiert, oder?

Gibt es eine Möglichkeit, es auf PHP-Ebene zu blockieren oder zumindest zu reduzieren?

Wenn nicht, was ist der schnellste und häufigste Weg, um DDoS-Angriffe zu stoppen?

Coderama
quelle
Besser aus dem Nichts mit, hier gibt es eine Liste von Apache - Modulen das könnte möglicherweise helfen. Es scheint jedoch nicht sehr reich zu sein, und die zwei Projekte von vier (wie von 'dos' gesucht) scheinen auf nichts zu verweisen.
Audrius Meskauskas
Etwas wie das? mod-antiloris.sourceforge.net
K-Gun
Ein DDOS ist erfolgreich, wenn das System nicht mehr alle Anforderungen verarbeiten kann, die der Angriff auf ihn wirft. Wenn Sie Ihrer Anwendung Code hinzufügen, der jede Anforderung auf "Ist dies ein DDOS-Angriff" überprüft, schadet dieser Code tatsächlich mehr als er nützt, da für jede Anforderung nur ein wenig mehr Ressourcen benötigt werden. Dies würde nur in einer sehr restriktiven Umgebung funktionieren, in der anonyme Anfragen ohnehin nicht zulässig sind.
Hugo Delsing

Antworten:

188

DDOS ist eine Familie von Angriffen, die wichtige Systeme im Rechenzentrum überfordern, darunter:

  • Die Netzwerkverbindung des Hosting-Centers zum Internet
  • Das interne Netzwerk und die Router des Hosting Centers
  • Ihre Firewall und Load Balancer
  • Ihre Webserver, Anwendungsserver und Datenbank.

Überlegen Sie sich vor dem Aufbau Ihrer DDOS-Verteidigung, wie hoch der Value-at-Risk im schlimmsten Fall ist. Für einen unkritischen, kostenlos nutzbaren Dienst für eine kleine Gemeinde kann der gesamte gefährdete Wert Erdnüsse sein. Für ein kostenpflichtiges, öffentlich zugängliches, unternehmenskritisches System für ein etabliertes Unternehmen mit mehreren Milliarden Dollar könnte der Wert der Wert des Unternehmens sein. In diesem letzteren Fall sollten Sie StackExchange nicht verwenden :) Um sich gegen DDOS zu verteidigen, benötigen Sie einen detaillierten Verteidigungsansatz:

  1. Arbeiten Sie mit Ihrem Hosting-Center zusammen , um die von ihnen angebotenen Dienste zu verstehen, einschließlich IP- und Port-Filterung bei ihren Netzwerkverbindungen zum Internet und den von ihnen angebotenen Firewall-Diensten. Dies ist von entscheidender Bedeutung: Viele Websites werden vom Hosting-Unternehmen aus dem Internet abgerufen, da das Hosting-Unternehmen die durch das DDOS verursachte Störung des Rechenzentrums für einen Kunden behandelt. Während eines DDOS-Angriffs arbeiten Sie außerdem sehr eng mit den Mitarbeitern des Hosting-Centers zusammen. Kennen Sie daher deren Notrufnummern und stehen Sie in einem guten Verhältnis zu ihnen :) Sie sollten in der Lage sein, ganze internationale Regionen zu blockieren, bestimmte Dienste oder Netzwerke vollständig zu blockieren Protokolle und andere Breitband-Abwehrmaßnahmen oder alternativ nur IPs auf der Whitelist (abhängig von Ihrem Geschäftsmodell)
  2. Verwenden Sie im Hosting Center ein Content Delivery Network , um (hauptsächlich statische) Dienste in der Nähe Ihrer Endbenutzer zu verteilen und Ihre realen Server vor den DDOS-Architekten zu verbergen. Das vollständige CDN ist zu groß, als dass ein DDOS alle Knoten in allen Ländern entfernen könnte. Wenn sich das DDOS auf ein Land konzentriert, sind zumindest andere Benutzer noch in Ordnung.
  3. Halten Sie alle Ihre Systeme und Softwarepakete mit den neuesten Sicherheitspatches auf dem neuesten Stand - und ich meine alle:

    • Verwaltete Switches - diese müssen manchmal aktualisiert werden
    • Router
    • Firewalls
    • Load Balancer
    • Betriebssysteme
    • Webserver
    • Sprachen und ihre Bibliotheken
  4. Stellen Sie sicher, dass Sie eine gute Firewall oder Security Appliance eingerichtet und regelmäßig von einem qualifizierten Sicherheitsexperten überprüft haben . Starke Regeln für die Firewall sind eine gute Verteidigung gegen viele einfache Angriffe. Es ist auch nützlich, die für jeden offenen Dienst verfügbare Bandbreite verwalten zu können.

  5. Verfügen Sie über gute Tools zur Netzwerküberwachung - dies kann Ihnen helfen, Folgendes zu verstehen:

    • Dass Sie angegriffen werden und nicht nur unter schwerer Last stehen
    • Woher der Angriff kommt (einschließlich Ländern, mit denen Sie normalerweise keine Geschäfte machen) und
    • Was der Angriff tatsächlich ist (Ports, Dienste, Protokolle, IPs und Paketinhalte)
  6. Der Angriff kann einfach darin bestehen, dass legitime Website-Dienste häufig verwendet werden (z. B. "legale" URIs, die Abfragen ausführen oder Daten einfügen / aktualisieren / löschen) - Tausende oder Millionen von Anfragen, die von zehn bis Millionen verschiedener IP-Adressen kommen, bringen eine Website auf ihre Website Knie. Alternativ kann die Ausführung einiger Dienste so teuer sein, dass nur wenige Anforderungen ein DOS verursachen - denken Sie an einen wirklich teuren Bericht. Sie benötigen also eine gute Überwachung auf Anwendungsebene, um zu sehen, was gerade passiert:

    • Welche Dienste wurden aufgerufen und welche Argumente / Daten werden gesendet (dh Anmeldung in Ihrer Anwendung)?
    • Welche Benutzer rufen auf und von welchen IPs (dh Sie melden sich in Ihrer Anwendung an)
    • Welche Abfragen und Einfügungen / Aktualisierungen / Löschungen die Datenbank ausführt
    • Lastdurchschnitt, CPU-Auslastung, Festplatten-E / A, Netzwerkverkehr auf allen Computern (und VMs) in Ihrem System
    • Stellen Sie sicher, dass alle diese Informationen leicht abrufbar sind und dass Sie Protokolle von verschiedenen Computern und Diensten korrelieren können (dh stellen Sie sicher, dass alle Computer mit ntp zeitsynchronisiert sind).
  7. Sinnvolle Einschränkungen und Grenzen in Ihrer Anwendung . Zum Beispiel könnten Sie:

    • Verwenden Sie eine QoS-Funktion im Load Balancer, um alle anonymen Sitzungen an separate Anwendungsserver in Ihrem Cluster zu senden, während angemeldete Benutzer einen anderen Satz verwenden. Dies verhindert, dass ein anonymes DDOS auf Anwendungsebene wertvolle Kunden herausnimmt
    • Verwendung eines starken CAPCHA zum Schutz anonymer Dienste
    • Sitzungszeitlimits
    • Haben Sie ein Sitzungs- oder Ratenlimit für bestimmte Arten von Anforderungen wie Berichte. Stellen Sie sicher, dass Sie den anonymen Zugriff bei Bedarf deaktivieren können
    • Stellen Sie sicher, dass ein Benutzer die Anzahl der gleichzeitigen Sitzungen begrenzt hat (um zu verhindern, dass sich ein gehacktes Konto millionenfach anmeldet).
    • Haben Sie unterschiedliche Benutzer von Datenbankanwendungen für unterschiedliche Dienste (z. B. Transaktionsnutzung oder Berichtsnutzung) und verwenden Sie die Datenbankressourcenverwaltung, um zu verhindern, dass eine Art von Webanforderung alle anderen überfordert
    • Wenn möglich, machen Sie diese Einschränkungen dynamisch oder zumindest konfigurierbar. Auf diese Weise können Sie während eines Angriffs aggressive temporäre Grenzwerte festlegen (den Angriff drosseln), z. B. nur eine Sitzung pro Benutzer und keinen anonymen Zugriff. Dies ist sicherlich nicht gut für Ihre Kunden, aber viel besser, als überhaupt keinen Service zu haben.
  8. Zu guter Letzt schreiben Sie ein DOS-Reaktionsplandokument und lassen es von allen relevanten Parteien intern überprüfen: Unternehmen, Management, dem SW-Entwicklerteam, dem IT-Team und einem Sicherheitsexperten. Der Prozess des Schreibens des Dokuments veranlasst Sie und Ihr Team, die Probleme zu durchdenken und sich darauf vorzubereiten, dass das Schlimmste an Ihrem freien Tag um 3 Uhr morgens eintreten sollte. Das Dokument sollte (unter anderem) Folgendes abdecken:

    • Was ist gefährdet und die Kosten für das Unternehmen
    • Maßnahmen zum Schutz der Vermögenswerte
    • Wie ein Angriff erkannt wird
    • Das geplante Reaktions- und Eskalationsverfahren
    • Prozesse, um das System und dieses Dokument auf dem neuesten Stand zu halten

Abgesehen von der Präambel gibt es hier einige spezifische Antworten:

DDOS werden in der Regel auf Serverebene blockiert, oder?

Nicht wirklich - die meisten der schlimmsten DDOS-Angriffe sind auf niedriger Ebene (auf IP-Paketebene) und werden von Routing-Regeln, Firewalls und Sicherheitsgeräten behandelt, die für DDOS-Angriffe entwickelt wurden.

Gibt es eine Möglichkeit, es auf PHP-Ebene zu blockieren oder zumindest zu reduzieren?

Einige DDOS-Angriffe richten sich an die Anwendung selbst und senden gültige URIs und HTTP-Anforderungen. Wenn die Anzahl der Anforderungen steigt, haben Ihre Server Probleme und Sie haben einen SLA-Ausfall. In diesem Fall gibt es Dinge, die Sie auf PHP-Ebene tun können:

  • Überwachung auf Anwendungsebene: Stellen Sie sicher, dass jeder Dienst / jede Seite Anforderungen so protokolliert, dass Sie sehen können, was gerade passiert (damit Sie Maßnahmen ergreifen können, um den Angriff abzuwehren). Einige Ideen:

    • Verfügen Sie über ein Protokollformat, das Sie problemlos in ein Protokolltool (oder Excel oder ähnliches) laden und mit Befehlszeilentools (grep, sed, awk) analysieren können. Denken Sie daran, dass ein DDOS Millionen von Protokollzeilen generiert. Sie müssen wahrscheinlich Ihre Protokolle in Scheiben schneiden (insbesondere in Bezug auf URI, Zeit, IP und Benutzer), um herauszufinden, was vor sich geht, und müssen Daten generieren wie:

      • Auf welche URIs wird zugegriffen?
      • Welche URIs versagen mit hoher Rate (ein wahrscheinlicher Indikator für die spezifischen URIs, die die Angreifer angreifen)
      • Welche Benutzer greifen auf den Dienst zu?
      • Von wie vielen IPs greift jeder Benutzer auf den Dienst zu?
      • Auf welche URIs greifen anonyme Benutzer zu?
      • Welche Argumente werden für einen bestimmten Dienst verwendet?
      • Überwachen Sie die Aktionen eines bestimmten Benutzers
    • Protokollieren Sie die IP-Adresse jeder Anforderung. Machen Sie DNS NICHT rückgängig - ironischerweise erleichtern die Kosten dafür ein DDOS für die Angreifer

    • Protokollieren Sie die gesamte URI- und HTTP-Methode, z. B. "GET http://example.com/path/to/service?arg1=ddos ".
    • Protokollieren Sie die Benutzer-ID, falls vorhanden
    • Protokollieren Sie wichtige HTTP-Argumente
  • Sinnvolle Ratenbeschränkungen: Sie können Beschränkungen für die Anzahl der Anforderungen festlegen, die eine bestimmte IP oder ein bestimmter Benutzer in einem bestimmten Zeitraum stellen kann. Könnte ein legitimer Kunde mehr als 10 Anfragen pro Sekunde stellen? Können anonyme Benutzer überhaupt auf teure Berichte zugreifen?

  • CAPTCHA für anonymen Zugriff: Implementieren Sie ein CAPTCHA für alle anonymen Anforderungen, um zu überprüfen, ob der Benutzer eine Person und kein DDOS-Bot ist.

Was ist der schnellste und häufigste Weg, um DDOS-Angriffe zu stoppen?

Am schnellsten ist es wahrscheinlich, der Erpressung nachzugeben, obwohl dies möglicherweise nicht wünschenswert ist.

Andernfalls müssen Sie sich zuerst an Ihren Hosting- und / oder CDN-Anbieter wenden und mit ihm zusammenarbeiten (wenn er Sie nicht kontaktiert hat und Sie bereits gefragt hat, was zum Teufel los ist ...). Wenn ein DDOS auftritt, wirkt es sich wahrscheinlich auf andere Kunden des Hosting-Anbieters aus, und der Anbieter steht möglicherweise unter erheblichem Druck, Ihre Website einfach zum Schutz ihrer Ressourcen herunterzufahren. Seien Sie bereit, Ihre Protokolle (alle Informationen) mit dem Anbieter zu teilen. Diese Protokolle können zusammen mit ihren Netzwerkmonitoren zusammen genügend Informationen liefern, um den Angriff zu blockieren / abzuschwächen.

Wenn Sie ein DDOS erwarten, ist es eine sehr gute Idee, Ihren Hosting-Anbieter für das Schutzniveau zu qualifizieren, das er bieten kann. Sie sollten über DDOS-Erfahrung und Tools verfügen, um dies zu vermeiden. Verstehen Sie ihre Tools, Prozesse und Eskalationsverfahren. Fragen Sie auch, welche Unterstützung der Hosting-Anbieter von seinen Upstream-Anbietern hat. Diese Dienstleistungen können höhere Vorab- oder monatliche Kosten bedeuten, behandeln dies jedoch als Versicherungspolice.

Während Sie angegriffen werden, müssen Sie Ihre Protokolle greifen und abbauen - versuchen Sie, das Muster des Angriffs herauszufinden. Sie sollten in Betracht ziehen, den anonymen Zugriff auszuschalten und die angegriffenen Dienste zu drosseln (dh das Ratenlimit der Anwendung für den Dienst zu verringern).

Wenn Sie Glück haben und einen kleinen, festen Kundenstamm haben, können Sie möglicherweise die gültigen IP-Adressen Ihrer Kunden ermitteln. In diesem Fall können Sie für kurze Zeit zu einem White-List-Ansatz wechseln. Stellen Sie sicher, dass alle Ihre Kunden wissen, dass dies geschieht, damit sie anrufen können, wenn sie von einer neuen IP aus zugreifen müssen :)


Doug McClean hat einige gute Ratschläge unter: https://stackoverflow.com/a/1029613/1395668

Andrew Alcock
quelle
20

Nach dem PHP-Teil der Frage;

Obwohl ich mich hier nicht auf PHP verlasse, könnte es implementiert werden, muss aber all diese Möglichkeiten oder mehr berücksichtigen.

  1. Der Angreifer kann die IP für jede Anforderung ändern
  2. Der Angreifer kann Parameter an URI übergeben, deren Zielsite diese Parameter nicht interessiert.
  3. Der Angreifer kann die Sitzung vor Ablauf neu starten ...

Einfaches Pseudo;

<?php
// Assuming session is already started
$uri = md5($_SERVER['REQUEST_URI']);
$exp = 3; // 3 seconds
$hash = $uri .'|'. time();
if (!isset($_SESSION['ddos'])) {
    $_SESSION['ddos'] = $hash;
}

list($_uri, $_exp) = explode('|', $_SESSION['ddos']);
if ($_uri == $uri && time() - $_exp < $exp) {
    header('HTTP/1.1 503 Service Unavailable');
    // die('Easy!');
    die;
}

// Save last request
$_SESSION['ddos'] = $hash;
?>
K-Gun
quelle
8

Die PHP-Ebene ist zu spät in der Anforderungskette.

Es kann eine gute Option für Sie sein, Ihren Apache-Server hinter eine Open Source-Appliance zu stellen.

http://tengine.taobao.org/ enthält einige Dokumentationen und Quellcode. Weitere Module zur DDOS-Prävention. Es ist eine Erweiterung von Nginx, sodass Sie es problemlos als Reverse-Proxy für Ihre Apache-Instanz einrichten können.

Unter: http://blog.zhuzhaoyuan.com/2012/01/a-mechanism-to-help-write-web-application-firewalls-for-nginx/ erfahren Sie, wie Sie Kollisionen mit DoS-Angriffen bekämpfen können.

Völlig vergessen, http://www.cloudflare.com ist eine der besten kostenlosen Webanwendungs-Firewalls. Sie haben kostenlose und kostenpflichtige Pläne und werden Ihren Arsch vor DDOS retten. Wir verwenden sie für viele unserer stark frequentierten Websites, nur wegen ihrer Caching-Funktionen . Es ist großartig!

j_mcnally
quelle
5

Sie können dies nicht in PHP-Ebene tun. DDOS ist eine Art Angriff, der zu viele Anfragen an Ihren Webserver sendet. Ihr Webserver lehnt eine Anfrage ab, bevor er Ihr PHP-Skript aufruft.

Wenn Sie Apache verwenden, finden Sie hier einige Tipps von Apache: http://httpd.apache.org/docs/trunk/misc/security_tips.html

ndlinh
quelle
5

DDoS wird am besten von sehr teuren, speziell entwickelten Netzwerkgeräten verarbeitet. Hosts sind im Allgemeinen nicht in der Lage, DDoS-Schutz zu leisten, da sie einer relativ geringen Leistung, Erschöpfung des Zustands, begrenzter Bandbreite usw. unterliegen. Die Verwendung von iptables, Apache-Mods und ähnlichen Diensten kann in einigen Situationen hilfreich sein, wenn Sie keinen Zugriff auf DDoS-Schadensbegrenzungshardware haben oder ein DDoS-Schadensbegrenzungsdienst, der jedoch alles andere als ideal ist und Sie dennoch einem Angriffsrisiko aussetzt.

Ryan
quelle
8
Wir brauchen eine Lösung, und wenn es keine ideale Lösung gibt, brauchen wir Teillösungen. Niemand braucht einen Ratschlag "Sie können das einfach nicht".
Audrius Meskauskas
5

Wie wäre es mit so etwas auf PHP-Seite:

//if user does not change IP, then ban the IP when more than 10 requests per second are detected in 1 second
$limitps = 10;
if (!isset($_SESSION['first_request'])){
    $_SESSION['requests'] = 0;
    $_SESSION['first_request'] = $_SERVER['REQUEST_TIME'];
}
$_SESSION['requests']++;
if ($_SESSION['requests']>=10 && strtotime($_SERVER['REQUEST_TIME'])-strtotime($_SESSION['first_request'])<=1){
    //write the IP to a banned_ips.log file and configure your server to retrieve the banned ips from there - now you will be handling this IP outside of PHP
    $_SESSION['banip']==1;
}elseif(strtotime($_SERVER['REQUEST_TIME'])-strtotime($_SESSION['first_request']) > 2){
    $_SESSION['requests'] = 0;
    $_SESSION['first_request'] = $_SERVER['REQUEST_TIME'];
}

if ($_SESSION['banip']==1) {
    header('HTTP/1.1 503 Service Unavailable');
    die;
}
NVG
quelle
1
Es gibt einige Fehler in diesem Code: 10 ist fest codiert, strtotime wird in den Server- und Sitzungsvariablen nicht benötigt und $ _SESSION ['ban_up'] == 1 sollte = 1 sein.
Jason Silver
2

Verwenden Sie KEINEN PHP-basierten Schutz, er ist schrecklich und hat kaum Auswirkungen! Konfigurieren Sie Ihren Webserver mithilfe des Moduls limit_req ( http://nginx.org/en/docs/http/ngx_http_limit_req_module.html ) für Ratenlimitanforderungen, z. B. in Nginx.

Ich würde zwar empfehlen, CloudFlare zur Bekämpfung von Layer-4-Angriffen zu verwenden - jedoch keine Layer-7-basierten Angriffe, es sei denn, Sie sind bereit zu zahlen.

JustLloyd
quelle
Ja, hat auch für mich super funktioniert, meine Erfahrung hier softwareengineeringsolutions.co.uk/…
Elvis Ciotti
2

DDOS werden im Allgemeinen auf Serverebene blockiert. Aktivieren Sie den DDOS-Schutz auf Serverebene. Bitte überprüfen Sie die folgenden Hinweise zum DDOS-Schutz.

Konfigurationseinstellungen für Apache HTTP Server, mit denen DDOS-Probleme vermieden werden können:

Mit der Direktive RequestReadTimeout kann die Zeit begrenzt werden, die ein Client zum Senden der Anforderung benötigt.

Warten Sie 10 Sekunden, um die Anforderung einschließlich der Header zu empfangen, und 30 Sekunden, um den Anforderungstext zu empfangen:

RequestReadTimeout header=10 body=30

Warten Sie mindestens 10 Sekunden, um den Anforderungshauptteil zu erhalten. Wenn der Client Daten sendet, erhöhen Sie das Zeitlimit für jeweils 1000 empfangene Bytes um 1 Sekunde, ohne Obergrenze für das Zeitlimit (mit Ausnahme des indirekt von LimitRequestBody angegebenen Limits):

RequestReadTimeout body=10,MinRate=1000

RequestReadTimeout header=10-30,MinRate=500
RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500

Die KeepAliveTimeout-Direktive kann auch auf Websites gesenkt werden, die DoS-Angriffen ausgesetzt sind. Einige Websites schalten die Keepalives sogar vollständig über KeepAlive aus, was natürlich auch andere Leistungseinbußen mit sich bringt. Die Werte verschiedener Timeout-bezogener Anweisungen, die von anderen Modulen bereitgestellt werden, sollten überprüft werden.

Die Anweisungen LimitRequestBody, LimitRequestFields, LimitRequestFieldSize, LimitRequestLine und LimitXMLRequestBody sollten sorgfältig konfiguriert werden, um den durch Client-Eingaben ausgelösten Ressourcenverbrauch zu begrenzen. Optimieren Sie die MaxRequestWorkers-Direktive, damit der Server die maximale Anzahl gleichzeitiger Verbindungen verarbeiten kann, ohne dass die Ressourcen ausgehen.

Raja Rama Mohan Thavalam
quelle
1

Anti-DDOS- Schritte:

  • Das allererste wichtige ist, zuerst den ddos-Angriff zu identifizieren. Wenn Sie den ddos-Angriff früher erkennen, ist dies für Ihren Server besser.
  • Bessere Bandbreite für Ihren Server verfügbar machen. Behalten Sie immer mehr als genug Bandbreite bei, die für Ihren Server erforderlich ist. Dies verhindert keinen DDOS-Angriff, dauert jedoch länger. Dadurch erhalten Sie etwas mehr Zeit zum Handeln.
  • Wenn Sie einen eigenen Webserver besitzen, können Sie die Netzwerkparameter verteidigen, indem Sie die Rate Ihres Routers begrenzen, Filter hinzufügen, um Pakete an verschiedene Angriffsquellen zu senden, und halb geöffnete Verbindungen aggressiver zeitlich festlegen. Stellen Sie auch niedrigere SYN-, ICMP- und UDP-Flood-Drop-Schwellenwerte ein.
  • Wenn Sie nicht viel über diese Dinge wissen, wenden Sie sich schnell an Ihren Hosting-Anbieter. Sie können ihr Bestes geben, um die DDOS-Angriffe zu verhindern.
  • Es gibt auch einen speziellen DDOS-Minderungsdienst, der von Cloudflare und vielen anderen Unternehmen bereitgestellt wird . Damit können sie Ihnen helfen, die DDOS-Angriffe zu verhindern. Auch viele Unternehmen bieten günstigen ddos Schutz und dos Schutz an .
Ich bin ein Anfänger
quelle