Tere, Habr! Minu nimi on Ilja ja ma töötan Exnessi platvormimeeskonnas. Me arendame ja rakendame pÔhistruktuuri komponente, mida kasutavad meie toote arendusmeeskonnad.
Selles artiklis sooviksin jagada kogemust, kuidas me rakendasime tehnoloogiat, mida nimetatakse encrypted SNI (ESNI), avalike veebisaitide infrastruktuuris.

Selle tehnoloogia kasutamine tÔstab turvalisuse taset avaliku veebisaidi kasutamisel ja vastab ettevÔtte sisemistele turvastandarditele.
Esiteks, soovin tÀhelepanu juhtida sellele, et tehnoloogia ei ole standardiseeritud ja on endiselt kavandi staatuses, kuid CloudFlare ja Mozilla toetavad seda juba ( ). Just see motiveeris meid selliseks eksperimentimiseks.
Veidi teooriat
ESNI on TLS 1.3 protokolli laiendus, mis vÔimaldab ƥifreerida SNI TLS handshake'i "Client Hello" sÔnumis. Nii nÀeb vÀlja Client Hello ESNI toega (tavalise SNI asemel nÀeme ESNI-d):

 ESNI kasutamiseks on vajalik kolm komponenti:
- DNS;Â
- TugivÔimalus kliendilt;
- TugivÔimalus serverilt.
DNS
Peame lisama kaks DNS-i kirjet â A, ja TXT (TXT kirje sisaldab avalikku vĂ”tit, mille abil klient saab SNI-d ĆĄifreerida) â vt allpool. Lisaks peab olema tugi DoH (DNS over HTTPS), kuna saadaval olevad kliendid (vt allpool) ei aktiveeri ESNI toetust ilma DoH-ta. See on loogiline, kuna ESNI tĂ€hendab, et ressursside nime ĆĄifreeritakse, st pole mĂ”tet pöörduda DNS-i poole UDP kaudu. Veelgi enam, aitab kaitsta "cache poisoning" rĂŒnnakute eest selles stsenaariumis.
Praegu on saadaval sealhulgas:
CloudFlare (Check My Browser â Encrypted SNI â Learn More), et nende serverid toetavad juba praegu ESNI-d, seega CloudFlare'i serverite jaoks DNS-is on meil 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 moodustatakse jÀrgmiselt _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."
}Nii, DNS-i seisukohalt peab me kasutama DoH-i (soovitavalt koos DNSSEC-iga) ja lisama kaks kirjet.Â
Kliendi tugi
Kui me rÀÀgime brauseritest, siis praegu . siin on juhis, kuidas aktiveerida ESNI ja DoH tugi FireFoxis. Kui brauser on seadistatud, peaksime nÀgema umbes sellist pilti:

brauseri kontrollimiseks.
Muidugi peab ESNI toetamiseks olema kasutusel TLS 1.3, kuna ESNI on TLS 1.3 laiendus.
ESNI toega tagapinna testimise eesmÀrkidel oleme ellu viinud kliendi go, kuid sellest rÀÀgime hiljem.
Serveri tugi
Praegu ei toeta ESNI veebiserverid nagu nginx/apache jne, kuna nad töötavad TLS-iga OpenSSL/BoringSSL kaudu, milles ESNI ametlikult ei ole toetatud.
SeetĂ”ttu otsustasime luua oma front-end komponendi (ESNI reverse proxy), mis toetaks TLS 1.3 terminatsiooni ESNI-ga ja HTTP(S) liikluse edastamist upstream-i, mis ei toeta ESNI-d. See vĂ”imaldab tehnoloogiat rakendada juba olemasolevas infrastruktuuris, ilma pĂ”hiliste komponentide muutmiseta â st kasutada praeguseid veebiservereid, mis ei toeta ESNI-d.Â
Selguse huvides toome vÀlja skeemi:

