Kif tipproteġi l-websajt pubblika tiegħek bl-ESNI

Hello Habr, jien jisimni Ilya, naħdem fit-tim tal-pjattaforma f'Exness. Aħna niżviluppaw u nimplimentaw il-komponenti ewlenin tal-infrastruttura li jużaw it-timijiet tal-iżvilupp tal-prodott tagħna.

F'dan l-artikolu, nixtieq naqsam l-esperjenza tiegħi fl-implimentazzjoni tat-teknoloġija SNI kriptata (ESNI) fl-infrastruttura tal-websajts pubbliċi.

Kif tipproteġi l-websajt pubblika tiegħek bl-ESNI

L-użu ta 'din it-teknoloġija se jżid il-livell ta' sigurtà meta taħdem ma 'websajt pubblika u tikkonforma ma' standards ta 'sigurtà interni adottati mill-Kumpanija.

L-ewwelnett, nixtieq nirrimarka li t-teknoloġija mhix standardizzata u għadha fl-abbozz, iżda CloudFlare u Mozilla diġà jappoġġjawha (fl- abbozz01). Dan immotivana għal esperiment bħal dan.

Daqsxejn ta 'teorija

ESNI hija estensjoni għall-protokoll TLS 1.3 li tippermetti encryption SNI fil-messaġġ TLS handshake "Client Hello". Hawn kif jidher il-Klijent Hello bl-appoġġ ESNI (minflok l-SNI tas-soltu naraw ESNI):

Kif tipproteġi l-websajt pubblika tiegħek bl-ESNI

 Biex tuża ESNI, għandek bżonn tliet komponenti:

  • DNS; 
  • Appoġġ għall-klijenti;
  • Appoġġ tan-naħa tas-server.

DNS

Trid iżżid żewġ rekords DNS - AU TXT (Ir-rekord TXT fih iċ-ċavetta pubblika li biha l-klijent jista 'jikkripta SNI) - ara hawn taħt. Barra minn hekk, irid ikun hemm appoġġ DOH (DNS fuq HTTPS) minħabba li l-klijenti disponibbli (ara hawn taħt) ma jippermettux l-appoġġ ESNI mingħajr DoH. Dan huwa loġiku, peress li ESNI jimplika kriptaġġ tal-isem tar-riżorsa li qed naċċessaw, jiġifieri, ma jagħmilx sens li taċċessa DNS fuq UDP. Barra minn hekk, l-użu DNSSEC jippermettilek tipproteġi kontra attakki ta 'avvelenament cache f'dan ix-xenarju.

Bħalissa disponibbli diversi fornituri tad-DoH, fosthom:

CloudFlare jiddikjara (Iċċekkja My Browser → Encrypted SNI → Learn More) li s-servers tagħhom diġà jappoġġjaw ESNI, jiġifieri, għas-servers CloudFlare fid-DNS għandna mill-inqas żewġ rekords - A u TXT. Fl-eżempju hawn taħt aħna nistaqsu Google DNS (fuq HTTPS): 

А dħul:

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 rekord, it-talba hija ġġenerata skond mudell _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."
}

