Jak odmówić dostępu do zasobów na podstawie nagłówków przekazywanych przez X.


13

Usiłuję ograniczyć dostęp do zasobów za Nginx na podstawie adresu IP klienta przekazywanego w nagłówkach przekazywanych przez X. Nginx działa w kontenerze w klastrze Kubernetes na Google Cloud Platform, a rzeczywiste klienty ips są przekazywane tylko w nagłówku X-Forward-For

Do tej pory udało mi się to zrobić dla pojedynczego adresu IP z następującym kodem:

set $allow false;
if ($http_x_forwarded_for ~* 123.233.233.123) {
    set $allow true;
}
if ($http_x_forward_for ~* 10.20.30.40) {
    set $allow false;
}
if ($allow = false) {
    return 403;
}

Ale jak mogę to zrobić dla całego zakresu adresów IP? Ręczne podawanie setek adresów IP nie ma większego sensu.

Cała pomoc jest mile widziana

Odpowiedzi:


11

Użyj modułu RealIP, aby honorować wartość X-Forwarded-Fornagłówka. Ustaw set_real_ip_fromadres IP zwrotnego serwera proxy (aktualna wartość $remote_addr).

Na przykład:

server {
    ...
    real_ip_header X-Forwarded-For;
    set_real_ip_from 10.1.2.3;
    ...
}

Teraz powinno być w stanie wykorzystać $remote_addri allow/ denydyrektyw wykorzystujące prawdziwy adres IP klienta. Więcej informacji znajduje się w tym dokumencie .


więc spróbowałem bezskutecznie, czy to mylę? location / { real_ip_header X-Forwarded-For; set_real_ip_from 10.0.0.0/8; real_ip_recursive on; allow xxx.xxx.xxx.xxx;
— p1hr

Po przejrzeniu dokumentów Google równoważenia obciążenia znalazłem, co następuje: X-Forwarded-For: <unverified IP(s)>, <immediate client IP>, <global forwarding rule external IP>, <proxies running in GCP> (requests only) Wpis <bezpośredni adres IP klienta> to klient, który łączy się bezpośrednio z modułem równoważenia obciążenia.
— p1hr

1
Aby to działało, trzeba określić zakresy adresów dla <global forwarding rule external IP>a <proxies running in GCP>i dodać set_real_ip_fromsprawozdanie obejmujące wszystkie z nich.
— Richard Smith,

<global forwarding rule external IP>jest zewnętrznym adresem IP mojej usługi, w GCP nie ma innych serwerów proxy, w moich logach nginx widzę żądania w następującym formacie, w [31/Jul/2017:20:05:46 +0000] "GET / HTTP/1.1" 403 169 "-" "curl/7.54.0" "aaa.aaa.aaa.aaa, bbb.bbb.bbb.bbb, ccc.ccc.ccc.ccc"którym ccc.ccc.ccc.ccc jest globalną regułą przekazywania, bbb.bbb.bbb.bbb natychmiastowy klient ip - pasuje do tego, co widzę na whatsmyip.org. Jest jakaś szansa, że ​​możesz doradzić, jak wydobyć tę część?
— p1hr

1
Ok, teraz się mylę. Musisz podać set_real_ip_fromwszystkie adresy po prawej stronie adresu, na który chcesz zezwolić / odmówić. Jak wskazano w real_ip_recursivesekcji.
— Richard Smith,

5

Odpowiedź Richarda zawierała już informacje o tym, jak najlepiej uzyskać prawdziwy adres IP dla nginx.

Tymczasem, jeśli chodzi o określenie zakresów adresów IP, możesz użyć http://nginx.org/en/docs/http/ngx_http_geo_module.html .

Te geoprace modułów takich jak mapmoduł, czyli zmienna zostanie przypisane wartości w zależności od wartości adresu IP.

Przykład:

geo $allow {
    default 0;
    192.168.168.0/24 1;
}

server {
    real_ip_header X-Forwarded-For;
    set_real_ip_from 10.1.2.3;

    if ($allow = 0) {
        return 403;
    }
}

Tutaj przypisujemy geomapę, gdzie domyślną wartością $allowjest 0. Jeśli adres IP znajduje się w podsieci 192.168.168.0/24, wówczas $allowotrzyma wartość 1 i żądanie jest dozwolone.

W geobloku może znajdować się tyle wierszy, ile potrzeba, aby zdefiniować zakresy adresów IP.


Dziękuję Ci! wydaje się, że działa to naprawdę dobrze, ostatnią rzeczą, z którą mam do czynienia, jest klient_ip z X-forwarded-for. W tej chwili z 3 przekazanych adresów IP używany jest ostatni. Dodałem real_ip_recursive on;poniżej, set_real_ip_fromale nie zrobiło to żadnej różnicy
— p1hr

Czy masz na myśli, że twój X-Forwarded-Fornagłówek ma trzy oddzielne adresy, to znaczy, że żądanie przychodzi przez wiele serwerów proxy? Czy masz tam jakiś inny nagłówek, który może zawierać tylko adres IP klienta?
— Tero Kilkanen

Każdy serwer proxy w łańcuchu dołącza swój adres IP do X-Forwarded-Fornagłówka. Oprócz dodawania real_ip_recursive onnależy również dodać set_real_ip_fromdyrektywy dla każdego adresu IP zaufanego serwera w łańcuchu proxy. Nginx przejdzie następnie przez każdą z tych dyrektyw i zwróci adres IP klienta jako pierwszą wartość, którą trafi w X-Forwarded-Fornagłówku, która nie pasuje do żadnej z podanych set_real_ip_fromwartości
— miknik

FWIW, ta kombinacja nie działała dla mnie z AWS ALB. Pracowało użycie dyrektywy proxy w bloku geo, z tym samym IP jak set_real_ip - nginx.org/en/docs/http/ngx_http_geo_module.html
— talonx

3

Mam te działające dla mnie.

geo $remote_addr $giveaccess {
      proxy 172.0.0.0/8; <-- Private IP range here
      default 0;
      11.22.33.44 1; <-- Allowed IP here
    }


server{
##
    location ^~ /secure_url_here {
        if ($giveaccess = 0){
          return 403; 
        }
        try_files $uri $uri/ /index.php?$args; <-- Add this line specific for your CMS, if required.
    }

Ref: http://nginx.org/en/docs/http/ngx_http_geo_module.html

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.