Tahan mĂ€rkida, et proxy on mĂ”eldud TLS-ĂŒhenduse terminatsiooniks ilma ESNI-ta, et toetada kliente, kellel ei ole ESNI-d. Samuti vĂ”ib suhtlusprotokoll upstream-iga olla nii HTTP kui ka HTTPS, kus TLS versioon on alla 1.3 (kui upstream ei toeta 1.3). Selline skeem pakub maksimaalset paindlikkust.
ESNI toe rakendamine go oleme laenanud . Tahan kohe mĂ€rkida, et rakendus ise on ĂŒsna keeruline, kuna see hĂ”lmab muudatusi tavapĂ€rases teegis crypto/tls ja seetĂ”ttu nĂ”uab see 'patchimist' GOROOT enne kompileerimist.
ESNI vĂ”tmete genereerimiseks kasutasime (see on samuti CloudFlare'i looming). Need vĂ”tmed kasutatakse SNI krĂŒpteerimiseks/dekrĂŒpteerimiseks.
Oleme testinud koondise kasutades go 1.13 Linuxis (Debian, Alpine) ja MacOS-is.Â
MÔned sÔnad tööalaste omaduste kohta
ESNI reverse proxy pakub metrikat Prometheuse formaadis, nĂ€iteks rps, upstream latentsus & vastuse koodid, ebaĂ”nnestunud/Ă”nnestunud TLS kĂ€epigistused & TLS kĂ€epigistuse kestus. Esmapilgul tundus see piisav, et hinnata, kuidas proxy liiklusega toime tuleb.Â
Samuti viisime enne kasutamist lÀbi koormustestimise. Tulemused on allpool:
wrk -t50 -c1000 -d360s 'https://esni-rev-proxy.npw:443' --timeout 15s
KĂ€ivitamine 6m testi aadressil 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/Sek  13.78   8.84  140.00   83.70%
  206357 pÀringut 6.00m, 6.08GB loetud
PĂ€ringud/sec:Â Â 573.07
Ălekande/sec:   17.28MB Koormustestimise viisime lĂ€bi puhtalt kvalitatiivselt, et vĂ”rrelda skeeme, kasutades ESNI reverse proxy-d ja ilma. Suunasime liiklust kohapeal, et vĂ€listada âhĂ€ireidâ vahekomponentides.
Seega, koos ESNI toetuse ja proxied HTTP upstream'iga, saime ligi ~ 550 rps ĂŒhest instantsist, kusjuures ESNI reverse proxy keskmine CPU/RAM tarbimine:
- 80% CPU kasutus (4 vCPU, 4 GB RAM hostid, Linux)
- 130 MB Mem RSS

VÔrdluseks, RPS sama upstreami jaoks nginx ilma TLS terminatsioonita (HTTP protokoll) ~ 1100:
wrk -t50 -c1000 -d360s 'http://lb.npw:80' â-timeout 15s
KĂ€ivitamine 6m testi aadressil http://lb.npw:80
  50 lĂ”ime ja 1000 ĂŒhendust
  LĂ”ime statistika  Keskmine   StandardhĂ€lve   Max  +/â StandardhĂ€lve
    Latentsus   1.11s   2.30s  15.00s  90.94%
    Req/Sek  23.25   13.55  282.00   79.25%
  393093 pÀringut 6.00m, 11.35GB loetud
  Socketi vead: ĂŒhendus 0, lugemine 0, kirjutamine 0, aegumise 9555
  Non-2xx vÔi 3xx vastused: 8111
PĂ€ringud/sec: Â 1091.62
Ălekande/sec:   32.27MB Aegumiste olemasolu viitab ressursipuudusele (kasutasime 4 vCPU, 4 GB RAM hostid, Linux), ja tegelikult on potentsiaalne RPS kĂ”rgem (saime numbreid kuni 2700 RPS vĂ”imsamatel ressurssidel).
KokkuvĂ”tteks nendin, et tehnoloogia ESNI nĂ€ib piisavalt lootustandev. On veel palju lahendamata kĂŒsimusi, nĂ€iteks avaliku ESNI vĂ”tme hoidmine DNS-is ja ESNI vĂ”tmete rotatsioon â neid kĂŒsimusi arutatakse aktiivselt, ja viimane versioon projektist (kirjutamise hetkel) ESNI on juba .
Allikas: habr.com
