HTTP Zugriffe für bestimmte IPs, ganze Netze oder Hostnamen sperren


  Wieso sollte man überhaupt filtern wollen?

Betreibt man seinen eigenen Webserver oder ein Blog mit Kommentarmöglichkeit, so sollte man sich nicht über die mitunter vielen Zugriffe wundern, die einem nichts Gutes wollen. Zugriffe von verseuchten Rechnern zum Testen auf (fehlerhafte) Softwareinstallationen, Passworttests und sonstige Skriptingaktivitäten.
Kommentare in Blogs werden mit Kommentarspam verseucht. Es hilft scheinbar auch wenig, Captcha im mittleren Schwierigkeitsgrad einzubauen. Diese Stufe bietet zwar einen guten Kompromiss zwischen Bedienbarkeit-/ Nutzbarkeit und der Abwehr automatischer SPAM Bots, reicht aber trotzdem nicht aus. Nun könnte man anfangen, über re-Captcha oder die Änderung in einen schwierigeren Grad nachzudenken.

Eine Änderung des Captcha-Bildes in ein schweres Bild hat jedoch wieder Nachteile: Man selber muss es immer wieder mal eingeben, jeder Nutzer, der einen Kommentar hinterlassen möchte, muss diesen ebenfalls eingeben. Fällt also, wenn man wenigstens noch etwas Nutzerfreundlich bleiben möchte, ebenfalls aus. Auch helfen einem Captcha Bilder wenig, wenn diese durch „Mechanical turk“ ähnliche Konstrukte gehen und fleißige SPAMmer aus Niedrigstlohnländern den Code händisch eingeben.


  Was hilft denn statt dessen?

Den Riegel vorschieben ist quasi der beste Weg, sich von Kommentarspammern und anderen Problemen zu befreien. DIeses kann man über mindestens zweierlei Wege lösen: Entweder richtet man in der vor dem Webserver liegenden Firewall Regeln ein, die bestimmte IP Adressen oder gar ganze Netze nicht mehr zulassen und somit den Zugriff auf den HTTP Server direkt unterbinden oder man regelt dieses über den HTTP Server selber. Exemplarisch gehe ich auf die Konfiguration bei Nutzung eines Apache Webserver ein, über den di (403 oder .htaccess) Regeln einrichtbar sind.
Sicherlich sind auch andere HTTP Server wie lighthttpd, tinyhttpd usw. usf. ähnlich einfach bis identisch mit diesen Regeln zu konfigurieren.


  Voraussetzungen

Damit die nachfolgenden Regeln greifen können setze ich einen Zugriff auf die Konfigurationsdatei des Apache (oder zumindest die Nutzung von .htaccess-Dateien) voraus. Beim Apache Webserver muss die Konfigurationsdatei für den (virtuellen) Host verändert und der Apache mit der angepassten Konfiguration reloaded (oder auch neu gestartet) werden können. Besteht kein Zugriff, da es sich u.U. um ein „Webserver“-Paket bei einem großen Hoster handelt, stehen die Chancen für Änderungen an der Konfigurationsdatei schlecht. Hier kann jedoch meist über Konfigurationsfrontends (Plesk, Confixx & Co.) Zugriff auf Funktionen erhalten werden, die ebenfalls IP Adressen sperren können.
Ich gehe in der nachfolgenden Beschreibung von der Situation aus, dass zumindest die Konfigurationsdatei editiert werden kann. In meinem Beispiel habe ich SSH Zugriff auf den Server und passe die Konfiguration mit einem Texteditor vi an. Natürlich kann über andere Editoren die Anpassung vorgenommen werden. Ein Zugriff per SSH auf den Server ist auch nicht zwingend erforderlich, macht es aber einfacher.
Weiterhin besteht die Möglichkeit, sollte kein Zugriff auf die Apache Konfigurationsdatei möglich sein, die Regeln über .htaccess Dateien zu regeln.


  Filterregeln per Apache Konfiguration einrichten

Der HTTP Server Apache bietet die Möglichkeit, den Zugriff auf diesen selber zu reglementieren und einzuschränken. Durch Regeln kann man beispielsweise bestimmte Seiten/ Dienste (z.B. Webmail, Testseiten f. einen Relaunch usw.) einrichten, die nur von einem ausgewählten Kreis von IP Adressen/ Hostnamen genutzt werden dürfen. Oder man kann sic der HTTP-deny Einstellung seines Apache Webservers behelfen um den Spammern den Zugriff auf seine Seiten zu sperren. Dieses geschieht durch Regeln, die im 403 Bereich eingerichtet werden. Hierdrin festgelegt kann man entscheiden, ob jemand zugreifen darf oder nicht. Eine Fehlerseite lässt sich definieren und dem geblockten Besucher statt der eigentlichen Seite anzeigen.

