misterunknown: fail2ban: User-Regeln für Apache

Moin,

seit einiger Zeit steht mein vServer immer wieder unter Beschuss. Irgendwelche Bots versuchen mit irgendwelchen Zugangsdaten sowohl per SSH Zugriff zu erhalten als auch Zugriff auf Webseiten durch probieren bekannter URLs. Zur Abwehr solcher Angriffe habe ich fail2ban laufen, ein Service der die Log-Dateien durchforstet, Angriffe erkennt und die entsprechenden IPs bannt.
Allerdings wird im Bezug auf den Apache nur die Datei "error.log" ausgewertet. Das ergibt erstmal Sinn, denn normale Zugriffe sind ja ok. Es gibt aber auch Szenarios, in denen _kein_ Eintrag im Error-Log auftaucht, sondern nur im Access-Log. Ich habe beispielsweise ein Wiki laufen, welches immer wieder Ziel von Angriffen wird, indem mit fiktiven Auth-Tokens versucht wird Zugang zu erhalten; in diesem Fall wird kein Eintrag im Error- sondern im Access-Log erzeugt.
Ich könnte jetzt selbst für jeden Fall der mir auffällt eine Jail-Definition schreiben, aber ich dachte vielleicht hat jemand von euch schon etwas ähnliches im Einsatz.

Meine Frage wäre also: Habt ihr selbst definierte Jails für fail2ban? Und wenn ja, würdet ihr die zur Verfügung stellen?

Grüße Marco

