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

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.

Související články