Um die Filterregeln nun in die Konfiguration einzubauen und über den Apache zu regeln werden diese in den zu dem Host gehörenden Konfigurationsdatei eingefügt. Dieses kann entweder in der httpd.conf oder in einer Konfigurationsdatei für einen virtuellen Host statt finden.
In beiden ist der Einzufügende Eintrag gleich:

Nachdem Änderungen durchgeführt wurden muss die Konfigurationsdatei neu eingelesen werden. Dieses wird über einen reload des Apache gemacht:
apachectl reload
Alternativ kann man natürlich auch den Apache neu starten. Macht sich allerdings nicht gut, wenn auf dem Server noch mehr Seiten liegen und diese nicht beeinflusst werden sollten 😉
Nach dem reload sollte man abermals prüfen, ob die Seiten noch korrekt ausgeliefert werden. Also einfach mit einem Browser die eigene Seite ansurfen, die Seite wird korrekt ausgeliefert. Testweise kann man natürlich einmal seine eigene IP in die deny Regeln eintragen und testen, ob die Filterregel korrekt arbeitet.


  Filterregeln per .htaccess-Datei einrichten

Wird dem Nutzer eines Hostingpaketes zugestanden, Anpassungen über die .htaccess Datei vornehmen zu können, so kann auch in dieser das Regelwerk definiert werden. Diese Änderungen werden gleich nach dem Abspeichern wirksam, ein reload der Konfiguration oder gar ein restart des Apache ist nicht nötig.
DIe für das Verzeichnis, ob nun das Hauptverzeichnis oder ein Unterverzeichnis, nötige .htaccess Datei muss entweder schon existieren oder wird neu angelegt. Existiert schon eine und funktioniert diese, so schreiben wir folgende Zeilen ans Ende der Datei ran:


<Files gehwegseite403.html>
order allow,deny
allow from all
</Files>

deny from 100.200.100.50
deny from 111.222.111.0/24
deny from dudarfsthiernichtrein.tld

Zu Erklärung: Die ersten Zeilen zwischen den Files gibt an, welche Seite angezeigt werden soll, sollte die 403 greifen und der Besucher gesperrt sein. In unserem Fall soll die Seite gehwegseite403.html statt der eigentlichen Seite angezeigt werden.
Danach kommen die Order-Folgen. Grundsätzlich erlauben wir erstmal den Zugriff von überall (allow from all). In den danach folgenden deny Zeilen sperren wir jedoch einige Nutzer aus. Der erste deny Eintrag sperrt die einzelne IP Adresse 100.200.100.50, die zweite Regel sperrt das ganze Class C (/24er) Netz 111.222.111.0/24. Und die dritte Regel sperrt Zugriffe vom Host dudarfsthiernichtrein.tld.
Man sollte sich schon etwas mit IP Adressen und Netzmasken auskennen, eh man anfängt, die Netze in /24er, /16er oder /8er Blöcken zu sperren. Schnell sperrt man unter Umständen zu viel…

