Sveiki, Habr, mani sauc Iļja, es strÄdÄju Exness platformas komandÄ. MÄs izstrÄdÄjam un ievieÅ”am galvenos infrastruktÅ«ras komponentus, ko izmanto mÅ«su produktu izstrÄdes komandas.
Å ajÄ rakstÄ vÄlos dalÄ«ties pieredzÄ par Å”ifrÄtas SNI (ESNI) tehnoloÄ£ijas ievieÅ”anu publisko vietÅu infrastruktÅ«rÄ.
Å Ä«s tehnoloÄ£ijas izmantoÅ”ana paaugstinÄs droŔības lÄ«meni, strÄdÄjot ar publisku vietni, un atbildÄ«s SabiedrÄ«bas pieÅemtajiem iekÅ”ÄjÄs droŔības standartiem.
PirmkÄrt, vÄlos norÄdÄ«t, ka tehnoloÄ£ija nav standartizÄta un joprojÄm ir melnrakstÄ, bet CloudFlare un Mozilla to jau atbalsta (in
Mazliet teorija
ESNI ir TLS 1.3 protokola paplaÅ”inÄjums, kas ļauj SNI Å”ifrÄt TLS rokasspiediena ziÅojumÄ āClient Helloā. LÅ«k, kÄ Client Hello izskatÄs ar ESNI atbalstu (parastÄ SNI vietÄ mÄs redzam ESNI):
Lai izmantotu ESNI, jums ir nepiecieŔami trīs komponenti:
- DNS;
- Klientu atbalsts;
- Servera puses atbalsts.
DNS
Jums jÄpievieno divi DNS ieraksti - AUn TXT (TXT ieraksts satur publisko atslÄgu, ar kuru klients var Å”ifrÄt SNI) - skatiet tÄlÄk. TurklÄt ir jÄbÅ«t atbalstam DoH (DNS, izmantojot HTTPS), jo pieejamie klienti (skatiet tÄlÄk) neiespÄjo ESNI atbalstu bez DoH. Tas ir loÄ£iski, jo ESNI nozÄ«mÄ tÄ resursa nosaukuma Å”ifrÄÅ”anu, kuram mÄs piekļūstam, tas ir, nav jÄgas piekļūt DNS, izmantojot UDP. TurklÄt lietoÅ”ana
Šobrīd pieejams
CloudFlare
Š ieraksts:
curl 'https://dns.google.com/resolve?name=www.cloudflare.com&type=A'
-s -H 'accept: application/dns+json'
{
"Status": 0,
"TC": false,
"RD": true,
"RA": true,
"AD": true,
"CD": false,
"Question": [
{
"name": "www.cloudflare.com.",
"type": 1
}
],
"Answer": [
{
"name": "www.cloudflare.com.",
"type": 1,
"TTL": 257,
"data": "104.17.210.9"
},
{
"name": "www.cloudflare.com.",
"type": 1,
"TTL": 257,
"data": "104.17.209.9"
}
]
}
TXT ieraksts, pieprasÄ«jums tiek Ä£enerÄts saskaÅÄ ar veidni _esni.FQDN:
curl 'https://dns.google.com/resolve?name=_esni.www.cloudflare.com&type=TXT'
-s -H 'accept: application/dns+json'
{
"Status": 0,
"TC": false,
"RD": true,
"RA": true,
"AD": true,
"CD": false,
"Question": [
{
"name": "_esni.www.cloudflare.com.",
"type": 16
}
],
"Answer": [
{
"name": "_esni.www.cloudflare.com.",
"type": 16,
"TTL": 1799,
"data": ""/wEUgUKlACQAHQAg9SiAYQ9aUseUZr47HYHvF5jkt3aZ5802eAMJPhRz1QgAAhMBAQQAAAAAXtUmAAAAAABe3Q8AAAA=""
}
],
"Comment": "Response from 2400:cb00:2049:1::a29f:209."
}
TÄtad, no DNS viedokļa, mums vajadzÄtu izmantot DoH (vÄlams ar DNSSEC) un pievienot divus ierakstus.
Klientu atbalsts
Ja mÄs runÄjam par pÄrlÅ«kprogrammÄm, tad Å”obrÄ«d
Protams, ESNI atbalstam ir jÄizmanto TLS 1.3, jo ESNI ir TLS 1.3 paplaÅ”inÄjums.
Lai pÄrbaudÄ«tu aizmugursistÄmu ar ESNI atbalstu, mÄs ieviesÄm klientu uz go, Bet par to vairÄk vÄlÄk.
Servera puses atbalsts
PaÅ”laik ESNI neatbalsta tÄ«mekļa serveri, piemÄram, nginx/apache utt., jo tie darbojas ar TLS, izmantojot OpenSSL/BoringSSL, kas oficiÄli neatbalsta ESNI.
TÄpÄc mÄs nolÄmÄm izveidot savu priekÅ”gala komponentu (ESNI reverso starpniekserveri), kas atbalstÄ«tu TLS 1.3 izbeigÅ”anu ar ESNI un starpniekservera HTTP(S) trafiku uz augÅ”upstraumi, kas neatbalsta ESNI. Tas ļauj tehnoloÄ£iju izmantot jau esoÅ”Ä infrastruktÅ«rÄ, nemainot galvenÄs sastÄvdaļas - tas ir, izmantojot paÅ”reizÄjos tÄ«mekļa serverus, kas neatbalsta ESNI.
Skaidrības labad Ŕeit ir diagramma:
Es atzÄ«mÄju, ka starpniekserveris tika izstrÄdÄts ar iespÄju pÄrtraukt TLS savienojumu bez ESNI, lai atbalstÄ«tu klientus bez ESNI. ArÄ« saziÅas protokols ar augÅ”upeju var bÅ«t HTTP vai HTTPS ar TLS versiju, kas ir zemÄka par 1.3 (ja augÅ”upÄjais neatbalsta 1.3). Å Ä« shÄma nodroÅ”ina maksimÄlu elastÄ«bu.
ESNI atbalsta ievieÅ”ana gada go aizÅÄmÄmies no
Lai Ä£enerÄtu ESNI atslÄgas, mÄs izmantojÄm
MÄs pÄrbaudÄ«jÄm bÅ«vÄjumu, izmantojot go 1.13 operÄtÄjsistÄmÄs Linux (Debian, Alpine) un MacOS.
Daži vÄrdi par darbÄ«bas Ä«paŔībÄm
ESNI reversais starpniekserveris nodroÅ”ina metriku Prometheus formÄtÄ, piemÄram, rps, augÅ”upvÄrsto latentuma un atbildes kodus, neveiksmÄ«gus/veiksmÄ«gus TLS rokasspiedienus un TLS rokasspiediena ilgumu. No pirmÄ acu uzmetiena tas Ŕķita pietiekami, lai novÄrtÄtu, kÄ starpniekserveris apstrÄdÄ trafiku.
Pirms lietoÅ”anas veicÄm arÄ« slodzes pÄrbaudi. RezultÄti zemÄk:
wrk -t50 -c1000 -d360s 'https://esni-rev-proxy.npw:443' --timeout 15s
Running 6m test @ https://esni-rev-proxy.npw:443
50 threads and 1000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.77s 1.21s 7.20s 65.43%
Req/Sec 13.78 8.84 140.00 83.70%
206357 requests in 6.00m, 6.08GB read
Requests/sec: 573.07
Transfer/sec: 17.28MB
MÄs veicÄm tÄ«ri kvalitatÄ«vu slodzes testÄÅ”anu, lai salÄ«dzinÄtu shÄmu, izmantojot ESNI reverso starpniekserveri un bez tÄ. MÄs āielÄjÄmā satiksmi lokÄli, lai novÄrstu ātraucÄjumusā starpkomponentos.
TÄtad, izmantojot ESNI atbalstu un starpniekserveri uz augÅ”up no HTTP, mÄs saÅÄmÄm aptuveni 550 rps no vienas instances ar ESNI reversÄ starpniekservera vidÄjo CPU/RAM patÄriÅu:
- 80% CPU lietojums (4 vCPU, 4 GB RAM resursdatori, Linux)
- 130 MB atmiÅas RSS
SalÄ«dzinÄjumam, RPS tam paÅ”am nginx augÅ”pus bez TLS (HTTP protokola) pÄrtraukÅ”anas ir ~ 1100:
wrk -t50 -c1000 -d360s 'http://lb.npw:80' ā-timeout 15s
Running 6m test @ http://lb.npw:80
50 threads and 1000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.11s 2.30s 15.00s 90.94%
Req/Sec 23.25 13.55 282.00 79.25%
393093 requests in 6.00m, 11.35GB read
Socket errors: connect 0, read 0, write 0, timeout 9555
Non-2xx or 3xx responses: 8111
Requests/sec: 1091.62
Transfer/sec: 32.27MB
Taimautu klÄtbÅ«tne norÄda uz resursu trÅ«kumu (izmantojÄm 4 vCPU, 4 GB RAM resursdatorus, Linux), un patiesÄ«bÄ potenciÄlais RPS ir lielÄks (saÅÄmÄm skaitļus lÄ«dz 2700 RPS jaudÄ«gÄkiem resursiem).
NoslÄgumÄ es atzÄ«mÄju ka ESNI tehnoloÄ£ija izskatÄs diezgan daudzsoloÅ”i. JoprojÄm ir daudz atklÄtu jautÄjumu, piemÄram, jautÄjumi par publiskÄs ESNI atslÄgas glabÄÅ”anu DNS un ESNI atslÄgu rotÄciju - Å”ie jautÄjumi tiek aktÄ«vi apspriesti, un ESNI projekta jaunÄkÄ versija (raksta tapÅ”anas brÄ«dÄ«) jau ir pieejama.
Avots: www.habr.com