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.