--
Ich spreche Spaghetticode - fließend.
  1. Meine Frage wäre also: Habt ihr selbst definierte Jails für fail2ban?

    Ja.

    Und wenn ja, würdet ihr die zur Verfügung stellen?

    Nein. Grund: Die sind speziell und werden in Deinem Fall wohl nichts nützen.

    Genau genommen:

    Um das zu beurteilen müsste ich mehr darüber wissen:

    Eintrag im ... im Access-Log erzeugt.

    Jörg Reinholz

    1. Moin,

      Um das zu beurteilen müsste ich mehr darüber wissen:

      Ich würde mich freuen, wenn du dir das mal angucken könntest. Ich habe jetzt mal wahllos einige Abschnitte meines Access-Logs zusammenkopiert. Im ersten Teil wird deutlich, dass ein Bot (majestic12.co.uk) versucht mein Wiki mit fiktiven Tokens zu übernehmen. Offiziell handelt sich es wohl um eine "Suchmaschine", aber diese Requests sind ja ziemlich eindeutig.

      Im zweiten Teil sieht man IMHO eine Post-Flood-Attacke. Was ich dabei nicht verstehe: Die Requests kommen von einer fremden IP (37.139.23.116) und direkt nach jedem Request sieht man einen Eintrag mit der IP meines _eigenen_ Servers (109.73.50.139). Kann das damit zusammenhängen, dass ich meine normale Domain (misterunknown.de) per Apache-Proxy-Direktive auf wp.misterunknown.de umgeleitet habe?*

      Es waren bisher mehrere Angriffe, welche einige Minuten bis zu einer halben Stunde gedauert haben. Kurz nach Beginn war entweder der Apache2 oder MySQL oder beides nicht erreichbar. Im Error-Log des Apache tauchten während der Angriffe nur einige Meldungen über den Ausfall von MySQL auf; diese waren aber nicht der angreifenden Client-IP zugeordnet, sondern der IP des Servers selbst:

      [Mon Mar 24 15:01:24 2014] [error] [client 109.73.50.139] WordPress-Datenbank-Fehler MySQL server has gone away f\xc3\xbcr Abfrage SELECT * FROM wp_users WHERE user_login = 'admin' von get_user_by, WP_User::get_data_by  
      
      

      Auch SSH war aufgrund der zu langen Antwortzeit des Servers teilweise nicht nutzbar; außerdem habe ich von Nagios mehrere Mails erhalten, die den Current Load als kritisch einschätzten.

      Meine Idee war für fail2ban einen Jail zu schreiben, der das Access-Log scannt und alle Majestic12-Bots banned. Außerdem will ich Post-Flooding verhindern (vielleicht alle IPs bannen, die >3 POST-Requests/Sekunde schicken...?). Da ich in dabei keine größere Erfahrung habe, dachte ich es gibt sicherlich Leute, die schonmal vor dem selben Problem standen und schon gut durchdachte Definitionen verwenden.

      Grüße Marco

      * Hintergrund ist, dass ich ein subdomainbasiertes Wordpress-Multisite-Netzwerk installiert habe, welches auf wp.misterunknown.de läuft. Da ich noch weitere Subdomains habe, die nichts mit Wordpress zu tun haben, musste ich das so lösen, da durch die .htaccess sonst alle Subdomains auf das Netzwerk umgeleitet würden. Mit dieser Konfiguration kann ich aber beruhigt weitere Seite anlegen, die dann eine URL in der Form seite.wp.misterunknown.de bekommen oder per Domain Mapping eine eigene Domain bekommen können.

      1. Kann das damit zusammenhängen, dass ich meine normale Domain (misterunknown.de) per Apache-Proxy-Direktive auf wp.misterunknown.de umgeleitet habe?*

        Das wäre meine erste Vermutung.
        Wozu übrigens der Proxy? Der ist hier fehl am Platz. Mache einfach eine normale Weiterleitung. Die spart schon mal Leistung!

        Es waren bisher mehrere Angriffe, welche einige Minuten bis zu einer halben Stunde gedauert haben. Kurz nach Beginn war entweder der Apache2 oder MySQL oder beides nicht erreichbar. Im Error-Log des Apache tauchten während der Angriffe nur einige Meldungen über den Ausfall von MySQL auf; diese waren aber nicht der angreifenden Client-IP zugeordnet, sondern der IP des Servers selbst:

        [Mon Mar 24 15:01:24 2014] [error] [client 109.73.50.139] WordPress-Datenbank-Fehler MySQL server has gone away f\xc3\xbcr Abfrage SELECT * FROM wp_users WHERE user_login = 'admin' von get_user_by, WP_User::get_data_by

          
        
        > Meine Idee war für fail2ban einen Jail zu schreiben, der das Access-Log scannt und alle Majestic12-Bots banned.  
          
        Gute Idee, hilft aber nicht lang. Wenn es ein Angriff ist, dann stellt der der den Client um. Warum nicht. Ich habe in den vorkonfigurierten Filtern eine Regel gefunden und den Majestic nachgetragen:  
          
          
        apache-badbots.conf:  
          
        ~~~apache
          
        # Fail2Ban configuration file  
        #  
        # List of bad bots fetched from http://www.user-agents.org  
        # Generated on Sun Feb 11 01:09:15 EST 2007 by ./badbots.sh  
        #  
        # Author: Yaroslav Halchenko  
        #  
        #  
          
        [Definition]  
          
        badbotscustom = Majestic|EmailCollector|WebEMailExtrac|TrackBack/1\.02|sogou music spider  
        badbots = atSpider/1\.0|autoemailspider|China Local Browse 2\.6|ContentSmartz|DataCha0s/2\.0|DBrowse 1\.4b|DBrowse 1\.4d|Demo Bot DOT 16b|Demo Bot Z 16b|DSurf15a 01|DSurf15a 71|DSurf15a 81|DSurf15a VA|EBrowse 1\.4b|Educate Search VxB|EmailSiphon|EmailWolf 1\.00|ESurf15a 15|ExtractorPro|Franklin Locator 1\.8|FSurf15a 01|Full Web Bot 0416B|Full Web Bot 0516B|Full Web Bot 2816B|Industry Program 1\.0\.x|ISC Systems iRc Search 2\.1|IUPUI Research Bot v 1\.9a|LARBIN-EXPERIMENTAL \(efp@gmx\.net\)|LetsCrawl\.com/1\.0 +http\://letscrawl\.com/|Lincoln State Web Browser|LWP\:\:Simple/5\.803|Mac Finder 1\.0\.xx|MFC Foundation Class Library 4\.0|Microsoft URL Control - 6\.00\.8xxx|Missauga Locate 1\.0\.0|Missigua Locator 1\.9|Missouri College Browse|Mizzu Labs 2\.2|Mo College 1\.9|Mozilla/2\.0 \(compatible; NEWT ActiveX; Win32\)|Mozilla/3\.0 \(compatible; Indy Library\)|Mozilla/4\.0 \(compatible; Advanced Email Extractor v2\.xx\)|Mozilla/4\.0 \(compatible; Iplexx Spider/1\.0 http\://www\.iplexx\.at\)|Mozilla/4\.0 \(compatible; MSIE 5\.0; Windows NT; DigExt; DTS Agent|Mozilla/4\.0 efp@gmx\.net|Mozilla/5\.0 \(Version\: xxxx Type\:xx\)|MVAClient|NASA Search 1\.0|Nsauditor/1\.x|PBrowse 1\.4b|PEval 1\.4b|Poirot|Port Huron Labs|Production Bot 0116B|Production Bot 2016B|Production Bot DOT 3016B|Program Shareware 1\.0\.2|PSurf15a 11|PSurf15a 51|PSurf15a VA|psycheclone|RSurf15a 41|RSurf15a 51|RSurf15a 81|searchbot admin@google\.com|sogou spider|sohu agent|SSurf15a 11 |TSurf15a 11|Under the Rainbow 2\.2|User-Agent\: Mozilla/4\.0 \(compatible; MSIE 6\.0; Windows NT 5\.1\)|WebVulnCrawl\.blogspot\.com/1\.0 libwww-perl/5\.803|Wells Search II|WEP Search 00  
          
        # Option:  failregex  
        # Notes.:  Regexp to catch known spambots and software alike. Please verify  
        #          that it is your intent to block IPs which were driven by  
        #          above mentioned bots.  
        # Values:  TEXT  
        #  
        failregex = ^<HOST> -.*"(GET|POST).*HTTP.*"(?:%(badbots)s|%(badbotscustom)s)"$  
          
        # Option:  ignoreregex  
        # Notes.:  regex to ignore. If this regex matches, the line is ignored.  
        # Values:  TEXT  
        #  
        ignoreregex =
        

        Außerdem will ich Post-Flooding verhindern (vielleicht alle IPs bannen, die >3 POST-Requests/Sekunde schicken...?).

        Da würde ich der Statistik mehr Raum geben. Ich habe in den vorkonfigurierten Filtern keine Regel gefunden, hier ein Vorschlag:

        /etc/fail2ban/jails.conf -neuer Abschnitt:

        [apache-dos]  
          
        enabled  = false  
        port     = http,https  
        filter   = apache-dos  
        logpath  = /var/log/apache2/access.log  
          
        # Überschreibe Werte der allgemeinen Konfiguration:  
        findtime = 10  
        maxretry = 30  
        bantime  = 3600  
        
        

        /etc/fail2ban/filters.d/apache-dos.conf

        [INCLUDES]  
        before = apache-common.conf  
          
        [Definition]  
        failregex = ^.*POST.*$  
        ignoreregex =  
        
        
        1. Nachtrag:

          Auch mein Honeypot könnte hilfreich sein. Ist ja nicht gesagt, dass die Angreifer zuerst Angriffe auf Wordpress versuchen....

          Natürlich musst Du die WordPress-spezifischen URLs da raus nehmen...

          Jörg Reinholz

          1. Mahlzeit,

            Auch mein Honeypot könnte hilfreich sein.

            Habs mir grad angesehen, kreative Idee :)
            Kann die whitelist auch Domains oder nur IPs?

            --
            42
            1. Habs mir grad angesehen, kreative Idee :)
              Kann die whitelist auch Domains oder nur IPs?

              Steht doch Quelltext ... Nein. (In der gegenwärtigen Fassung können nur IPs bzw. Netze "whitelisted" werden.).

              Jörg Reinholz

              1. Mahlzeit,

                Steht doch Quelltext ... Nein. (In der gegenwärtigen Fassung können nur IPs bzw. Netze "whitelisted" werden.).

                Ich hab den Quelltext nur überflogen ;)
                Mal sehen ob ich Domains für die Whitelist noch nachrüste. Dann kann ich meine Zugänge per DynDNS auch auf die Whitelist setzen ;)

                --
                42
                1. Mahlzeit,

                  Steht doch Quelltext ... Nein. (In der gegenwärtigen Fassung können nur IPs bzw. Netze "whitelisted" werden.).

                  Ich hab den Quelltext nur überflogen ;)
                  Mal sehen ob ich Domains für die Whitelist noch nachrüste. Dann kann ich meine Zugänge per DynDNS auch auf die Whitelist setzen ;)

                  Naja. Dann wäre es das einfachste die aktuelle IP zu ermitteln und die mit auszuschließen.

                  Die IP erhältst Du so:

                  define('Whitelisted_Hostname', 'example.dyndns.org');  
                  # define('Whitelisted_Hostname', false);  
                    
                    
                  function dns_get_Ip($s) {  
                     $result = dns_get_record($s);  
                     foreach ($result as $rec) {  
                        if (isset($rec['ip'])) {  
                              return  $rec['ip'];  
                        }  
                     }  
                     return false;  
                  }
                  

                  Passe dann die Funktion FTX_getListArray an:

                  function FTX_getListArray($listFile) {  
                      $arList=array();  
                      $ar=array();  
                      $ar_lenght=0;  
                      $str='';  
                      $i=0;  
                      if ($listFile) {  
                  	$ar=file($listFile);  
                  	$ar_lenght=count($ar);  
                  	if ($ar_lenght) {  
                  	    for ($i=0; $i<$ar_lenght; $i++) {  
                  		$str=strtolower(trim($ar[$i]));  
                  		if ( '' != $str && '#' != $str{0} ) {  
                  		  if ( false !== strpos($str,'#') ) {  
                  		      $str=substr($str, 0, strpos($str,'#'));  
                  		  }  
                  		  $arList[]=trim($str);  
                  		}  
                  	    }  
                  	}  
                      }  
                      if (Whitelisted_Hostname) {  
                         $s=dns_get_Ip(Whitelisted_Hostname);  
                         if ($s) {  
                            $arList[]=$s;  
                         }  
                      }  
                      return ($arList);  
                  }  
                  
                  

                  Jörg Reinholz

          2. Moin,

            ich danke dir für deine Ausführungen. Ich habe die Definitionen zu fail2ban hinzugefügt und probiere jetzt mal deinen Honeypot aus ;)

            Grüße Marco

            --
            Ich spreche Spaghetticode - fließend.
            1. Moin,

              ich danke dir für deine Ausführungen. Ich habe die Definitionen zu fail2ban hinzugefügt und probiere jetzt mal deinen Honeypot aus ;)

              Da bin ich ja mal auf die Ergebnisse gespannt. Eines noch:

              [apache-dos]

              enabled  = false

              Da muss natürlich statt false ein true hin um den Filter anzuschalten.

              Jörg Reinholz