- Mitglied seit
- 11 Jul 2007
- Beiträge
- 270
- Punkte für Reaktionen
- 0
- Punkte
- 16
OK, da ist dann ja schon der erwähnte TCP-Wrapper. Welchen benutzt Du denn, das "tcp_wrappers"-Paket aus Freetz?
Welcher SSH-Daemon ist es bei Dir und protokolliert der auch fehlgeschlagene Versuche irgendwo hin? Wenn ja, wo und wie? Ohne entsprechendes Protokoll ist da ein Patch für den SSH-Daemon bei fehlgeschlagenem Login (einen Blacklist-Eintrag erzeugen) ja fast einfacher. Der "dropbear" bietet z.B. m.W. gar keine TCP-Wrapper-Unterstützung von sich aus an, da muß man also ohnehin selbst ran mit einem Ersetzen durch den tcpd.
Das Problem bei solchen Lösungen ist es i.d.R., die Einträge nach einer gewissen Zeit auch wieder verfallen zu lassen, damit man sich nicht versehentlich mal selbst komplett aussperrt.
Ansonsten kannst Du auch erst einmal nur einen "logread -f"-Prozess irgendwo starten und dessen Ausgabe in einen FIFO umleiten. Aus diesem liest dann ein Prozess die Nachrichten des sshd (i.d.R. schon am Prozessnamen zu identifizieren) und erzeugt einen Sperreintrag in der hosts.deny.
Das Problem ist - wie gesagt - das Abräumen verfallener Sperren, ansonsten wächst die Liste "gegen unendlich" und mit einem einzigen /24-Netz kann man Dir schon 256 zu prüfende Adressen vor einem SSH-Verbindungsaufbau unterjubeln. Das dann mit mehreren Subnetzen ausgeführt und Dein Service reagiert auch bei Deinen eigenen Anfragen nicht mehr mit der erwarteten Geschwindigkeit, weil das Prüfen der ACLs zu lange braucht.
Da ist das "Verstecken" des SSH-Servers unter einem nicht-standardisierten Port die bessere Lösung.
Schon ein SSH-Handshake für die Feststellung, daß da ein Zugriff nicht erlaubt ist (also die "pubkey"-Authentifizierung nicht funktioniert, geschweige denn "password"), verlangt der Box sicherlich einiges ab (einfach mal mitstoppen) und das Arsenal der "Schwachstellen-Scanner" aus dem Internet umfaßt sehr selten nur einen einzigen Server mit einer einzigen Adresse.
Wenn man also seinen SSH-Daemon auf Port 22 laufen läßt, lädt man solche Leute praktisch zu einem SSH-(D)DoS-Angriff ein - entweder durch den Prozessoraufwand beim absehbar unnötigen Handshake oder durch den Prozessoraufwand beim Durchforsten einer "hosts.allow" (oder auch "hosts.deny", was SSHGuard aber m.W. ohnehin nicht nutzt), die mehrere tausend Einträge enthält.
Da muß dann wirklich ein Packet-Filter ran und der "log watcher" bzw. der Regelgenerator muß auch so intelligent sein, daß er Zusammenfassungen von sich aus vornimmt. Es ist eben ein Unterschied, ob man 192.168.1.1, 192.168.1.2, usw. einzeln blockt oder gleich 192.168.1.0/24. Ich weiß nicht, wie "sophisticated" der SSHGuard da arbeitet ... aber mangels Packetfilter ist das auch bei einer FRITZ!Box nicht so richtig effektiv.
Das Verstecken des Ports (es muß ja nicht unbedingt 10022 sein, weil sich der so leicht merken läßt, so schlau sind Angreifer inzwischen auch) ist da der effektivere Weg ... jedenfalls nach meiner Erfahrung und wenn man keinen Packetfilter hat. Wenn ich auf meiner FRITZ!Box (mit fester IP, daher eher seltener angegriffen) den SSH-Service auf 22 freigebe, habe ich ab und an mal ein paar fehlgeschlagene SSH-Loginversuche (bei mir allerdings auf einem Service hinter der FRITZ!Box). Verwende ich dafür einen anderen Port, kommt da praktisch nichts ... erstens gehen die meisten Scans gar nicht erst in den Bereich der unprivilegierten Ports und zweitens erkennen die wenigsten Scans dann direkt beim SYN einen SSH-Service, den man mit einem Handshake malträtieren könnte.
Da müsste ich dann nur noch ein script schreiben, das seinen output (fehlgeschlagene Loginversuche) liest und dann Einträge in hosts.deny vornimmt (oder ?).
sshd : /<Pfad>/blist.txt : deny
Dann bleibt der einfachste (und unter Betrachtung des Verhältnisses von Aufwand und Nutzen auch der effektivste) Schutz das "Verstecken" des Ports. Alles andere, was ich dazu geschrieben habe, diente nur der Begründung. Solange Du den Port kennst und ein "Scanner" nicht, ist alles im grünen Bereich.level20peon schrieb:sondern möchte mich lediglich -sowie es der Aufwand noch rechtfertig- ein wenig schützen
Evtl. geht das auch ohne sshguard, wenn der sshd gegen die libwrap gelinkt ist (ldd $(which sshd) | grep -i libwrap)[...]
Dann bleibt der einfachste (und unter Betrachtung des Verhältnisses von Aufwand und Nutzen auch der effektivste) Schutz das "Verstecken" des Ports. Alles andere, was ich dazu geschrieben habe, diente nur der Begründung. Solange Du den Port kennst und ein "Scanner" nicht, ist alles im grünen Bereich.
[...]
Alles andere ist ohne Packetfilter (der ist nun mal an der Stelle genau dafür gedacht und deshalb ziemlich effektiv beim "matching", solange man da nicht - wie oben beschrieben - ein ungünstiges Regelwerk verwendet) nur ungeheurer Aufwand mit sehr geringem Effekt ... als "ich will das aber mal versuchen" vielleicht ein lohnendes Projekt, aber aus dem Blickwinkel der Effizienz ein Alb.
Ist er nicht, wie linke ich ihn denn... würde das denn funktionieren, ohne tcp_wrappers einzubauen ? Wenn ja, wie ?
ssh stream tcp nowait root /sbin/tcpd /usr/sbin/sshd -i -f /var/mod/etc/openssh.conf
Hast Du das schon versucht? Ist die "/etc/hosts.allow" nicht nur ein symlink? Wenn das nicht der Fall ist, dann so anlegen.Außerdem ist mir nicht so ganz klar, wie ich die "/etc/hosts.allow" und "/etc/hosts.deny" anlegen / bearbeiten könnte. Wenn ich sie mit ins image einbaue, sind sie nicht editierbar und wenn ich sie zur Laufzeit anlegen möchte, bekomme ich natürlich den Hinweis auf das "read-only filesystem". Gibt es da einen Trick?