Kann ich eine TCP-Verbindung unsachgemäß schließen, um einen Denial-of-Service-Angriff abzuschwächen?

Kann ich eine TCP-Verbindung unsachgemäß schließen, um einen Denial-of-Service-Angriff abzuschwächen?

Ich arbeite an einem Webdienst, der das Ziel eines Denial-of-Service-Angriffs sein könnte. Wir haben einige Abwehrmaßnahmen gegen Angriffe im Stil von „SYN Flood“ eingerichtet. Es gibt jedoch auch andere Angriffe auf „Anwendungsebene“ gegen unseren Dienst, bei denen ein böswilliger/defekter Client den Webdienst wiederholt anweisen könnte, aufwändige Aufgaben auszuführen.

Wir können diese missbräuchlichen Clients auf Anwendungsebene identifizieren, also in unseren Serverprozessen. Sobald unser Prozess eine missbräuchliche Clientverbindung identifiziert hat, möchten wir unseren Servicelevel für diesen Client reduzieren.

Eine naive Methode wäre, die TCP-Verbindung mit close(2), shutdown(2), oder Ähnlichem zu beenden. Dann kann der Client jedoch sofort wieder eine Verbindung herstellen (bis zum festgelegten Verbindungslimit pro Sekunde, um SYN-Floods zu mildern), und diese Wiederverbindung ist für uns aufgrund von TLS-Handshakes und anderen Verbindungsaufbaukosten kostspielig. Wir suchen nach einer Möglichkeit, die Interaktion des Clients mit unserem Dienst für eine Weile zu unterbrechen, aber eine saubere Beendigung der TCP-Verbindung schafft dies nicht.

Wenn unser Prozess jedoch die TCP-Verbindung beenden könnte,unsauber, der missbräuchliche Client würde einige Zeit warten müssen, bevor er sich wieder verbindet, was ihm eine „Abkühlphase“ verschafft. Mit „unsauberer Beendigung“ meine ich das Schließen der TCP-Verbindung (beide Hälften des Vollduplex) auf der Serverseite, ohne ein Paket zu senden, FINdas den Client über die Beendigung informiert, und ohne weitere Pakete zu senden, die sich auf diese Verbindung beziehen. Dies würde den Client verzögern, während er davon ausgeht, dass die Verbindung noch in diesem ESTABLISHEDZustand ist (was unter Linux 13-30 Minuten dauert).

Ich sehe jedoch keine Möglichkeit für einen UNIX/Linux-Prozess, eine TCP-Verbindung unsauber zu beenden. close(2)und shutdown(2)ähnliche scheinen alle die Verbindung sauber zu beenden und bieten keine Optionen für eine unsaubere Beendigung.

Gibt es in UNIX/Linux eine Option zur sofortigen, unsauberen Beendigung der TCP-Verbindung, um DOS-Angriffe abzuschwächen?

Antwort1

Sie sollten sich nach einer Firewall umsehen fail2ban. iptablesDiese ist bei Linux-Distributionen noch immer Standard und fail2banfunktioniert mit den meisten Diensten. Sie sollten fail2bandie Überwachung einer bestimmten Protokolldatei mit einem bestimmten Regex-Muster konfigurieren, um zu wissen, wann einer dieser „problematischen“ Clients eine Verbindung herstellt. Anschließend sollten Sie fail2banautomatisch die Firewall-Regel hinzufügen, um die Verbindung entweder zu trennen oder abzulehnen. fail2ban ist konfigurierbar und kann so konfiguriert werden, dass die Firewall-Regel beibehalten wird. Sie können also einen Client für 5 Minuten oder 5 Tage blockieren, ganz wie Sie möchten.

Sie können für diese Art von Dingen auch eine Web Application Firewall (WAF) verwenden.

Was einen DOS-Angriff betrifft, haben Sie je nach Art der Ausführung möglicherweise Pech mit einer lokalen Firewall und müssen sich an Ihren Upstream-Anbieter wenden, um Black-Hole-Routen oder Hosts zu finden, die bekanntermaßen problematisch sind und erhebliche Dienstunterbrechungen verursachen. Es klingt, als wären Sie nicht in einer solchen Lage und müssten nur potenzielle Probleme auf Anwendungsebene umgehen, also ist das übertrieben.

Antwort2

Sobald unser Prozess eine missbräuchliche Clientverbindung identifiziert hat, möchten wir unser Serviceniveau für diesen Client reduzieren.

Da Sie bereits erwähnt haben, dass mit dem Herstellen einer neuen Verbindung Kosten verbunden sind, empfehle ich Ihnen, einen alternativen Ansatz als das Beenden der Verbindung in Betracht zu ziehen. Vielleicht können Sie eine Ratenbegrenzung dieser Verbindung auf 1 Byte pro Minute oder etwas Ähnliches in Betracht ziehen. Mit diesem Ansatz können Sie die Ressourcen eines Angreifers bei minimalen Kosten auf Ihrer Seite weiterhin beschäftigen. Wenn Sie mehr Zeit haben und kreativ sein möchten, leiten Sie alle derartigen Verbindungen auf einen Server in Ihrer Umgebung um, damit andere Server ihr Limit für offene Dateien nicht überschreiten. Wie Andrew erwähnt hat, können Sie auch die Verwendung von fail2ban in Betracht ziehen, sobald Sie bestätigt haben, dass die Verbindung von einem Angreifer stammt und es sicher ist, sie für einige Stunden zu sperren.

verwandte Informationen