Għalhekk, mill-perspettiva tad-DNS, għandna nużaw DoH (preferibbilment b'DNSSEC) u nżidu żewġ entrati. 

Appoġġ għall-klijenti

Jekk qed nitkellmu dwar browsers, allura bħalissa l-appoġġ huwa implimentat biss f'FireFox. Hawnhekk Hawn huma struzzjonijiet dwar kif tattiva l-appoġġ ESNI u DoH f'FireFox. Wara li l-browser jiġi kkonfigurat, għandna naraw xi ħaġa bħal din:

Kif tipproteġi l-websajt pubblika tiegħek bl-ESNI

Link biex tiċċekkja l-browser.

Naturalment, TLS 1.3 għandu jintuża biex jappoġġja ESNI, peress li ESNI hija estensjoni għal TLS 1.3.

Għall-iskop li nittestjaw il-backend bl-appoġġ ESNI, implimentajna l-klijent fuq go, Imma aktar dwar dan aktar tard.

Appoġġ tan-naħa tas-server

Bħalissa, ESNI mhuwiex appoġġjat minn servers tal-web bħal nginx/apache, eċċ., peress li jaħdmu ma 'TLS permezz ta' OpenSSL/BoringSSL, li ma jappoġġjawx uffiċjalment l-ESNI.

Għalhekk, iddeċidejna li noħolqu l-komponent front-end tagħna stess (ESNI reverse proxy), li jappoġġa t-terminazzjoni ta 'TLS 1.3 b'ESNI u traffiku HTTP(S) proxy għall-upstream, li ma jappoġġjax ESNI. Dan jippermetti li t-teknoloġija tintuża f'infrastruttura diġà eżistenti, mingħajr ma jinbidlu l-komponenti ewlenin - jiġifieri, bl-użu ta 'servers tal-web attwali li ma jappoġġjawx ESNI. 

Għaċ-ċarezza, hawn dijagramma:

Kif tipproteġi l-websajt pubblika tiegħek bl-ESNI

Ninnota li l-prokura kienet iddisinjata bil-kapaċità li tittermina konnessjoni TLS mingħajr ESNI, biex tappoġġja lill-klijenti mingħajr ESNI. Ukoll, il-protokoll ta 'komunikazzjoni ma' upstream jista 'jkun jew HTTP jew HTTPS b'verżjoni TLS inqas minn 1.3 (jekk upstream ma jappoġġjax 1.3). Din l-iskema tagħti flessibilità massima.

Implimentazzjoni tal-appoġġ ESNI fuq go aħna mislufa minn CloudFlare. Nixtieq ninnota mill-ewwel li l-implimentazzjoni nnifisha hija pjuttost mhux trivjali, peress li tinvolvi bidliet fil-librerija standard kripto/tls u għalhekk teħtieġ "patching" GOROOT qabel l-assemblaġġ.

Biex niġġenera ċwievet ESNI użajna esnitool (ukoll il-ħsieb ta' CloudFlare). Dawn iċ-ċwievet jintużaw għall-encryption/decryption SNI.
Ittestjajna l-bini bl-użu ta 'go 1.13 fuq Linux (Debian, Alpine) u MacOS. 

Ftit kliem dwar karatteristiċi operattivi

ESNI reverse proxy jipprovdi metriċi fil-format Prometheus, bħal rps, latency upstream u kodiċijiet ta 'rispons, handshakes TLS falluti/suċċess & tul ta' handshake TLS. L-ewwel daqqa t'għajn, dan deher biżżejjed biex jevalwa kif il-prokura timmaniġġja t-traffiku. 

Aħna wettaqna wkoll ittestjar tat-tagħbija qabel l-użu. Riżultati hawn taħt:

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 

Aħna wettaqna ttestjar tat-tagħbija purament kwalitattiv biex inqabblu l-iskema bl-użu tal-prokura inversa ESNI u mingħajr. Aħna "ferragħ" it-traffiku lokalment sabiex neliminaw "interferenza" f'komponenti intermedji.

Allura, bl-appoġġ ESNI u l-proxying upstream minn HTTP, irċevejna madwar ~ 550 rps minn każ wieħed, bil-konsum medju ta 'CPU/RAM ta' prokura inversa ESNI:

  • 80% Użu tas-CPU (4 vCPU, 4 GB RAM hosts, Linux)
  • 130 MB Mem RSS

Kif tipproteġi l-websajt pubblika tiegħek bl-ESNI

Għal tqabbil, RPS għall-istess nginx upstream mingħajr terminazzjoni TLS (protokoll HTTP) huwa ~ 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 

Il-preżenza ta 'timeouts tindika li hemm nuqqas ta' riżorsi (użajna 4 vCPUs, 4 GB RAM hosts, Linux), u fil-fatt l-RPS potenzjali huwa ogħla (irċevejna figuri sa 2700 RPS fuq riżorsi aktar qawwija).

Bħala konklużjoni, ninnota dik it-teknoloġija ESNI tidher pjuttost promettenti. Għad hemm ħafna mistoqsijiet miftuħa, pereżempju, il-kwistjonijiet tal-ħażna taċ-ċavetta ESNI pubblika fid-DNS u ċ-ċwievet ESNI li jduru - dawn il-kwistjonijiet qed jiġu diskussi b'mod attiv, u l-aħħar verżjoni tal-abbozz tal-ESNI (fil-ħin tal-kitba) diġà hija 7.

Sors: www.habr.com

Żid kumment