So verweigern Sie den Zugriff auf Ressourcen basierend auf X-Forwarded-For-Headern

12

Ich versuche, den Zugriff auf Ressourcen hinter Nginx basierend auf der Client-IP zu beschränken, die in X-Forwarded-For-Headern übergeben wird. Nginx wird in einem Container in einem Kubernetes-Cluster auf der Google Cloud Platform ausgeführt, und echte Client-IPs werden nur im x-forwarded-for-Header übergeben

Bisher habe ich es geschafft, dies für eine einzelne IP mit dem folgenden Code zu tun:

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

Aber wie kann ich das für ganze IP-Bereiche tun? Die manuelle Angabe von Hunderten von IPs macht wenig Sinn.

Jede Hilfe wird geschätzt

p1hr
quelle

Antworten:

9

Verwenden Sie das RealIP-Modul, um den Wert des X-Forwarded-ForHeaders zu berücksichtigen . Stellen Sie set_real_ip_fromdie IP-Adresse des Reverse-Proxys ein (den aktuellen Wert von $remote_addr).

Beispielsweise:

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

Sie sollten nun in der Lage sein, $remote_addrund allow/ denyAnweisungen unter Verwendung der wahren IP-Adresse des Clients zu verwenden. Weitere Informationen finden Sie in diesem Dokument .

Richard Smith
quelle
Also habe ich vergeblich Folgendes versucht. Verwechsle ich es? 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
Nachdem ich mir die Google Load Balancing-Dokumente angesehen hatte, stellte ich Folgendes fest: X-Forwarded-For: <unverified IP(s)>, <immediate client IP>, <global forwarding rule external IP>, <proxies running in GCP> (requests only) Der Eintrag <Sofort-Client-IP> ist der Client, der eine direkte Verbindung zum Load Balancer hergestellt hat.
p1hr
1
Damit dies funktioniert, müssen Sie die Adressbereiche für <global forwarding rule external IP>und identifizieren <proxies running in GCP>und set_real_ip_fromAnweisungen hinzufügen , die alle abdecken.
Richard Smith
<global forwarding rule external IP>Ist die externe IP meines Dienstes, gibt es keine anderen Proxys in GCP. In meinen Nginx-Protokollen werden Anforderungen im folgenden Format [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"angezeigt, wobei ccc.ccc.ccc.ccc die globale Weiterleitungsregel ist, bbb.bbb.bbb.bbb ein sofortiger Client ip - stimmt mit dem überein, was ich auf whatsmyip.org sehe. Gibt es eine Chance, wie Sie diesen Teil extrahieren können?
p1hr
1
Ok, jetzt werde ich verwirrt. Sie müssen set_real_ip_fromfür alle Adressen rechts von der Adresse, die Sie zulassen / verweigern möchten. Wie im real_ip_recursiveAbschnitt angegeben.
Richard Smith
3

Richards Antwort enthielt bereits Informationen darüber, wie man die echte IP-Adresse am besten an nginx weiterleitet.

Was die Frage der Angabe von IP-Bereichen betrifft, können Sie http://nginx.org/en/docs/http/ngx_http_geo_module.html verwenden .

Das geoModul funktioniert wie das mapModul, dh eine Variable erhält abhängig vom Wert der IP-Adresse zugewiesene Werte.

Ein Beispiel:

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

Hier weisen wir die geoKarte zu, wobei der Standardwert für $allow0 ist. Wenn sich die IP-Adresse im Subnetz befindet 192.168.168.0/24, $allowwird der Wert 1 angezeigt , und die Anforderung ist zulässig.

Sie können so viele Zeilen im geoBlock haben, wie Sie zum Definieren Ihrer IP-Bereiche benötigen.

Tero Kilkanen
quelle
Vielen Dank! das scheint wirklich gut zu funktionieren, das letzte, was mir bevorsteht, ist das client_ip von X-forwarded-for. Im Moment wird von 3 übergebenen IP-Adressen die letzte verwendet. Ich habe real_ip_recursive on;unten hinzugefügt, set_real_ip_fromaber es hat keinen Unterschied gemacht
p1hr
Meinen Sie, Ihr X-Forwarded-ForHeader hat drei separate Adressen, dh die Anfrage kommt über mehrere Proxys? Haben Sie dort einen anderen Header, den Sie verwenden können und der nur die Client-IP enthält?
Tero Kilkanen
Jeder Proxy in der Kette hängt seine IP-Adresse an den X-Forwarded-ForHeader an. Zusätzlich zum Hinzufügen müssen real_ip_recursive onSie set_real_ip_fromAnweisungen für jede vertrauenswürdige Server-IP-Adresse in Ihrer Proxy-Kette hinzufügen . Nginx wird dann jede dieser Anweisungen X-Forwarded-Forset_real_ip_from
durcharbeiten
FWIW, diese Kombination hat bei AWS ALB bei mir nicht funktioniert. Was funktionierte, war die Verwendung der Proxy-Direktive innerhalb des Geoblocks mit derselben IP-Adresse wie set_real_ip - nginx.org/en/docs/http/ngx_http_geo_module.html
talonx
2

Habe diese für mich arbeiten lassen.

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

Seff
quelle