Co REMOTE_ADDR v PHP skutečně říká za VPN
Je to hodnota, kterou dodal váš webový server, ne nahlédnutí do tunelu. Projděte cestu požadavku, ověřte, kdo ji smí přepsat, a identitu držte v aplikaci.
Někdo se ptá, proč se uživatel VPN objevuje v logu aplikace s adresou, která patří bráně, nebo s adresou, která se po obědě změnila. Odpověď začíná tím, co ta hodnota je: záznam, který webový server vložil do prostředí požadavku. Není to dotaz do tunelu, není to identita certifikátu a není to slib, že číslo patří jedné osobě. Číst ji jako kteroukoli z těch tří věcí dává sebevědomé odpovědi, které jsou špatné různými způsoby.
Hodnota pochází ze serveru, ne z tunelu
PHP dostává prostředí požadavku od toho, co spustilo skript. Referenční příručka proměnných serveru v PHP popisuje tyto záznamy jako vytvořené webovým serverem, s dostupností, která závisí na tom, jak požadavek dorazil.
Skript spuštěný jako hook příkazové řádky VPN je úplně jiný kontext provádění. Nemá webový požadavek, klientský socket ani REMOTE_ADDR, a proto kopírovaný webový kód v hooku dává prázdné hodnoty místo chybných. Hook má vlastní prostředí, plněné démonem, a je dokumentován zvlášť. Sahat tam po REMOTE_ADDR znamená sahat po proměnné, která nebyla nikdy nastavena.
Mějte ten rozdíl na paměti, než začnete porovnávat dva logy. Možná porovnáváte požadavek stránky s hookem, a to není žádné porovnání. Zkontrolujte nejdřív kontext provádění a teprve potom adresu.
Projděte cestu požadavku, než číslu uvěříte
Hlášená adresa je protějšek toho spojení, které webový server viděl. Vložte cokoli mezi klienta a ten server a protějšek se změní. Překlad, ukončení a vyvažování zátěže posouvají každé pozorování o jeden skok dál od uživatele.
Čtyři běžné cesty dávají čtyři různá pozorování.
| 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 |
Zapište cestu s názvem cíle, rodinou adres a každým překladovým bodem. Bez té mapy vypadá správná a chybná hodnota v řádku logu stejně. Dva řádky diagramu ušetří odpoledne hádky.
Nahrazení probíhá jen tam, kde je nakonfigurováno
Server nebo framework může adresu klienta záměrně nahradit. Modul remote-IP Apache a modul real-IP NGINX to oba dělají a hodnota, kterou PHP dostane, závisí na této konfiguraci a na parametrech předaných obsluze skriptu.
REMOTE_ADDR tedy není univerzálně nedotčený TCP protějšek. Je to protějšek tak, jak se jej server rozhodl hlásit po uplatnění vlastních pravidel. Ten rozdíl rozhoduje, zda je hodnota důkaz, nebo dekorace.
Zeptejte se správce serveru, které pole je v tomto nasazení směrodatné a jak se původní protějšek uchovává, když dojde k nahrazení. Pokud to nikdo neumí odpovědět, log zatím nic nedokazuje.
Nečtěte předávací hlavičky na důvěru
Volající může předávací hlavičky poslat sám. Považovat první čárkou oddělený záznam za ověřenou adresu uživatele znamená rozhodnutí věřit každému, kdo se připojí, což je opak toho, k čemu hlavička slouží. Hlavička popisuje řetězec a jen důvěryhodná vrstva může za ten řetězec ručit.
Použijte podporu důvěryhodných proxy serveru nebo frameworku s nakonfigurovaným skutečným řetězcem proxy a nechte ji zahodit hodnoty ze zdrojů mimo tento řetězec. Ručně psaný parser je místo, kde bydlí většina zajímavých selhání.
Adresa hlášená proxy také nemění zdroj paketů, který vidí firewall výše. Držte metadata HTTP a síťové filtrování jako oddělená pozorování, protože odpovídají na různé otázky.
K rozhodování používejte identitu aplikace
Pro přístup k záznamům uživatele se spolehněte na ověřený principal a autorizační pravidla aplikace. Vnitřní adresa může být přidělena znovu a jedna přeložená adresa může zastupovat stovky souběžných uživatelů. Ani jednu z těchto vlastností kontrola adresy nespraví.
Pokud provoz potřebuje spojit požadavek s relací VPN, spojte pozorovanou adresu a časové razítko se směrodatnými záznamy relací podle dokumentovaného modelu překladu. To dává asociaci, kterou můžete obhájit; samotná adresa ne.
Pro diagnostiku logujte těch několik potřebných polí místo celého pole serveru, které může nést hlavičky a autentizační materiál. Užitečný závěr říká, co tato hodnota v tomto nasazení znamená, ne která hodnota vypadá nejvíc jako klient.