Apache httpd: Jak mogę odmówić wszystkim, zezwolić na podsieć, ale odmówić dostępu z IP w tej podsieci?

26

Używam CentOS 5.5 ze standardowym Apache httpd-2.2.3.

Mam włączone mod_status w miejscu / stan serwera. Chciałbym zezwolić na dostęp do tej jednej lokalizacji w następujący sposób:

  1. Odmowa od wszystkich
  2. Zezwalaj z podsieci 192.168.16.0/24
  3. Odmów z adresu IP 192.168.16.100, który znajduje się w podsieci 192.168.16.0/24.

1 i 2 są łatwe. Jednak skoro „Zezwalam na 192.168.16.0/24”, czy można odmówić z 192.168.16.100?

Próbowałem dodać instrukcję Deny dla 192.168.16.100, ale to nie działa. Oto odpowiednia konfiguracja:

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

Lub:

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

Jednak nie uniemożliwia to dostępu do tej konkretnej strony, jak pokazano w dziennikach dostępu:

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

Zgodnie z instrukcją dla mod_authz_host :

Pozwalają zaprzeczyć

Po pierwsze, oceniane są wszystkie dyrektywy Allow; co najmniej jeden musi być zgodny lub żądanie zostanie odrzucone. Następnie oceniane są wszystkie dyrektywy Deny. Jeśli którykolwiek pasuje, żądanie jest odrzucane

Adres IP jest zgodny z dyrektywą Deny, więc czy nie należy odrzucić żądania?

Zgodnie z tabelą na stronie mod_authz_host ten adres IP powinien „Dopasować oba Zezwalaj i Odrzuć”, a zatem powinna obowiązywać reguła „Kontrola końcowego dopasowania: Odmowa”.

    Dopasuj Zezwól, Odrzuć wynik Odrzuć, Zezwalaj na wynik
    Dopasuj Zezwól tylko Żądanie dozwolone Żądanie dozwolone
    Dopasowanie Odrzuć tylko Żądanie odrzucone Żądanie odrzucone
    Brak dopasowania Domyślnie do drugiej dyrektywy: Odmowa Domyślnie do drugiej dyrektywy: Dozwolone
    Dopasuj zarówno Zezwól, jak i Odrzuć kontrole dopasowania końcowego: Odmowa Kontrolki dopasowania końcowego: Dozwolone
Stefan Lasiewski
źródło
Odmów od wszystkich 192.168.16.100 - Ponieważ używasz tutaj „wszystkich”, oczekiwałbym, że wszystkie żądania zostaną odrzucone z dowolnego adresu IP. Pomyśl, coś się tu dzieje.
mika
@Michah: Robię też Allow from 192.168.16.0/24. Jak rozumiem dokumentację, każdy adres IP osoby żądającej w sieci 192.168.16.0/24 będzie pasował do tej instrukcji Allow, żądanie jest dozwolone.
Stefan Lasiewski
Zgodnie z wklejoną powyżej dokumentacją. „Po pierwsze, oceniane są wszystkie dyrektywy Allow; przynajmniej jedna musi być zgodna lub żądanie jest odrzucane” ==> To powinno pasować do twojego „Allow from 192.168.16.0/24”, ale druga część „Dalej, wszystkie dyrektywy Deny są oceniane. Jeśli jakiekolwiek dopasowania, żądanie zostanie odrzucone „Z” Odrzuć od wszystkich ”, czy każde żądanie nie pasuje do tej drugiej części i dlatego nie zostanie odrzucone?
Michea
Powinieneś naprawdę rozważyć, czy chcesz odmówić temu adresowi IP pełnego dostępu do systemu, czy tylko z httpd. Jeśli to pierwsze, kontynuuj swoje podejście do korzystania z dyrektyw Apache. Jeśli to drugie, należy to zrobić w zaporze.
Andrew Case,
Dzięki ACase. Chcę tylko odmówić dostępu z 192.168.16.100 do tej konkretnej strony. Chcę, aby 192.168.16.100 miał dostęp do wszystkich innych stron tego serwera.
Stefan Lasiewski

Odpowiedzi:

35

Nie testowałem, ale myślę, że już prawie jesteś.

<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 allnie jest potrzebne. W rzeczywistości to spieprzyło, bo wszystko do siebie pasuje all, a tym samym zaprzeczyło (i myślę, że Apache próbuje być mądry i zrobić coś głupiego). Zawsze uważałem Apache Order, Allowi Denydyrektyw mylące, więc zawsze wizualizować rzeczy w tabeli (wzięte z docs ):

Dopasuj | Zezwól, Odrzuć wynik | Odmów, Zezwól na wynik
-------------------------------------------------- -----
Zezwalaj tylko | Dozwolone | Dozwolony
Odmów tylko | Odmowa | Odmówiono
Brak dopasowania | Domyślnie: Odmowa | Domyślnie: dozwolone
Dopasuj oba | Mecz końcowy: odmowa | Ostateczne dopasowanie: dozwolone

Przy powyższych ustawieniach:

  • Żądania z 192.168.16.100 otrzymują „Dopasuj oba” i tym samym odrzucone.
  • Żądania z 192.168.16.12 otrzymują „Zezwalaj tylko” i tym samym są dozwolone.
  • Żądania z adresu 123.123.123.123 otrzymują komunikat „Brak dopasowania” i tym samym odrzucane.
phunehehe
źródło
1

Prawdopodobnie przyjrzałbym się również dodaniu reguł IPTables w celu odmowy pojedynczego hosta na porcie 80, odmowy od wszystkich i umożliwienia podsieci.

Po zezwoleniu na podsieć nie powinieneś mieć problemu z konfiguracją reguły odmowy z określonego adresu. Po prostu zrób to w tej kolejności.

Mikrofon
źródło
Zaktualizowałem swoją odpowiedź.
Zawarłem
Chcę zezwolić na dostęp do wszystkich innych lokalizacji z tego hosta. Chcę jednak odmówić określonych lokalizacji. IPTables mi tu nie pomaga.
Stefan Lasiewski
IPTables nie odmówi konkretnie ruchu wychodzącego, chyba że zostaniesz o tym poinformowany. Możesz jednak odmówić ruchu przychodzącego ze świata i określonego adresu, ale wszystkie zezwalają na podsieć.
Mike
Myślę, że źle zrozumiałeś moją prośbę. Chcę zastosować tę kontrolę dostępu tylko do statusu / server-status, a nie do całego hosta. O ile mi wiadomo, IPtables nie może tego zrobić łatwo.
Stefan Lasiewski
-4

Czy umiesz używać php? Jeśli tak, dodaj instrukcję php, aby wyjść / przekierować dla tego konkretnego adresu IP

Przykład:

$ deny = tablica („111.111.111”, „222.222.222”, „333.333.333”);

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

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

wyjście();

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

Jan
źródło
2
Musiałoby to znajdować się na każdej stronie hostowanej przez serwer WWW. To rozwiązanie jest niepraktyczne i nie wymaga filtrowania dostępu do serwera WWW.
Andrew Case