IP-Sperren für bestimmte (Drupal-)Verzeichnisse in der .htaccess

Um Content-Management-Systeme wie Drupal abzusichern, macht es Sinn, dass Backend zur Pflege und Verwaltung nur bestimmten IP-Bereichen zugänglich zu machen. Eine Möglichkeit für jedes nahezu jedes CMS besteht darin, dies über die Apache-Konfiguration in der .htaccess durchzuführen, sofern das Apache-Modul mod-rewrite aktiviert ist. Wir leiten jede nicht zulässige IP-Adresse auf eine Fehlerseite (403) weiter. Ich zeige das hier mal an einem Beispiel für Drupal 7 und einer aktuellen Apache-Version (>2.4.x):

# Prohibiting access to admin pages and user login, if not from allowed ip address
RewriteCond %{HTTP_HOST} ^www\.domain\.com [NC]
RewriteCond %{REQUEST_URI} ^/(user|admin|update\.php|node\/add|node\/[0-9]*\/(edit|delete))
RewriteCond expr "! -R '192.168.10.0/24'"
RewriteCond expr "! -R '10.0.0.0/24'"
RewriteRule ^(.*)$ - [L,R=403]

Seit der Apache 2.4 Version kann man für größere IP-Bereiche die CIDR  Schreibweise verwenden. Eine Seite zur Berechnung der IP-Bereiche findet man unter mxtoolbox oder jodies, letzterer sieht ein wenig altbacken, dafür aber übersichtlicher aus.

Befindet sich auf dem Server noch eine ältere Apache Version, z. B. 2.2.x, dann könnt ihr die RewriteCond expr so nicht verwenden. In diesem Fall sieht die Konfiguration folgendermaßen aus:

# Prohibiting access to admin pages and user login, if not from allowed ip address
RewriteCond %{HTTP_HOST} ^www\.domain\.com [NC]
RewriteCond %{REQUEST_URI} ^/(user|admin|update\.php|node\/add|node\/[0-9]*\/(edit|delete))
RewriteCond %{REMOTE_ADDR} !^192\.168\.10\.[0-9]{1,3}$
RewriteCond %{REMOTE_ADDR} !^10\.0\.0\.[0-9]{1,3}$
RewriteRule ^(.*)$ - [L,R=403]

Und dann existiert noch ein Sonderfall, der ab und an bei größeren Server-Farmen, gerade bei größeren Firmen vorkommen kann, die Seiten werden über einen Proxy-Server aufgerufen und die Remote-IP Adresse (%{REMOTE_ADDR}) ist deshalb für alle Besucher die selbe. In diesem Fall muss man die X-FORWARDED-FOR Server-Variable abrufen. Das Beispiel sieht dann folgendermaßen aus (Apache > 2.4.x):

# Prohibiting access to admin pages and user login, if not from allowed ip address
RewriteCond %{HTTP_HOST} ^www\.domain\.com [NC]
RewriteCond %{REQUEST_URI} ^/(user|admin|update\.php|node\/add|node\/[0-9]*\/(edit|delete))
RewriteCond expr "! %{HTTP:X-FORWARDED-FOR} -ipmatch '192.168.10.0/24'"
RewriteCond expr "! %{HTTP:X-FORWARDED-FOR} -ipmatch '10.0.0.0/24'"
RewriteRule ^(.*)$ - [L,R=403]

Und für den Apache bis 2.2.x:

# Prohibiting access to admin pages and user login, if not from allowed ip address
RewriteCond %{HTTP_HOST} ^www\.domain\.com [NC]
RewriteCond %{REQUEST_URI} ^/(user|admin|update\.php|node\/add|node\/[0-9]*\/(edit|delete))
RewriteCond %{HTTP:X-FORWARDED-FOR} !^192\.168\.10\.[0-9]{1,3}$
RewriteCond %{HTTP:X-FORWARDED-FOR} !^10\.0\.0\.[0-9]{1,3}$
RewriteRule ^(.*)$ - [L,R=403]

Gerade die beiden letzten Beispiele haben mir bei einigen Server-Konfigurationen etwas Kopfzerbrechen bereitet. Ich hoffe, es hilft dem einen oder anderen weiter.

Schreibe einen Kommentar

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