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


Ich betreibe CentOS 5.5 mit dem Apache httpd-2.2.3.

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

  1. Abgelehnt von allen
  2. Erlaube vom Subnetz 192.168.16.0/24
  3. Verweigern Sie die IP-Adresse 192.168.16.100, die sich im Subnetz 192.168.16.0/24 befindet.

1 & 2 sind einfach. Aber, seit ich "Erlaube von 192.168.16.0/24", ist es möglich, von 192.168.16.100 zu verweigern?

Ich habe versucht, eine Deny-Anweisung für 192.168.16.100 hinzuzufügen, aber es 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

Zuerst werden alle Allow-Anweisungen ausgewertet. Mindestens eins muss übereinstimmen, oder die Anfrage wird abgelehnt. Als nächstes werden alle Deny-Direktiven ausgewertet. Wenn Übereinstimmungen vorhanden sind, wird die Anfrage abgelehnt

Die IP-Adresse stimmt mit der Deny-Anweisung überein, sollte die Anfrage also nicht abgelehnt werden?

Laut der Tabelle auf der Seite "mod_authz_host" sollte diese IP-Adresse "Übereinstimmungen mit Zulassen und Verweigern" lauten. Daher sollte die Regel "Endgültige Übereinstimmungskontrollen: Abgelehnt" zutreffen.

    Übereinstimmung zulassen, Ergebnis verweigern Verweigern, Ergebnis zulassen
    Übereinstimmung Nur zulassen Anfrage erlaubt Anfrage erlaubt
    Übereinstimmung Nur ablehnen Anfrage verweigert Anfrage abgelehnt
    Keine Übereinstimmung Standard auf zweite Direktive: Standard auf zweite Direktive verweigert: Erlaubt
    Übereinstimmungen sowohl zulassen als auch verweigern Endgültige Übereinstimmungskontrollen: Verweigert endgültige Übereinstimmungskontrollen: Erlaubt

24
2018-03-11 01:24


Ursprung


Verweigern von allen 192.168.16.100 - Da Sie hier "all" verwenden, würde ich erwarten, dass alle Anfragen von jeder IP-Adresse abgelehnt werden. Denken Sie, dass hier etwas anderes passiert. - micah
@Michah: Ich mache auch ein Allow from 192.168.16.0/24. Wie ich die Dokumentation verstehe, werden alle Requestor-IPs im Netzwerk 192.168.16.0/24 dieser Allow-Anweisung entsprechen, die Anfrage ist zulässig. - Stefan Lasiewski
Befolgen Sie die oben aufgeführte Dokumentation. "Zuerst werden alle Allow-Direktiven ausgewertet; mindestens eine muss übereinstimmen, oder die Anfrage wird abgelehnt" ==> Dies sollte Ihrem "Allow from 192.168.16.0/24" entsprechen, aber der zweite Teil von "Next, alle Deny-Direktiven sind Wenn Übereinstimmungen vorhanden sind, wird die Anfrage abgelehnt "With" Deny from all ", stimmt nicht jede Anfrage mit diesem zweiten Teil überein und wird daher abgelehnt? - micah
Sie sollten sich wirklich überlegen, ob Sie der IP-Adresse den vollständigen Zugriff auf Ihr System oder nur über httpd verweigern möchten. Wenn der erste mit Ihrem Ansatz bei der Verwendung von Apache-Direktiven fortfährt. Wenn letzteres sollte dies in der Firewall getan werden. - Andrew Case
Danke 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:


Ich habe es nicht getestet, aber ich denke du bist 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. In der Tat wird es vermasseln, weil alles zusammenpassen wird allund somit abgelehnt (und ich denke, Apache versucht, schlau zu sein und etwas Dummes zu tun). Ich habe immer Apachen gefunden Order, Allow und Deny Direktiven verwirren, also visualisiere immer Dinge in einer Tabelle (aus die Dokumente):

Spiel | Erlauben, Ergebnis verweigern | Verweigern, Ergebnis zulassen
-------------------------------------------------- -----
Nur zulassen | Erlaubt | Dürfen
Nur verweigern | Verweigert | Verweigert
Keine Übereinstimmung | Standard: Abgelehnt | Standard: Erlaubt
Finde beide | Endspiel: Verweigert | Endspiel: Erlaubt

Mit den obigen Einstellungen:

  • Anfragen von 192.168.16.100 erhalten "Match match" und werden somit abgelehnt.
  • Anfragen von 192.168.16.12 bekommen "Allow only" und damit erlaubt.
  • Anfragen von 123.123.123.123 erhalten "Keine Übereinstimmung" und werden somit abgelehnt.

33
2017-10-07 17:08





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

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


1
2018-03-11 01:50



Ich habe meine Antwort aktualisiert. Ich habe eine "Deny from 192.168.16.100" -Regel hinzugefügt, aber der Zugriff ist weiterhin erlaubt von 192.168.16.100 - Stefan Lasiewski
Ich möchte den Zugriff auf alle anderen Standorte von diesem Host aus ermöglichen. Ich möchte jedoch bestimmte Standorte verweigern. IPTables hilft mir hier nicht weiter. - Stefan Lasiewski
IPTables verweigern den ausgehenden Datenverkehr nicht ausdrücklich, es sei denn, Sie weisen dies an. Sie können jedoch eingehenden Datenverkehr von der Welt und eine bestimmte Adresse verweigern, aber alle erlauben ein Subnetz. - Mike
Ich denke, Sie missverstehen meine Anfrage. Ich möchte diese Zugriffskontrolle nur auf / server-status anwenden, nicht den gesamten Host. IPtables können dies meines Wissens nach nicht so leicht machen. - Stefan Lasiewski


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

Beispiel:

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

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

{    Kopfzeile ("Standort: http://www.google.com/");

Ausfahrt();

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


-4
2018-04-06 20:51



Dies müsste auf jeder einzelnen Seite des Webservers geschehen. Diese Lösung ist nicht praktikabel und nicht dort, wo Sie den Zugriff auf einen Webserver filtern möchten. - Andrew Case