Tunelis, vežamas saugaus WebSocket viduje, turi lygiai tiek šifravimo, kiek klientas į jį įdėjo, ne daugiau. Schema wss:// sako, kad TLS apsaugo vieną ryšį viename šuolyje. Ji nieko nesako apie tai, ar baitai WebSocket pranešimų viduje yra apsaugoti atskirai, ir būtent šis skirtumas nusprendžia, kas gali skaityti jūsų srautą, kai kas nors viduryje užbaigia TLS.

Du sluoksniai, kurie atrodo kaip vienas

Saugus WebSocket yra TLS, ant kurio atliekamas WebSocket rankos paspaudimas, kaip RFC 6455 aprašo savo ryšio ir saugumo skyriuose. TLS sluoksnis autentifikuoja serverį ir šifruoja srautą, tada WebSocket sluoksnis įrėmina tai, ką programa nusprendžia siųsti.

Tai du nepriklausomi sprendimai, o diagrama, piešianti vieną spyną per visą kelią, paslepia antrąjį. Paklauskite, kas užbaigia TLS ryšį. Tada paklauskite, ką klientas deda į kiekvieną pranešimą. Viskas kita apie diegimą išplaukia iš šių dviejų atsakymų.

Dizainas A: transportas yra vienintelis šifravimas

Paprastesniame dizaine klientas ima neapdorotus IP paketus ir apvynioja juos į WebSocket pranešimus. Viduje nieko neužšifruota, todėl komponentas, laikantis TLS sesiją, skaito atviro teksto apkrovas. Kai tas komponentas yra jūsų pačių tunelio serveris, tai yra numatytasis galutinis taškas ir dizainas yra nuoseklus, nes serveris vis tiek matė srautą.

Tai tampa kita tvarka, kai kelyje įsitaiso tikrinimo tarpinis serveris ir užbaigia TLS sertifikatu, kuriuo klientas pasitiki. Tas tarpinis serveris dabar turi tą patį atvirą tekstą, kurį būtų turėjęs serveris, ir joks WebSocket įrėminimo kiekis to nepakeičia. Kliento pasitikėjimo saugykla nusprendė šį rezultatą gerokai prieš atidarant tunelį, nes pasirinko priimti tą sertifikatą tam vardui. Tarpinis serveris taip pat mato prašomą hostą ir kiekvieno pranešimo dydį, ko pakanka daugelio veiklų pirštų atspaudams paimti nieko papildomai nešifruojant.

Dizainas B: apkrova neša savo raktus

Antrame dizaine klientas šifruoja ir autentifikuoja savo paketus VPN protokolu, turinčiu savo partnerio tapatybę ir raktų mainus, tada veža rezultatą WebSocket pranešimų viduje. Užbaigus išorinį TLS čia atskleidžiamas šifruotas tekstas, o ne srautas. Tarpinis serveris mato pranešimų dydžius ir laiką, ir nieko daugiau apkrovoje. Tai daug mažesnė ekspozicija, ir vis tiek tai metaduomenys, kuriuos verta įvardyti apžvalgoje, o ne nubraukti ranka.

Vidaus protokolo galutiniai taškai vis dar mato atvirą tekstą, kas yra šios tvarkos esmė ir kartu jos riba. Jei komponentas galutiniame taške turi teisę skaityti duomenis prieš šifravimą arba po iššifravimo, papildomas sluoksnis jo neapriboja. Raktai ir juos tvarkanti programinė įranga lieka svarbi riba.

VPN etiketė, pažįstama kliento piktograma ar rinkodaros puslapis nėra įrodymas, kad šis dizainas egzistuoja. Apkrovos formato skaitymas yra įrodymas.

Atsekite, kur atviras tekstas iš tikrųjų pasirodo

URL schema duoda vieną faktą, todėl likusią dalį gaukite iš sąsajų. Vykdykite žemiau esančias patikras iš eilės, nes kiekviena susiaurina kitą:

ss -tnp | grep -E ':(443|8443)\b'
ip -br link show type tun
openssl s_client -connect vpn.example.net:443 -servername vpn.example.net -brief
tcpdump -ni tun0 -c 5 -X

Pradėkite nuo išorinio ryšio. Viena ilgaamžė TCP sesija į TLS prievadą yra tai, kaip atrodo WebSocket nešiklis, o antra sesija į nesusijusį hostą nusipelno paaiškinimo prieš žiūrint giliau. Tada raskite tunelio sąsają kliente, nes tun ar tap įrenginys pasako, kad klientas tvarko IP paketus, o ne tarpininkauja vienam programos srautui.

Užfiksavimas tunelio sąsajoje paprastai išsprendžia apkrovos klausimą. Ten skaitomos antraštės reiškia, kad vidiniai paketai niekada nebuvo atskirai šifruoti, o didelės entropijos apkrovos reiškia, kad buvo. Pakartokite užfiksavimą išorinėje sąsajoje ir palyginkite abu: jei abu atrodo atsitiktinai, vidinis sluoksnis atlieka darbą, kurio išorinis negali atšaukti.

Peržiūrėkite pasitikėjimą, kurį iš tikrųjų suteikėte

Įdiegtas įmonės šaknies sertifikatas yra faktas apie kliento pasitikėjimo saugyklą, o ne teiginys apie tai, ką koks nors tarpinis serveris registruoja ar tikrina. Nustatykite taikomą politiką ir tikrąjį ryšio kelią, o ne spręskite apie elgesį iš CA buvimo.

Valdomoje įrangoje paklauskite administratoriaus, kuris komponentas užbaigia TLS, ar klientas tikrina prisegtą sertifikatą, ar viešą, ir koks yra apkrovos formatas. Tie trys atsakymai duoda išvadą, kurią vėliau galėsite apginti.

Rašykite rezultatą kaip ribą, o ne kaip nuosprendį. „TLS baigiasi tikrinimo tarpiniame serveryje, o vidinė apkrova atskirai šifruota raktais, kuriuos turi tik galutiniai taškai“ yra patikrinamas teiginys, išliekantis pasikeitus tiekėjui. „WebSockets yra saugūs“ – ne.

Susiję straipsniai