Verejné stránky SaaS môžu zostať otvorené pre všetkých, kým administračné operácie za nimi odmietajú každého mimo VPN. Mechanizmus, ktorý to umožňuje, nie je skryté menu ani samostatná prihlasovacia stránka; je to kontrola sieťovej cesty, ktorá doručila požiadavku. Ak je dôkaz o adrese nesprávny, kontrola buď vyradí skutočných administrátorov, alebo pustí každého, kto vie napísať hlavičku. Začnite tým, čo zdroj skutočne dostáva.

Čo zdroj po tuneli skutočne dostáva

Keď sa prehliadač dostane na verejnú stránku cez VPN, ktorá prenáša aj internetovú prevádzku, brána preloží spojenie predtým, než odíde. SaaS vidí verejnú odchádzajúcu adresu brány, zvyčajne jednu adresu alebo malý rozsah, a nikdy nevidí tunelovú adresu notebooku. Preto zlyháva zaradenie 10.90.0.42 na zoznam povolených a preto zlyháva zaradenie celého RFC 1918 ešte hlasnejšie: druhé pustí každú privátnu sieť, ktorá sa k vám môže dostať. Jediná adresa, ktorá stojí za podmienku, je tá, ktorú vaša organizácia na výstupe skutočne vlastní.

curl -s https://ifconfig.me
dig +short admin.example.com

Rozdelené tunelovanie tento predpoklad potichu búra. Ak VPN prenáša len privátne kancelárske trasy, požiadavka na verejné administračné meno hostiteľa odíde cez miestneho poskytovateľa a zdroj vidí rezidenčnú adresu. Pripojená ikona VPN o tejto konkrétnej destinácii nič nehovorí, takže testujte destináciu, nie tunel.

Zastavte sa a opravte smerovanie, kým napíšete akúkoľvek politiku, ak sa odchádzajúca adresa líši podľa používateľa. Podmienka, ktorá zodpovedá len niektorým administrátorom, je horšia ako žiadna podmienka, pretože problém skrýva až do incidentu.

Verte iba proxy, ktorá adresu prepisuje

Väčšina verejných stránok stojí za CDN alebo reverznou proxy, takže adresa socketu zdroja patrí tomuto frontendu a nie návštevníkovi. Frontend zvyčajne odosiela pôvodnú adresu v hlavičke, a túto hlavičku ovláda útočník, pokiaľ ju zdroj neprijíma iba od známych proxy. Nakonfigurujte zoznam dôveryhodných zdrojov výslovne a urobte zdroj nedostupným odinakiaľ inam. Bez tejto druhej polovice útočník proxy obíde a hlavičku pošle priamo.

set_real_ip_from 192.0.2.0/24;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
curl -H 'X-Forwarded-For: 198.51.100.27' https://origin.example.com/admin

Rovnaká úvaha platí pre protokol PROXY: je dôveryhodný iba vtedy, keď je poslucháč viazaný na rozhranie, ku ktorému sa proxy dostane a nič iné nedostane. Chýbajúci kontext adresy musí spôsobiť zlyhanie chránenej kontroly, nie prepadnutie do predvoleného povolenia. Chýbajúca hlavička nie je dôkazom dôveryhodnej cesty.

Pripojte podmienku ku každej chránenej operácii

Umiestnite kontrolu na hranicu autorizácie, cez ktorú prechádza každá chránená operácia, nie na stránku, ktorá vykresľuje menu. Skupiny trás, middleware alebo vrstva politík fungujú všetky; kópia na každý handler nie, pretože handler, ktorý niekto pridá v budúcom kvartáli, ju nebude mať.

user = requireAuthenticatedSession()
requirePermission(user, "admin")
requireVpnEgress(verifiedClientAddress(request))
performProtectedOperation(user, request)

Rovnaká hranica musí pokryť JSON API, exporty, podpísané URL na stiahnutie a handshake WebSocket, pretože žiadny z nich nepotrebuje, aby bola najprv vyžiadaná HTML stránka. Odkaz na stiahnutie vytvorený, kým bola VPN zapnutá, zostáva platný aj potom, pokiaľ koncový bod sťahovania znova neoverí. Dlhodobé relácie tiež potrebujú pravidlo prehodnotenia, inak sa jedna overená požiadavka stane trvalou výnimkou. Predvolené zamietnutie je jediné nastavenie, ktoré prežije fluktuáciu zamestnancov.

Zdieľané cache sú druhou cestou okolo kontroly. Cache, ktorá už obsahuje chránenú odpoveď, ju môže vydať bez kontaktovania zdroja, preto označte administračné odpovede ako súkromné a držte ich mimo zdieľaného úložiska. Ak cache musí tieto odpovede vydávať, kontrola prístupu sa musí spustiť pred vydaním, čo zvyčajne znamená, že vôbec nemôže byť zdieľanou cache.

Otestujte obchádzky, ktoré ste práve zavreli

Precvičte maticu, nie šťastnú cestu: administrátor cez VPN, ten istý administrátor bez nej, neadministrátor cez ňu a sfalšovaná hlavička adresy. Pridajte požiadavku priamo na zdroj a požiadavku s odpoveďou z cache, pretože práve tieto dve frontend úplne obchádzajú.

curl -sI https://admin.example.com/export.csv
curl -s -H 'X-Forwarded-For: 198.51.100.27' https://origin.example.com/admin
curl -s https://admin.example.com/api/me -o /dev/null -w '%{http_code}\n'

Každá požiadavka má vrátiť stav, ktorý politika sľubuje, a log má zaznamenať, ktorý dôkaz o adrese sa použil. Pokryte IPv6 zvlášť, pretože dvojzásobníkový zdroj môže vidieť inú rodinu zdrojov, než akú ste testovali. Udržujte bežné zákaznícke operácie funkčné mimo VPN, inak sa zmena vráti pri prvej sťažnosti zákazníka. Napíšte očakávaný výsledok pre každý riadok pred spustením, aby bol prekvapivý prechod viditeľný.

Odchádzajúca adresa dokazuje povolenú sieťovú cestu, nie osobu a nie spravované zariadenie. Držte ju ako jednu podmienku vedľa autentifikácie a oprávnenia a administračná zóna zostane úzka, bez premeny celého produktu na službu iba pre VPN. To oddelenie je návrh, nie jeho obmedzenie.

Súvisiace články