Wie du dich sicherlich erinnerst, haben wir im Kapitel "SSH anpassen" den Standard-SSH-Port geändert, um Angreifern das Auffinden des SSH-Ports zu erschweren.

Jetzt richten wir unsere Firewall so ein, dass diese vermehrte Anmeldeversuche von einer bestimmten IP-Adresse verhindert, indem sie diese erkennt und blockt. Mit Hilfe des Tools "expiretable" werden wir die Tabelle, die die geblockten IPs enthält, wieder leeren, da der Angriff ja evtl. von einer dynamischen IP gekommen sein kann. 

  1. Zunächst ändern wir unsere '/etc/pf.conf' und tragen legen die Tabelle <bruteforce> an. Die Erweiterung persistbewirkt, dass die Tabelle bestehen bleibt, auch wenn keine Einträge in ihr vorhanden sind. pf löscht die Tabelle nämlich sonst um Speicherplatz zu sparen und das wollen wir ja in diesem Fall nicht:

    table <bruteforce> persist

  2. Nachdem die Tabelle nun angelegt ist, fügen wir relativ weit oben die Regel ein, dass alle IP-Adressen in der Tabelle <bruteforce> geblockt werden:

    block quick from <bruteforce>

  3. Darunter fügen wir folgende Regel ein, sodass alle anderen die durch das 'block quick' geblockt wurden, weiter verarbeitet werden (kein Zeilenumbruch!):

    pass in on $if proto tcp from any to any port $tcp_pass \
    flags S/SA keep state (max-src-conn 100, max-src-conn-rate 15/5, \
    overload <bruteforce> flush global)

    • flags S/SA: es werden nur SYN- und ACK-Flags geachtet werden
    • max-src-conn 100: es dürfen maximal 100 Verbindungen von einem Host gleichzeitig aufgebaut werden (selbst anpassen)
    • max-src-conn-rate 15/5: es dürfen höchstens 15 Verbindungen alle 5 Sekunden aufgebaut werden (selbst anpassen)
    • overload <bruteforce>: alle Hosts die dieses Limit überschreiten werden in die Tabelle <bruteforce> eingetragen
    • flush global: flush bedeutet, dass alle Verbindungen von diesem Host getrennt werden; global bewirkt, dass Verbindungen dieses Hosts, die anderen Regeln entsprechen, auch beendet werden (empfehlenswert)
  4. Nachdem du die pf.conf neu eingelesen hast, erhält ein Angreifer nun bei Überschreiten des Limits die Fehlermeldung "Fatal: timeout before authentication" und das wollten wir erreichen. Er kann also nicht einmal probieren sich anzumelden.

  5. Soweit so gut, jetzt wollen wir aber aus oben genannten Gründen die gesperrten Adressen nach 24 Stunden wieder freigeben. Hierfür benutzen wir das Tool "expiretable". Dieses ist in den Ports und kann per

    # cd /usr/ports/security/expiretable/ && make install clean

    installiert werden.
    In unsere /etc/rc.conf tragen wir also folgende Zeile ein, sodass das Tool beim Systemstart gesartet und als Daemon im Hintergrund läuft:

    expiretable_enable="YES"
    expiretable_flags="-v -d -t 24h bruteforce"