Apache httpd: Wie kann ich "Von allen verweigern", "Von Subnetz zulassen", "Von IP verweigern" in diesem Subnetz?

26

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

Ich habe mod_status unter Location / Server-Status aktiviert . Ich möchte den Zugriff auf diesen einzelnen Standort auf folgende Weise zulassen:

  1. Abgelehnt von allen
  2. Zulassen aus dem Subnetz 192.168.16.0/24
  3. Ablehnen von einer IP-Adresse 192.168.16.100, die sich im Subnetz 192.168.16.0/24 befindet.

1 & 2 sind einfach. Ist es jedoch möglich, seit "Zulassen von 192.168.16.0/24" von 192.168.16.100 zu verweigern?

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 "-" "

Nach dem Handbuch für mod_authz_host :

Zulassen, Ablehnen

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

Die IP-Adresse entspricht der Ablehnungsrichtlinie. Sollte die Anfrage nicht abgelehnt werden?

Gemäß der Tabelle auf der Seite "mod_authz_host" sollte diese IP-Adresse mit "Zulassen und Verweigern" übereinstimmen, und daher sollte die Regel "Letzte Übereinstimmungskontrolle: Verweigert" gelten.

    Match Allow, Deny Ergebnis Deny, Allow Ergebnis
    Treffer Nur erlauben Anfrage erlaubt Anfrage erlaubt
    Übereinstimmung Nur ablehnen Anfrage abgelehnt Anfrage abgelehnt
    Keine Übereinstimmung Standard für zweite Anweisung: Verweigert Standard für zweite Anweisung: Zulässig
    Erlaube und verweigere die Kontrolle der endgültigen Übereinstimmung: Verweigerte die Kontrolle der endgültigen Übereinstimmung: Erlaubt
Stefan Lasiewski
quelle
Von allen verweigern 192.168.16.100 - Da Sie hier "alle" verwenden, würde ich erwarten, dass alle Anforderungen von jeder IP-Adresse verweigert werden. Denke, hier ist noch etwas los.
Micah
@Michah: Ich mache auch eine Allow from 192.168.16.0/24. Soweit ich die Dokumentation verstehe, stimmen alle Requestor-IPs im 192.168.16.0/24-Netzwerk mit dieser Allow-Anweisung überein. Die Anfrage ist zulässig.
Stefan Lasiewski
Befolgen Sie die oben eingefügte Dokumentation. "Zuerst werden alle Allow-Direktiven ausgewertet; mindestens eine muss übereinstimmen, oder die Anfrage wird abgelehnt" ==> Dies sollte mit Ihrer "Allow from 192.168.16.0/24" übereinstimmen, aber der zweite Teil von "Next, all Deny-Direktiven sind Wenn eine Übereinstimmung vorliegt, wird die Anfrage abgelehnt. "Mit" Von allen ablehnen ", stimmt nicht jede Anfrage mit diesem zweiten Teil überein und wird daher abgelehnt?
Micah
Sie sollten wirklich überlegen, ob Sie den vollständigen Zugriff dieser IP-Adresse auf Ihr System verweigern möchten oder nur über httpd. Fahren Sie mit Ihrer Vorgehensweise bei der Verwendung von Apache-Direktiven fort. In letzterem Fall sollte dies in der Firewall erfolgen.
Andrew Fall
Vielen Dank ACase. Ich möchte nur den Zugriff von 192.168.16.100 auf diese bestimmte Seite verweigern. Ich möchte, dass 192.168.16.100 auf alle anderen Seiten dieses Webservers zugreifen kann.
Stefan Lasiewski

Antworten:

35

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 allwird nicht benötigt. In der Tat wird es vermasseln, weil alles zusammenpassen wird all, und damit bestritten (und ich denke, Apache versucht, klug zu sein und etwas Dummes zu tun). Ich habe immer gefunden , Apache Order, Allowund DenyRichtlinien verwirrend, so dass immer visualisieren Dinge in einer Tabelle (entnommen aus der Dokumentation ):

Spiel | Zulassen, Ergebnis verweigern | Verweigern, Ergebnis zulassen
-------------------------------------------------- -----
Nur zulassen | Erlaubt | Dürfen
Nur ablehnen | Verweigert | Verweigert
Keine Übereinstimmung | Standardeinstellung: Verweigert | Standardeinstellung: Zulässig
Passen Sie beide an | Endspiel: Verweigert | Endspiel: Erlaubt

Mit den obigen Einstellungen:

  • Anfragen von 192.168.16.100 erhalten "Match both" und werden somit abgelehnt.
  • Anfragen von 192.168.16.12 erhalten "Nur erlauben" und sind somit erlaubt.
  • Anfragen von 123.123.123.123 werden mit "No match" abgewiesen.
phunehehe
quelle
1

Ich würde wahrscheinlich auch IPTables-Regeln hinzufügen, um den einzelnen Host auf Port 80 zu verweigern, von allen zu verweigern 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.

Mike
quelle
Ich habe meine Antwort aktualisiert. Ich habe die Regel "Ablehnen von 192.168.16.100"
eingefügt
Ich möchte von diesem Host aus den Zugriff auf alle anderen Standorte zulassen. Ich möchte jedoch bestimmte Standorte ablehnen. IPTables hilft mir hier nicht weiter.
Stefan Lasiewski
IPTables lehnt ausgehenden Datenverkehr nur dann ab, wenn Sie dies anweisen. Sie können jedoch eingehenden Datenverkehr von der Welt und eine bestimmte Adresse verweigern, aber alle erlauben ein Subnetz.
Mike
Ich denke, Sie verstehen meine Bitte falsch. Ich möchte diese Zugriffskontrolle nur auf / server-status anwenden, nicht auf den gesamten Host. IPtables können dies meines Wissens nicht einfach tun.
Stefan Lasiewski
-4

Kannst du PHP benutzen? Wenn ja, fügen Sie eine PHP-Anweisung hinzu, um diese eine bestimmte IP-Adresse zu verlassen / umzuleiten

Beispiel:

$ deny = array ("111.111.111", "222.222.222", "333.333.333");

if (in_array ($ _SERVER ['REMOTE_ADDR'], $ deny))

{header ("location: http://www.google.com/ ");

Ausfahrt();

Referenz: http://perishablepress.com/press/2007/07/03/how-to-block-ip-addresses-with-php/

John
quelle
2
Dies müsste auf jeder einzelnen Seite geschehen, die vom Webserver gehostet wird. Diese Lösung ist unpraktisch und nicht dort, wo Sie den Zugriff auf einen Webserver filtern möchten.
Andrew Fall