Puncte:1

configurați nginx pentru a solicita anumite condiții pentru o locație pentru toate, cu excepția unei date IP sursă

drapel de

Caut o configurație în care aș dori să am certificate de client SSL pentru toate IP-urile sursă, cu excepția uneia.

Ideea mea este să setez

 ssl_verify_client opțional;

și pentru a adăuga o declarație if elaborată la locații. Cu toate acestea, nu știu cum să scriu o astfel de declarație if.

  # aceasta necesită certificate de client ssl pentru toate locațiile
  Locație / {
    dacă ($ssl_client_verify != „SUCCES”) { 
       întoarce 403; 
    ...
  }

  # acum ce să scrieți pentru a solicita certificate ssl, cu excepția cazului în care IP-ul sursă este de ex. 1.2.3.4
  locație /două {
    dacă (?????) { 
       întoarce 403; 
    ...
  }

Editare: informații suplimentare

Schimbarea ssl_verify_client cu valoarea opțional le spune clienților că pot, dar nu trebuie să trimită certificate de client.

Deci prin verificarea variabilei $var_ssl_client_verify Pot vedea dacă un certificat de client a fost prezentat și valabil (SUCCES) sau nu. Această regulă se aplică tuturor clienților care nu au un IP sursă dat. Pentru o anumită sursă IP nu vreau să verific certificatele client.

Ceea ce am nevoie este ceva de genul

    if ($ssl_client_verify != „SUCCESS” și source_ip != 1.2.3.4 ) { 
       întoarce 403; 
    }

Editarea 2: Am schimbat titlul din configurați nginx pentru a solicita certificate de client pentru toate, cu excepția unei date IP sursă la configurați nginx pentru a solicita anumite condiții pentru o locație pentru toate, cu excepția unei date IP sursă deoarece ceea ce mă lupt cu adevărat nu are nimic de-a face cu certificatele clientului, ci cu combinarea declarațiilor if și filtrarea condiționată de adresa IP sursă.

drapel us
Utilizarea „if” în locații în interiorul locațiilor nu funcționează așa cum v-ați aștepta: https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/
Puncte:1
drapel sv

Mai multe condiții nu sunt acceptate în Nginx pentru dacă afirmație. Deci, ca o soluție de soluționare și deoarece IP-ul clientului este evaluat în cazul nostru de utilizare, soluția ar putea fi realizată similar cu cum a fost obținută la https://www.nginx.com/blog/rate-limiting-nginx/#Advanced-Configuration-Examples . Practic, solutia merge cam asa...

geo $limit {
    implicit 1;
    1.2.3.4 0; #vă rugăm să înlocuiți exemplul de IP cu IP-ul real.
}

ssl_verify_client opțional;
ssl_client_certificate /path/to/cert.pem;

harta $limit $limit_key {
    0 „SUCCES”;
    1 $ssl_client_verify;
}

Server {
    # ... alte directive
    Locație / {
        if ( $limit_key != 'SUCCES' ) { return 403; }
        # ... alte directive
    }
}

Practic, atribuim valoarea „SUCCES” variabilei pentru un anumit IP. Pentru fiecare alt IP, atribuim valoarea reală a $ssl_client_verify.

Răspuns alternativ

ssl_verify_client opțional;
ssl_client_certificate /path/to/cert.pem;
Server {
    # ... alte directive
    
    # valoarea inițială a lui $variable este valoarea reală a lui $ssl_client_verify
    setați $variabilă $ssl_client_verify;

    # aici reatribuim $variabila cu „SUCCESS” pentru IP-ul nostru specific
    # vă rugăm să înlocuiți 1.2.3.4 cu IP-ul real
    dacă ( $adresă_la distanță = "1.2.3.4" ) {
        setează $variabila „SUCCES”;
    }

    Locație / {
        if ( $variabilă != 'SUCCES' ) { return 403; }
        # ... alte directive
    }
}
drapel sv
@gelonida Scuze pentru că am înțeles greșit întrebarea dumneavoastră inițial.
gelonida avatar
drapel de
Multumesc pentru raspunsul tau. Acest lucru ar trebui să facă treaba. Deci ideea este să folosiți `geo` pentru maparea adresei IP sursă, instrucțiuni `map` pentru a crea o variabilă, care poate fi folosită în sfârșit într-un `if ( $variable != "SUCCESS") { return 403; }` Referitor la neînțelegerea inițială. M-a făcut să-mi rescriu întrebarea într-un mod (sperăm) mai puțin ambiguu și mai generic. Voi marca întrebarea ca OK de îndată ce voi avea ocazia să testez în mediul meu. În realitate, scenariul meu este puțin mai complicat, deoarece adresa IP va fi determinată prin protocolul proxy.
drapel sv
@gelonida Ai dreptate. Consultați răspunsul actualizat care include o soluție alternativă.
gelonida avatar
drapel de
Răspunsul alternativ funcționează pentru mine. Nu l-am incercat pana acum pe primul.
drapel sv
Mă bucur să știu că a funcționat.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.