Sačuvajte IP adrese VPN klijenta na granici oblaka ili ih prevedite SNAT-om
Čuvanje izvora zadržava identitet klijenta u svakom zapisu, SNAT drži tabelu usmjeravanja malom. Tri uslova kažu šta je aplikaciji potrebno.
Zadržavanje adrese VPN klijenta sve do aplikacije čini da svaki red zapisa i svaki unos na listi dozvola znače istu stvar. Prepisivanje te adrese na rubu oblaka čini tabelu usmjeravanja jednostavnijom, a zapise manje korisnim. Nijedan izbor nije sam po sebi pogrešan, a argument koji ga odlučuje rijetko se tiče performansi. Tri uslova ga rješavaju: da li aplikacija mora znati koji se čovjek povezao, da li će struktura oblaka prihvatiti izvor koji namjeravate poslati i ko je poslije spreman preuzeti povratnu rutu.
Tri uslova odlučuju
Počnite od zahtjeva aplikacije, a ne od mrežnog dijagrama. Ako autorizacija ili revizija zavise od pojedinačne adrese klijenta, onda je njeno čuvanje funkcionalni zahtjev, a prevođenje regresija. Ako aplikacija samo treba znati da je saobraćaj stigao preko puta udaljenog pristupa, prevedena adresa je dovoljna i mnogo jeftinija za rad.
Drugi uslov je mehanički. Virtuelna mreža ne vjeruje automatski paketu koji tvrdi adresu koja nije dodijeljena interfejsu pošiljaoca. Većina struktura oblaka to sprovodi, na različite načine i pod različitim imenima, a dizajn koji to zanemari izgledat će ispravno na dijagramu i tiho će se gubiti u produkciji.
Treći je organizacijski. Čuvanje izvora znači da tabela usmjeravanja aplikacijske podmreže mora pokazivati natrag na pristupnik za prefiks klijenta, i svaki tim koji kasnije doda podmrežu mora tu rutu održavati dosljednom. To je jednokratni mali trošak i ponavljajući trošak kroz desetine računa. Odlučite ko ga plaća prije nego obećate ponašanje.
Ruta nije dozvola za lažno predstavljanje
Dodavanje povratne rute govori vašoj podmreži kuda odgovori treba da idu. Ono ne govori strukturi da instanca koja prosljeđuje te pakete smije da ih emituje sa stranim izvorom. Na AWS-u je relevantna kontrola provjera izvora i odredišta i ona je vidljiva po instanci:
aws ec2 describe-instances --instance-ids i-0a1b2c3d4e5f60718 \
--query "Reservations[].Instances[].SourceDestCheck"
aws ec2 modify-instance-attribute --instance-id i-0a1b2c3d4e5f60718 \
--no-source-dest-check
Isključite je samo za instancu čiji je dokumentovani posao prosljeđivanje i ni za šta drugo. Svaka aplikacijska VM koja provjeru ostavi uključenom je jedna mašina manje koja se može koristiti za emitovanje saobraćaja sa pozajmljenim izvorom. Ako vaša platforma nije AWS, potražite ekvivalentnu postavku za anti-spoofing ili dozvoljene adrese umjesto da pretpostavite da se ponašanje prenosi.
Brzo snimanje paketa riješi pitanje brže od čitanja konzole. Ako odgovori odu, a klijent ih nikada ne vidi, struktura odbacuje krivotvoreni izvor, a ne aplikacija ne uspijeva.
Šta prevođenje kupuje i šta košta
Prepisivanje izvora na pristupniku uklanja problem povratnog puta. Aplikacija vidi jednu adresu koju već zna kako dosegnuti, a prefiks klijenta nikada ne mora se pojaviti u tabeli usmjeravanja oblaka. Na Linuxu je pravilo jedan red i vrijedi napisati najužu verziju koju možete:
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -s 172.20.8.0/24 -o ens5 -j SNAT --to-source 10.40.3.10
Obratite pažnju šta aplikacija sada bilježi: 10.40.3.10 za svakog korisnika, na svakoj vezi, zauvijek. Svaka lista dozvoljenih adresa napravljena na toj vrijednosti sada daje pristup cijeloj populaciji udaljenog pristupa, a svaka istraga incidenta mora se vratiti na pristupnik da odgovori ko je to bio.
Rješenje nije odustati od prevođenja, nego prestati pretvarati se da je adresa identitet. Nosite identitet klijenta u autentificiranom polju, bilježite ga na pristupniku uz prevedeni tupel i dopustite aplikaciji da se pridruži po njemu. Bez ključa za spajanje prevođenje pretvara mrežni problem u trajni forenzički.
Relej je drugo sučelje
Obrnuti proxy ispred aplikacije u potpunosti zaobilazi pitanje rutiranog puta. Proxy otvara vlastitu vezu prema pozadinskom sistemu, pa prefiks klijenta nikada ne mora biti rutabilan unutar virtuelne mreže, a aplikacija može primiti identitet u zaglavlju koje proxy postavlja.
To zaglavlje je pouzdano samo kada ga pozadinski sistem prihvata od proxyja i ni od čega drugog. U nginx terminima to znači eksplicitno imenovati pouzdanog partnera umjesto vjerovati onome što stigne:
set_real_ip_from 10.40.3.10;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
Svaki klijent koji može direktno dosegnuti pozadinski sistem može krivotvoriti isto zaglavlje, pa pozadinski sistem mora biti nedostupan osim kroz proxy. To je činjenica o firewallu, a ne mišljenje o konfiguraciji, i upravo tu pretpostavku ljudi preskoče kada kopiraju isječak.
Relej također mijenja ono što kupujete. Dobijate identitet na razini aplikacije i prirodno mjesto da ga bilježite; gubite općenitost, jer svaki novi protokol treba vlastitu proxy podršku. Za HTTP usluge ta je razmjena obično dobra, a za sve što nije HTTP obično uopće nije dostupna.
Zapišite šta svaka granica vidi
Šta god odabrali, pregled dizajna treba završiti jednom tabelom koja imenuje izvornu adresu i dokazivi identitet na svakom skoku. Bez nje prvi incident proizvede tri tima koji svaki opisuje drugog klijenta.
| Boundary | Source the next hop sees | What is actually proven |
|---|---|---|
| Client to gateway | 172.20.8.14 | A certificate or credential was presented |
| Gateway to app subnet, preserved | 172.20.8.14 | The same session, if the return route exists |
| Gateway to app subnet, translated | 10.40.3.10 | Only that traffic came through the gateway |
| Proxy to backend | 10.40.3.10 plus a header | The proxy asserted an identity it authenticated |
Zatim odaberite. Čuvajte izvor kada autorizacija aplikacije zaista zavisi od adrese klijenta i kada možete preuzeti rutu. Prevedite kada to nije slučaj i kada identitet možete nositi van opsega, i koristite AWS smjernice za instance prosljeđivanja za postavke prosljeđivanja specifične za platformu. Posegnite za relejem kada usluga govori HTTP i kada želite da identitet prestane biti adresa.