Kuidas kaitsta oma avalikku saiti ESNI-ga

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.

Kuidas kaitsta oma avalikku saiti ESNI-ga

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 ( draft01). 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):

Kuidas kaitsta oma avalikku saiti ESNI-ga

 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, DNSSEC aitab kaitsta "cache poisoning" rĂŒnnakute eest selles stsenaariumis.

Praegu on saadaval mitmeid DoH teenusepakkujaid,sealhulgas:

CloudFlare teatab (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 tugi on ellu viidud ainult FireFoxis. Siin siin on juhis, kuidas aktiveerida ESNI ja DoH tugi FireFoxis. Kui brauser on seadistatud, peaksime nÀgema umbes sellist pilti:

Kuidas kaitsta oma avalikku saiti ESNI-ga

Link 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:

Kuidas kaitsta oma avalikku saiti ESNI-ga

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 CloudFlare. 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 esnitool (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

Kuidas kaitsta oma avalikku saiti ESNI-ga

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 7.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster