it-swarm.com.de

Apache httpd: Wie kann ich von allen verweigern, von Subnetz zulassen, aber von IP innerhalb dieses Subnetzes verweigern?

Ich verwende CentOS 5.5 mit dem Standard Apache httpd-2.2.3.

Ich habe mod_status am Location/Server-Status aktiviert. Ich möchte den Zugriff auf diesen einzelnen Standort folgendermaßen zulassen:

  1. Abgelehnt von allen
  2. Aus dem Subnetz 192.168.16.0/24 zulassen
  3. Verweigern Sie die IP 192.168.16.100, die sich im Subnetz 192.168.16.0/24 befindet.

1 & 2 sind einfach. Ist es jedoch möglich, ab 192.168.16.100 zu verweigern, da ich "Ab 192.168.16.0/24 zulassen"?

Ich habe versucht, eine Deny-Anweisung für 192.168.16.100 hinzuzufügen, aber sie funktioniert nicht. Hier ist die relevante Konfiguration:

<Location /server-status>
    SetHandler server-status
    Order Allow,Deny
    Deny from  all
    Deny from  192.168.16.100 # This does not deny access from 192.168.16.100
    Allow from 192.168.16.0/24
</Location>

Oder:

<Location /server-status>
    SetHandler server-status
    Order Allow,Deny
    Deny from  all
    Deny from  192.168.16.100 # This does not deny access from 192.168.16.100
    Allow from 192.168.16.0/24
</Location>

Dies verhindert jedoch nicht den Zugriff auf diese bestimmte Seite, wie in den Zugriffsprotokollen gezeigt:

www.example.org 192.168.16.100 - - [11/Mar/2011:16:01:14 -0800] "GET /server-status HTTP/1.1" 200 9966 "-" "

Laut Handbuch für mod_authz_Host :

Zulassen, Verweigern

Zunächst werden alle Allow-Direktiven ausgewertet. Mindestens eine muss übereinstimmen, sonst wird die Anfrage abgelehnt. Als nächstes werden alle Verweigerungsanweisungen ausgewertet. Wenn Übereinstimmungen vorliegen, wird die Anfrage abgelehnt

Die IP-Adresse stimmt mit der Verweigerungsrichtlinie überein. Sollte die Anforderung also nicht abgelehnt werden?

Gemäß der Tabelle auf der Seite mod_authz_Host sollte diese IP-Adresse "sowohl zulassen als auch verweigern" entsprechen, und daher sollte die Regel "Endgültige Übereinstimmungssteuerung: verweigert" gelten.

 Übereinstimmung zulassen, Ergebnis verweigern verweigern, Ergebnis zulassen 
 Übereinstimmung nur zulassen Anforderung zulässig Anforderung zulässig 
 Übereinstimmung nur verweigern Anforderung verweigert Anforderung abgelehnt 
 Keine Übereinstimmung Standard für zweite Anweisung: Verweigert Standard für die zweite Direktive: Zulässig 
 Entspricht sowohl Zulassen als auch Verweigern Endspielkontrollen: Verweigert Endspielkontrollen: Zulässig 
26

Ich habe nicht getestet, aber ich denke, Sie sind fast da.

<Location /server-status>
    SetHandler server-status
    Order Allow,Deny
    Deny from  192.168.16.100
    Allow from 192.168.16.0/24
</Location>

Deny from all wird nicht gebraucht. Tatsächlich wird es vermasseln, weil alles mit all übereinstimmt und somit abgelehnt wird (und ich denke, Apache versucht, klug zu sein und etwas Dummes zu tun). Ich habe Apaches Anweisungen Order, Allow und Deny immer als verwirrend empfunden, also visualisiere die Dinge immer in einer Tabelle (entnommen aus den Dokumenten ):

 Übereinstimmung | Zulassen, Ergebnis verweigern | Verweigern, Ergebnis zulassen 
 ------------------------------------- -------------- 
 Nur zulassen | Erlaubt | Erlaubt 
 Nur verweigern | Verweigert | Verweigert 
 Keine Übereinstimmung | Standard: Verweigert | Standard: Zulässig 
 Beide übereinstimmen | Endspiel: Verweigert | Endspiel: Erlaubt 

Mit den obigen Einstellungen:

  • Anfragen von 192.168.16.100 erhalten "Match both" und werden daher abgelehnt.
  • Anfragen von 192.168.16.12 erhalten "Nur zulassen" und sind daher zulässig.
  • Anfragen von 123.123.123.123 erhalten "Keine Übereinstimmung" und werden daher abgelehnt.
35
phunehehe

Ich würde wahrscheinlich auch IPTables-Regeln hinzufügen, um den einzelnen Host an Port 80 zu verweigern, von allen abzulehnen und das Subnetz zuzulassen.

Sie sollten kein Problem damit haben, eine Verweigerungsregel von einer bestimmten Adresse aus einzurichten, nachdem Sie das Subnetz zugelassen haben. Mach es einfach in dieser Reihenfolge.

1
Mike