Tere, Habr! Minu nimi on Ilja, ma töötan Exnessi platvormimeeskonnas. Me arendame ja rakendame pÔhistruktuuri komponente, mida kasutavad meie toote arendusmeeskonnad.
Selles artiklis soovin jagada kogemusi tehnoloogia encrypted SNI (ESNI) rakendamise kohta avalike veebisaitide infrastruktuuris.

Selle tehnoloogia kasutamine vÔimaldab suurendada avaliku veebisaidi turvalisust ja vastata organisatsiooni sissepoliitilistele turvastandarditele.
Enne kui alustan, tahan mÀrkida, et tehnoloogia ei ole veel standardiseeritud ja on ikka veel mustand, kuid CloudFlare ja Mozilla toetavad seda juba ( ). See motiveeris meid selliseks eksperimendiks.
Natuke teooriat
ESNI on TLS 1.3 protokolli laiendus, mis vĂ”imaldab SNI-d krĂŒpteerida TLS handshake'i "Client Hello" sĂ”numis. Nii nĂ€eb vĂ€lja Client Hello, mis toetab ESNI-d (tavapĂ€rase SNI asemel nĂ€eme ESNI-d):

 ESNI kasutamiseks on vajalik kolm koostisosade:
- DNS;Â
- Kliendi poolne tugi;
- Serveri poolne tugi.
DNS
On vaja lisada kaks DNS kanta - A, ja TXT (TXT-kirje sisaldab avalikku vĂ”tit, millega klient saab SNI-d krĂŒpteerida) â vt allpool. Lisaks peab olema tugi DoH (DNS ĂŒle HTTPS), kuna saadaval olevad kliendid (vt allpool) ei aktiveeri ESNI tuge ilma DoH-ta. See on mĂ”istlik, kuna ESNI eeldab ressurssi nime krĂŒpteerimist, millega me ĂŒhendust vĂ”tame, seega pole mĂ”tet pöörduda DNS-i poole UDP kaudu. Veelgi enam, kasutamine aitab kaitsta 'cache poisoning' rĂŒnnakute eest selles stsenaariumis.
Praeguseks on saadaval , nende hulgas:
CloudFlare (Check My Browser â Encrypted SNI â Learn More), et nende serverid toetavad juba praegu ESNI-d, st CloudFlare'i serverite jaoks DNS-is on vĂ€hemalt kaks kirjet â A ja TXT. Allolevas nĂ€ites kĂŒsime Google DNS-i (HTTPS-i kaudu):Â
A kirje:
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 kirje, pÀring koostatakse mallil _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."
}Seega, DNS-i seisukohalt peame kasutama DoH (eelistatavalt DNSSEC-iga) ja lisama kaks kirjet.Â
Kliendi tugi
Kui rÀÀgime brauseritest, siis hetkel . Siin on juhised, kuidas aktiveerida ESNI ja DoH tugi FireFoxis. Kui brauser on konfigureeritud, peaksime nÀgema umbes sellist pilti:

brauseri kontrollimiseks.
Muidugi peab ESNI toe tagamiseks olema kasutusel TLS 1.3, kuna ESNI on TLS 1.3 laiendus.
ESNI toe edendamiseks oleme realiseerinud kliendi go, kuid sellest natuke hiljem.
Serveri tugi
Praegu ei toeta ESNI veebiserverid nagu nginx/apache jne, kuna need töötavad TLS-iga OpenSSL/BoringSSL kaudu, kus ESNI ametlikult ei ole toetatud.
SeetĂ”ttu otsustasime luua oma front-end komponendi (ESNI tagasiproks), mis toetaks TLS 1.3 terminaatorit koos ESNI-ga ning HTTP(S) liikluse silumist allavoolu, mis ei toeta ESNI-d. See vĂ”imaldab tehnoloogia rakendamist juba olemasolevas infrastruktuuris, ilma pĂ”hikomponente muutes â st kasutada olemasolevaid veebiservereid, mis ei toeta ESNI-d.Â
Toome selguse huvides vÀlja skeemi:

TĂ€htis on mĂ€rkida, et proks on mĂ”eldud TLS-i ĂŒhenduse lĂ”petamiseks ilma ESNI-ta, et toetada kliente, kes ei kasuta ESNI-d. Samuti vĂ”ib suhtlusprotokoll allavoolu olla nii HTTP kui ka HTTPS, koos TLS-i versiooniga madalam kui 1.3 (kui allavool ei toeta 1.3). Selline skeem annab maksimaalse paindlikkuse.
ESNI toe rakendamise go me laenasime . TĂ”staksin esile, et rakendamine on ĂŒsna keeruline, kuna see eeldab muudatusi standardraamatukogus crypto/tls ja seetĂ”ttu nĂ”uab see 'patchimist' GOROOT enne kokkupanekut.
ESNI vĂ”tmete genereerimiseks kasutasime (mille on ka loonud CloudFlare). Need vĂ”tmed on mĂ”eldud SNI krĂŒpteerimiseks/dekrĂŒpteerimiseks.
Testisime kogumist, kasutades go 1.13 Linuxis (Debian, Alpine) ja MacOS-iga.Â
MÔned sÔnad tööpÔhimÔtete kohta
ESNI pöördproksi pakub metrikat Prometheuse formaadis, nĂ€iteks rps, ĂŒlemineku latentsus & response codes, ebaĂ”nnestunud/edukad TLS-kĂ€eulatused & TLS-kĂ€eulatused kestus. Esmapilgul tundus, et see on piisav, et hinnata, kuidas proksi liiklust haldab.Â
Enne kasutamist viisime lÀbi koormustesti. Tulemused on jÀrgmised:
wrk -t50 -c1000 -d360s 'https://esni-rev-proxy.npw:443' --timeout 15s
KĂ€imas 6m test @ https://esni-rev-proxy.npw:443
50 lĂ”ime ja 1000 ĂŒhendust
LĂ”ime statistika Keskmine StandardhĂ€lve Max +/â StandardhĂ€lve
Latentsus 1.77s 1.21s 7.20s 65.43%
Req/Sec 13.78 8.84 140.00 83.70%
206357 pÀringut 6.00m jooksul, 6.08GB loetud
PĂ€ringud/s: 573.07
Ălekanded/s: 17.28MB Koormustesti viisime lĂ€bi puhtalt kvaliteetsete, et vĂ”rrelda skeeme kasutades ESNI pöördproksi ja ilma. Suunates liiklust kohalikult, soovisime vĂ€listada 'hĂ€ireid' vahekomponentides.
Nii, ESNI toe ja HTTP ĂŒlemineku korral saime umbes ~ 550 rps ĂŒhe instantsi kohta, samal ajal kui keskmine CPU/RAM tarbimine ESNI pöördproksi oli:
- 80% CPU kasutus (4 vCPU, 4 GB RAM hostid, Linux)
- 130 MB Mem RSS

VĂ”rdluseks: RPS sama ĂŒlemineku nginx-i jaoks ilma TLS-terminatsiooni (HTTP protokoll) ~ 1100:
wrk -t50 -c1000 -d360s 'http://lb.npw:80' â-timeout 15s
KĂ€ivitame 6-minutilise testi aadressil http://lb.npw:80
50 lĂ”ime ja 1000 ĂŒhendust
LÔimete statistika Avg Stdev Max +/- Stdev
Latentsus 1.11s 2.30s 15.00s 90.94%
Req/Sec 23.25 13.55 282.00 79.25%
393093 pÀringut 6.00 minutiga, 11.35GB loetud
Soketivead: ĂŒhendamine 0, lugemine 0, kirjutamine 0, timeout 9555
Mitte-2xx vÔi 3xx vastused: 8111
PĂ€ringud/s: 1091.62
Ălekanded/s: 32.27MB Aegade puudumine viitab sellele, et ressursse on vĂ€he (kasutasime 4 vCPU, 4 GB RAM hoste, Linux), ja tegelikult on potentsiaalne RPS kĂ”rgem (oleme saanud numbreid kuni 2700 RPS vĂ”imsamates seadmete puhul).
KokkuvĂ”tteks mĂ€rgin, et ESNI tehnoloogia nĂ€ib olema pĂ€ris lootustandev. On veel palju avatud kĂŒsimusi, nĂ€iteks avaliku ESNI vĂ”tme ladustamise kĂŒsimused DNS-is ja ESNI vĂ”tmete rotatsioon â neid kĂŒsimusi arutatakse aktiivselt, ja viimane projekti versioon (kĂ€esoleva kirjutamise hetkel) ESNI on juba .
Allikas: habr.com
