Eine SYN-Flood-Attacke ist eine Art von Denial-of-Service-Angriff (DoS), bei dem ein Angreifer eine große Anzahl von SYN-Anfragen (Synchronize) an einen Zielserver sendet. Diese Anfragen sind der erste Schritt in einem dreiteiligen TCP-Handshake, der für den Aufbau einer TCP-Verbindung notwendig ist. Der Angriff zielt darauf ab, die Ressourcen des Zielservers zu erschöpfen und ihn so daran zu hindern, legitime Verbindungsanfragen zu bearbeiten.
Der TCP-Handshake besteht aus drei Schritten:
SYN: Der Client sendet eine SYN-Anfrage an den Server, um eine neue Verbindung zu initiieren.
SYN-ACK: Der Server antwortet mit einer SYN-ACK-Anfrage, um die Verbindung zu bestätigen.
ACK: Der Client schließt den Handshake ab, indem er eine ACK-Anfrage an den Server sendet.
Bei einer SYN-Flood-Attacke sendet der Angreifer eine Vielzahl von SYN-Anfragen, ohne die letzten beiden Schritte des Handshakes abzuschließen. Der Server hält diese halboffenen Verbindungen in einem Zustand namens SYN-RECV und wartet darauf, dass der Handshake abgeschlossen wird. Da der Server nur eine begrenzte Anzahl dieser halboffenen Verbindungen gleichzeitig verarbeiten kann, führen zu viele SYN-Anfragen dazu, dass der Server keine neuen Verbindungen mehr akzeptieren kann.
Auswirkungen
Die Auswirkungen einer SYN-Flood-Attacke können vielfältig sein:
Verfügbarkeit: Der Zielserver wird unzugänglich, da er keine neuen Verbindungen mehr akzeptieren kann.
Leistung: Die Leistung des Servers wird beeinträchtigt, da er versucht, die große Anzahl von SYN-Anfragen zu bearbeiten.
Ressourcenverbrauch: Der Angriff kann zu einem hohen Ressourcenverbrauch führen, da der Server Speicher und Rechenleistung benötigt, um die halboffenen Verbindungen zu verwalten.
Es gibt verschiedene Maßnahmen, die ergriffen werden können, um sich gegen SYN-Flood-Attacken zu schützen:
SYN-Cookies: Eine Technik, bei der der Server keine Speicherressourcen für halboffene Verbindungen verwendet, sondern stattdessen eine verschlüsselte Antwort sendet, die keine Ressourcen beansprucht.
IP-Blocking: Das Blockieren von IP-Adressen, die eine ungewöhnlich hohe Anzahl von SYN-Anfragen senden.
Rate Limiting: Das Begrenzen der Anzahl gleichzeitiger Verbindungen von einer einzigen IP-Adresse.
Erhöhung der Backlog-Größe: Das Erhöhen der Anzahl von halboffenen Verbindungen, die der Server verarbeiten kann, um die Auswirkungen des Angriffs zu mildern.
Die Punkte syncookies und Backlog sind leicht umzusetzen.
/etc/sysctl.conf :
# Uncomment the next two lines to enable Spoof protection (reverse-path filter)
# Turn on Source Address Verification in all interfaces to
# prevent some spoofing attacks
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.all.rp_filter=1
# syncookies einschalten
net.ipv4.tcp_syncookies = 1
# Backlog stand auf 1280
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_retries2 = 5
Hiemit kann man über einen längeren Zeitraum Daten sammeln und die verdächtigen Ports beobachten:
Monitoring die Verbindungen auf den Webserverports
Script: watch-syn_monitor.sh
Diese Regel limitiert die Anzahl der gleichzeitigen Verbindungen von einer einzigen IP-Adresse, Port 8009 auf 40. Wenn eine IP-Adresse versucht, mehr als 40 Verbindungen gleichzeitig zu öffnen, werden die zusätzlichen Verbindungen abgelehnt.
# Regel zum Loggen der abgewiesenen Verbindungen
iptables -A INPUT -p tcp --syn --dport 8009 -m connlimit --connlimit-above 40 -j LOG --log-prefix "ConnLimit 8009: " --log-level 4
# Regel zum Ablehnen der Verbindungen
iptables -A INPUT -p tcp --syn --dport 8009 -m connlimit --connlimit-above 40 -j REJECT --reject-with tcp-reset
Zum herantesten:
iptables -A INPUT -p tcp --syn --dport 8009 -m connlimit --connlimit-above 15 -j LOG --log-prefix "test15Limit 8009: " --log-level 4
#iptables -A INPUT -p tcp --syn --dport 8009 -m connlimit --connlimit-above 20 -j LOG --log-prefix "test20Limit 8009: " --log-level 4
#und mit grep testen
grep -c "test15Limit" /var/log/syslog
grep -c "test20Limit" /var/log/syslog
für die confluence Seite:
a2enmod ratelimit
<Location "/">
SetOutputFilter RATE_LIMIT
SetEnv rate-limit 600
SetEnv rate-initial-burst 700
</Location>
Zum Erstellen und Auswerten der SYN LOG Regeln habe ich mir 2 Scripte geschrieben, die ich hier zur Verfügung stelle.
Anzahl der SYN in 2 hours ago begrenzt auf die test10Limit Log Regeln.
_______________________
Anzahl Port
12408 8009
1037 80
548 443
(Ausschnitt)
In /etc/apache2/apache2.conf
KeepAliveTimeout auf 3
gesetzt (war 5)
Das Setzen von KeepAliveTimeout auf 3 Sekunden hat dazu beigetragen,
dass Apache-Worker schneller freigegeben werden.
Die vorgenommenen Änderungen in den sysctl-Parametern haben
wahrscheinlich auch dazu beigetragen, die Netzwerkperformance zu verbessern.
Die connlimit-Regel auf Port 8009 hat vermutlich dazu beigetragen,
die Anzahl gleichzeitiger Verbindungen zu begrenzen und die Last auf
dem Server zu reduzieren.