Zusammenfassung
Das Ausführen eines Tarpits auf einem Allzweckserver birgt Risiken. Wenn Sie wissen, welche Risiken bestehen, können Sie diese je nach Komfort verringern.
- Sie müssen sicherstellen, dass Sie Ihren Server nicht versehentlich mit Tarpit-Verkehr DOS
- Sie müssen sicherstellen, dass Sie Ihre Statustabellen mit tarpitted Verbindungsinformationen füllen
- Sie müssen sicherstellen, dass Sie Ihre Protokolle nicht mit Tarpit-Verbindungsinformationen überfluten
- Sie müssen sicherstellen, dass eine lange schwarze Liste die Leistung nicht beeinträchtigt
- Sie müssen sicherstellen, dass Ihre Blacklist Hosts automatisch abläuft
- Sie müssen in der Lage sein, Hosts auf die Whitelist zu setzen (entweder permanent oder zeitlich begrenzt).
Zum Glück ist dies alles möglich und mit normalen iptables und ipset recht einfach.
Begrenzung der TARPIT-Ressourcennutzung
Sie können iptables verwenden, um die Anzahl der Hosts zu begrenzen, die Sie TARPITEN, ohne zu viele Systemressourcen zu verwenden. Siehe Beispiel unten. Dies umfasst Netzwerkbandbreite, Systemspeicher, statusstabile Einträge und andere Systemressourcen. Holen Sie sich zu viele Tarpitted-Verbindungen und ignorieren Sie sie. Wenn Sie Ihren Regelsatz in der richtigen Reihenfolge organisieren, landet keine der tarpitierten Verbindungen in Ihren Statustabellen. Stellen Sie außerdem sicher, dass Sie nicht protokollieren, es sei denn, Sie erstellen Echtzeitstatistiken mit einem benutzerdefinierten ulog - Direct iptables-Tarpit-Protokolle können eine Festplatte schnell füllen.
Nach meiner Erfahrung können meine aktuellen Hosts problemlos mehr als 200 Hosts in einem Tarpit speichern, ohne dass sich dies merklich auf die Speichernutzung, die Verkehrsnutzung oder die CPU-Auslastung auswirkt. Wahrscheinlich könnte ich das weiter vorantreiben, aber bisher bin ich im Durchschnitt nur ungefähr 130 Hosts in einem bestimmten Moment gefangen.
Der Grund, warum ich die Grenzwerte implementiert habe, war, wie in einem anderen Vorschlag angegeben, weil mein erster Tarpit-Host überflutet wurde. Dies war eine triviale Problemumgehung. Ich habe seitdem keine Probleme mehr gehabt.
Verwenden von ipset für effiziente Blacklists
ipset ist ein großartiges kleines Tool, mit dem Sie Gruppen von Objekten erstellen können, die in iptables-Regeln verwendet werden. Nicht nur das, sondern da es die Objekte in einer Hash-Tabelle enthalten kann, ist es umso schneller, je größer das ipset ist, verglichen mit dem entsprechenden linearen Satz von iptables-Regeln.
Darüber hinaus können die Listen Zähler (Pakete / Bytes), Zeitlimit und Ausschluss pro Objekt enthalten.
Sie können ipset mit den meisten automatisch blockierenden Programmen hinzufügen / entfernen, z. B. fail2ban, ossec und mehr. Da Sie ein Standardzeitlimit festlegen können, können Sie sicherstellen, dass Einträge abgelaufen sind, unabhängig davon, welches Programm den Eintrag festgelegt hat.
Beispiel
Hier ist ein Beispiel basierend auf meiner Verwendung auf von mir verwalteten Servern, das die oben aufgeführten Risiken mindert:
Vorbehalt
### Note: This does not account for all possible traffic you might need or want
### This is only an example of mitigating common risks of using a tarpit
### Use at your own risk
Ipset konfigurieren
# Create the ipset blacklist
# options:
# - create : create a new ipset
# - blacklist : Name of the ipset we'll reference in the iptables rule
# - hash:net : Make blacklist type hash to hold network (ip/mask) data
# - family inet : This is for IPv4 data (inet6 for IPv6)
# - counters : We want packet/byte stats counted for each entry
# - comment : So we can add a comment with each entry (handy)
# - timeout 604800 : Set a default timeout of 604800 seconds (1 week) for each new entry
# - nomatch : Allow us to enter exclusion entries (never match an entry)
ipset create blacklist hash:net family inet counters comment timeout 604800 nomatch
# Create an entry to never blacklist a trusted network
# options:
# - timeout 0 : entry never expires
# - nomatch : Tells IPset to never match this entry (whitelist, in our usage)
ipset add blacklist 123.45.67.0/24 comment "Trusted subnet, causes breakage if blocked" timeout 0 nomatch
# Example to blacklist hosts
# no netmask implies /32 (or /128 for ipv6)
ipset add blacklist 34.56.78.90 comment "SSH Bruteforce"
ipset add blacklist 23.45.67.89 comment "SQL Injection" timeout 12345
# etc...
Iptables konfigurieren
# Flush the input table
iptables -F INPUT
# Drop the custom flow TAR
iptables -X TAR
# Set default INPUT policy to DROP
iptables -P INPUT DROP
# Create the chain TAR
iptables -N TAR
# Send all blacklisted hosts to the tarpit
iptables -A INPUT -m set --match-set blacklist src -j TAR
# Allow established connections
# Note: after the blacklist so newly blacklisted threats are immediately ignored
# Yes, that will cause the server to hold the state open until it times out.
# Would you rather have a malicious host continuing its attack?
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# Allow the services we want
# Note: These create new state table entries/use up memory
# Note: We do not account for synflood prevention in this example
iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -m tcp --syn -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT
# Send everything else to tarpit chain
iptables -A INPUT -j TAR
# This is the tarpit chain
# Tarpit up to 10 unique connections a second, any more, and pass to next rule
# Note: 10/s limit is arbitrary, adjust to your preference (experiment)
iptables -A TAR -p tcp -m limit --limit 10/sec -j TARPIT --tarpit
# Drop everything else that makes it this far
# You can also set to REJECT which will immediately tell all connections to buzz off
iptables -A TAR -j DROP
Betrachtet gefangene Hosts in Echtzeit
$ sudo tcpdump -npi eth0 'src YOUR.HOST.IP and (tcp[14] = 0 && tcp[15] = 0)'