Hvad PHPs REMOTE_ADDR egentlig fortæller dig bag en VPN
Det er en værdi, din webserver leverede, ikke et opslag i tunnelen. Gå anmodningens vej igennem, kontroller, hvem der må overskrive den, og behold identiteten i applikationen.
Nogen spørger, hvorfor en VPN-bruger dukker op i applikationsloggen med en adresse, der tilhører gatewayen, eller med en adresse, der ændrede sig efter frokost. Svaret begynder med, hvad værdien er: en post, som webserveren lagde i anmodningens miljø. Det er ikke et opslag i tunnelen, ikke en certifikatidentitet og ikke et løfte om, at nummeret tilhører én person. At læse det som en af de tre giver selvsikre svar, der er forkerte på forskellige måder.
Værdien kommer fra serveren, ikke fra tunnelen
PHP modtager anmodningens miljø fra det, der kørte scriptet. PHP's reference for servervariabler beskriver disse poster som skabt af webserveren, med en tilgængelighed, der afhænger af, hvordan anmodningen ankom.
Et script, der kører som kommandolinje-hook i VPN'en, er en helt anden udførelseskontekst. Det har ingen webanmodning, ingen klientsocket og ingen REMOTE_ADDR, og derfor giver kopieret webkode i et hook tomme værdier i stedet for forkerte. Hooket har sit eget miljø, fyldt af daemonen, og det er dokumenteret separat. At række efter REMOTE_ADDR der er at række efter en variabel, der aldrig blev sat.
Husk den forskel, før du sammenligner to logs. Du sammenligner måske en sideanmodning med et hook, og det er slet ikke en sammenligning. Kontroller først udførelseskonteksten og derefter adressen.
Gå anmodningens vej igennem, før du stoler på nummeret
Den rapporterede adresse er peer for den forbindelse, webserveren så. Sæt noget mellem klienten og den server, og peeren ændrer sig. Oversættelse, terminering og lastbalancering flytter hver observationen et hop længere væk fra brugeren.
Fire almindelige veje giver fire forskellige observationer.
| Path to the listener | What can be reported |
|---|---|
| Client routed straight to the private listener, no translation | The client's tunnel address |
| Gateway translates the source before forwarding | The gateway's translated address |
| Reverse proxy terminates the client and opens its own backend connection | The proxy's backend address |
| Load balancer in front of two proxies | Whichever hop the server treats as its peer |
Skriv vejen ned med destinationsnavnet, adressefamilien og hvert oversættelsespunkt. Uden det kort ser en korrekt og en forkert værdi identiske ud i en loglinje. To linjer diagram sparer en eftermiddag med diskussion.
Erstatning sker kun, hvor den er konfigureret
En server eller et framework kan bevidst erstatte klientadressen. Apaches remote-IP-modul og NGINX' real-IP-modul gør begge dette, og den værdi, PHP modtager, afhænger af den konfiguration plus de parametre, der sendes til scripthandleren.
REMOTE_ADDR er altså ikke universelt den urørte TCP-peer. Det er peeren, som serveren valgte at rapportere den efter at have anvendt sin egen politik. Den forskel afgør, om værdien er bevis eller dekoration.
Spørg serverejeren, hvilket felt der er autoritativt i denne installation, og hvordan den oprindelige peer bevares, når erstatning sker. Hvis ingen kan svare, er loggen endnu ikke bevis for noget.
Læs ikke videresendelsesheaders på tillid
En kalder kan selv sende videresendelsesheaders. At behandle den første kommaseparerede post som en verificeret brugeradresse er at beslutte at tro på enhver, der forbinder, hvilket er det modsatte af, hvad headeren er til for. Headeren beskriver en kæde, og kun et betroet lag kan stå inde for den kæde.
Brug serverens eller frameworkets understøttelse af betroede proxier med den faktiske proxykæde konfigureret, og lad den kassere værdier fra kilder uden for den kæde. Håndskrevet parsning er det sted, hvor de fleste interessante fejl bor.
En proxyrapporteret adresse ændrer heller ikke den pakkekilde, som en firewall længere oppe ser. Hold HTTP-metadata og netværksfiltrering som separate observationer, fordi de besvarer forskellige spørgsmål.
Brug applikationens identitet til beslutninger
Til adgang til en brugers poster skal du stole på den autentificerede principal og applikationens autorisationsregler. En intern adresse kan tildeles igen, og en oversat adresse kan repræsentere hundredvis af samtidige brugere. Ingen af disse egenskaber kan en adressekontrol reparere.
Hvis driften skal knytte en anmodning til en VPN-session, skal du forbinde den observerede adresse og tidsstemplet med autoritative sessionsposter efter den oversættelsesmodel, du har dokumenteret. Det giver en association, du kan forsvare; en adresse alene gør det ikke.
Log til diagnostik de få felter, du har brug for, i stedet for hele serverarrayet, som kan bære headers og autentificeringsmateriale. Den nyttige konklusion siger, hvad denne værdi betyder i denne installation, ikke hvilken værdi der ligner en klient mest.