Um zu prüfen, ob die Regeln korrekt greifen kann man sich selber einmal aussperren. Hierzu trägt man seine derzeitige offizielle IP Adresse (bekommt man z.B. unter http://checkip.dyndns.org heraus) in eine Regel ein und ruft seine Seite auf. Nun sollte man per 403-redirect zur Seite gehwegseite403.html verwiesen werden und diese statt der eigentlichen Seite sehen.


  Kann man auch nur ein paar Besucher freigeben?

  Im umgekehrten Falle (man möchte nur explizit ein paar IP Adressen freigeben) kann man natürlich die obige Regel anpassen und gibt nur die gewünschte(n) IP(s) frei:


<Files gehwegseite403.html>
order deny, allow
deny from all
</Files>

allow from 100.200.100.50
allow from 111.222.111.0/24
allow from dudarfsthierrein.tld

Hiermit werden alle Zugriffe verboten und nur Zugriffe von den angegebenen IPs, den Netzen bzw. dem Host erlaubt.

Über diesen Weg kann man beispielsweise seine Seiten nur bestimmten Adressen im internen oder firmenweiten LAN zur Verfügung stellen.

Es ersetzt natürlich nicht die Absicherung über HTTPS und .htaccess mit Benutzer/ Passwortauthetifizierung!


  Kann bzw. sollte man das Hinzufügen von Filterregeln automatisieren?

Grundsätzlich kann man natürlich dieses Vorgehen, die IP Adresse/ Netze händisch in die Konfigurationsdatei des Apache bzw. die .htaccess Datei zu schreiben, automatisieren.
Man schreibt sich also ein kleines Skript, welches die IP Adressen von SPAM Kommentaren automatisch in diese Sperrliste übernimmt. Dann ist zumindest von dieser IP Adresse ein zweiter Versuch nicht mehr möglich. Das Skript etwas abgewandelt kann gleich auf ganze Netze prüfen und diese komplett sperren. In solch einem Skript ließen sich beispielsweise gleich die kompletten Netzblöcke von Dial-up Internetservice-Providern sperren. Greift also der vermeintliche Spammer aus „nicht vertrauenswürdigen“ Ländern (die man auf Grund des Inhaltes seiner Seite nicht als potenzielle Besucher erwarten würde) zu, so sperrt man gleich das Netz.
Nachteil hierbei: Fälschlicherweise gesperrte IP Adressen oder Netzblöcke. Diese Automatismen können fehlerhafte Einträge verursachen und Netze sperren, die vielleicht doch den einen oder anderen gutwilligen Besucher aussperren. Man sollte also immer bedenken, dass Automatismen grundsätzlich zwar gut sind, sie können aber immer mal einen Fehler verursachen. Sowas würde man dann wohl unter Kollateralschaden abtun.
Es hilft also wenig: Man sperrt die IP Adressen/ Netze lieber händisch oder muss mit diesen, vielleicht auftretenden Fehlern leben und einen Besucher fälischlicherweise aussperren..


  Was, wenn es mit der .htaccess nicht funktioniert?

Sollte trotz der korrekten Regeln in der .htaccess Datei keinerlei Sperren funktionieren, so kann dieses auch an den Restriktionen des Hosters liegen. Hier sollte man dann erfragen, ob bestimmte Optionen nicht erlaubt sind. Wird die Seite korrekt gesperrt, jedoch keine 403 Seite ausgegeben, so ist die Zieldatei zu prüfen. Existiert diese? An der richtigen Stelle? Ist diese Datei bei einem direkten Aufruf korrekt?
Funktioniert die Steuerung über die .htaccess gar nicht, so ist ebenfalls die Option AllowOverride in der httpd.conf zu prüfen. Steht in der Konfiguration für den (virtuellen) Host in der Zeile AllowOverride der Wert None, so ist über diese die Nutzung von .htaccess komplett deaktiviert. Der Wert All würde alle Werte in der .htaccess und damit auch die deny-Regeln erlauben.


  Fehler 503 – server misconfiguration

Sollte nach Anpassungen an der Datei eine Fehlermeldung des Apache mit einem „Error 503 misconfiguration“ auftreten, so wird vermutlich eine der eingegebenen deny-Zeilen fehlerhaft sein. Wichtig ist hier drauf zu achten, dass alle vier Octets korrekt drin stehen. Vergisst man beispielsweise bei einem /24er Netz die Null im vierten Octet, so kann der Apache mit der Konfiguration nicht umgehen und meldet einen 503 Fehler.
Man sollte also nicht gleich eine sehr lange Liste von IPs und Netzen einfügen, die man nicht ausreichend geprüft hat. Befindet sich in dieser Liste ein Fehler drin, macht es die Suche unnötig kompliziert. Lieber in kleinere Teile unterteilen und diese nach und nach einfügen und testen. Tritt dann ein Fehler auf ist die Suche auf einen kleineren Bereich begrenzt.


  Links
http://httpd.apache.org/docs/2.2/howto/access.html


Dieser Beitrag wurde unter Dokus und Tipps, Linux/ UNIX, Technikspielkram abgelegt und mit , , , , , , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

1 Antwort zu HTTP Zugriffe für bestimmte IPs, ganze Netze oder Hostnamen sperren

  1. Sirko Schlegel sagt:

    Hallo rotzoll,

    beim Nachbau Ihrer sehr guten Anleitung ist mir aufgefallen, dass sich im Bereich „Kann man auch nur ein paar Besucher freigeben?“ in dem Codebeispiel ein kleinen Fehler eingeschlichen hat.

    Anstatt: order deny, allow
    Sollte: order deny,allow

    dort stehen, d.h. ohne dem Leerzeichen vor allow. Sonst startet der Apache Webserver nicht.

    Mit freundlichen Grüßen,
    Sirko Schlegel

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert