Cineva întreabă de ce un utilizator VPN apare în jurnalul aplicației cu o adresă care aparține gateway-ului, sau cu o adresă care s-a schimbat după prânz. Răspunsul începe cu ceea ce este această valoare: o intrare pe care serverul web a pus-o în mediul cererii. Nu este o interogare a tunelului, nu este o identitate de certificat și nu este promisiunea că numărul aparține unei singure persoane. Citind-o ca oricare dintre aceste trei, obții răspunsuri sigure care sunt greșite în moduri diferite.

Valoarea vine de la server, nu din tunel

PHP primește mediul cererii de la ceea ce a executat scriptul. Referința variabilelor de server din PHP descrie aceste intrări ca fiind create de serverul web, cu o disponibilitate care depinde de modul în care a ajuns cererea.

Un script rulat ca hook de linie de comandă al VPN-ului este un context de execuție complet diferit. Nu are cerere web, nu are socket de client și nu are REMOTE_ADDR, motiv pentru care codul web copiat într-un hook produce valori goale în loc de valori greșite. Hook-ul are propriul mediu, populat de daemon, și este documentat separat. Să cauți acolo REMOTE_ADDR înseamnă să cauți o variabilă care nu a fost niciodată setată.

Ține minte această distincție înainte de a compara două jurnale. S-ar putea să compari o cerere de pagină cu un hook, iar aceasta nu este deloc o comparație. Verifică mai întâi contextul de execuție și apoi adresa.

Parcurge traseul cererii înainte să ai încredere în număr

Adresa raportată este peer-ul conexiunii pe care a văzut-o serverul web. Introdu orice între client și acel server și peer-ul se schimbă. Traducerea, terminarea și echilibrarea sarcinii mută fiecare observația cu un salt mai departe de utilizator.

Patru trasee obișnuite produc patru observații diferite.

Path to the listenerWhat can be reported
Client routed straight to the private listener, no translationThe client's tunnel address
Gateway translates the source before forwardingThe gateway's translated address
Reverse proxy terminates the client and opens its own backend connectionThe proxy's backend address
Load balancer in front of two proxiesWhichever hop the server treats as its peer

Notează traseul cu numele destinației, familia de adrese și fiecare punct de traducere. Fără acea hartă, o valoare corectă și una greșită arată identic într-o linie de jurnal. Două linii de diagramă economisesc o după-amiază de discuții.

Înlocuirea are loc doar acolo unde este configurată

Un server sau un framework poate înlocui deliberat adresa clientului. Modulul remote-IP al Apache și modulul real-IP al NGINX fac amândouă acest lucru, iar valoarea pe care o primește PHP depinde de acea configurație plus parametrii transmisi handler-ului de script.

Deci REMOTE_ADDR nu este universal peer-ul TCP neatins. Este peer-ul așa cum serverul a ales să îl raporteze după ce și-a aplicat propria politică. Această distincție decide dacă valoarea este dovadă sau decor.

Întreabă proprietarul serverului care câmp este autoritativ în această instalare și cum este păstrat peer-ul original atunci când are loc înlocuirea. Dacă nimeni nu poate răspunde, jurnalul încă nu dovedește nimic.

Nu citi antetele de redirecționare pe încredere

Un apelant poate trimite singur antete de redirecționare. A trata prima intrare separată prin virgulă drept adresă de utilizator verificată înseamnă a decide să crezi oricui se conectează, exact opusul scopului antetului. Antetul descrie un lanț, iar doar un strat de încredere poate garanta acel lanț.

Folosește suportul pentru proxy de încredere al serverului sau framework-ului cu lanțul real de proxy configurat și lasă-l să elimine valorile din surse din afara acelui lanț. Parsarea scrisă manual este locul unde trăiesc cele mai multe defecțiuni interesante.

O adresă raportată de proxy nu schimbă nici sursa pachetelor pe care o vede un firewall aflat mai sus. Ține metadatele HTTP și filtrarea de rețea ca observații separate, pentru că răspund la întrebări diferite.

Folosește identitatea aplicației pentru decizii

Pentru accesul la înregistrările unui utilizator, bază-te pe principalul autentificat și pe regulile de autorizare ale aplicației. O adresă internă poate fi realocată, iar o singură adresă tradusă poate reprezenta sute de utilizatori simultani. Niciuna dintre aceste proprietăți nu poate fi reparată de o verificare de adresă.

Dacă operațiunile trebuie să lege o cerere de o sesiune VPN, unește adresa observată și marcajul de timp cu înregistrările de sesiune autoritare conform modelului de traducere pe care l-ai documentat. Asta produce o asociere pe care o poți apăra; o adresă singură nu.

Pentru diagnostic, înregistrează cele câteva câmpuri de care ai nevoie în locul întregului tablou de server, care poate purta antete și material de autentificare. Concluzia utilă spune ce înseamnă această valoare în această instalare, nu care valoare seamănă cel mai mult cu un client.

Articole similare