Чӣ тавр вебсайти ҷамъиятии худро бо ESNI муҳофизат кунед

Салом Ҳабр, номи ман Иля, ман дар гурӯҳи платформа дар Exness кор мекунам. Мо ҷузъҳои асосии инфрасохториро, ки гурӯҳҳои таҳияи маҳсулоти мо истифода мебаранд, таҳия ва татбиқ мекунем.

Дар ин мақола ман мехоҳам таҷрибаи худро оид ба татбиқи технологияи рамзгузоришудаи SNI (ESNI) дар инфрасохтори вебсайтҳои ҷамъиятӣ мубодила кунам.

Чӣ тавр вебсайти ҷамъиятии худро бо ESNI муҳофизат кунед

Истифодаи ин технология сатҳи амниятро ҳангоми кор бо вебсайти ҷамъиятӣ афзоиш медиҳад ва ба стандартҳои амнияти дохилии аз ҷониби ширкат қабулшуда мувофиқат мекунад.

Пеш аз ҳама, ман мехоҳам қайд намоям, ки технология стандартизатсия нашудааст ва ҳоло ҳам дар лоиҳа аст, аммо CloudFlare ва Mozilla аллакай онро дастгирӣ мекунанд (дар лоиҳаи 01). Ин моро ба чунин озмоиш водор кард.

Якчанд назария

ЭСНИ тамдиди протоколи TLS 1.3 мебошад, ки имкон медиҳад рамзгузории SNI дар паёми дастфишори TLS "Client Hello". Ин аст Client Hello бо дастгирии ESNI чӣ гуна ба назар мерасад (ба ҷои SNI муқаррарии мо ESNI-ро мебинем):

Чӣ тавр вебсайти ҷамъиятии худро бо ESNI муҳофизат кунед

 Барои истифодаи ESNI ба шумо се ҷузъ лозим аст:

  • DNS; 
  • Дастгирии муштарӣ;
  • Дастгирии тарафи сервер.

DNS

Шумо бояд ду сабти DNS илова кунед - Aва TXT (Сабти TXT дорои калиди оммавӣ мебошад, ки муштарӣ метавонад SNI-ро рамзгузорӣ кунад) - ба поён нигаред. Илова бар ин, бояд дастгирӣ бошад DoH (DNS тавассути HTTPS) зеро муштариёни дастрас (нигаред ба поён) бе DoH дастгирии ESNI-ро фаъол намекунанд. Ин мантиқист, зеро ESNI рамзгузории номи манбае, ки мо дастрас мекунем, дар назар дорад, яъне дастрасӣ ба DNS тавассути UDP маъно надорад. Илова бар ин, истифодаи DNSSEC ба шумо имкон медиҳад, ки дар ин сенария аз ҳамлаҳои заҳролудшавии кэш муҳофизат кунед.

Дар айни замон дастрас якчанд провайдерҳои DoH, дар байни онҳо:

CloudFlare изхор менамояд (Тафтиш кунед Браузери ман → Рамзшуда SNI → Маълумоти бештар), ки серверҳои онҳо аллакай ESNI -ро дастгирӣ мекунанд, яъне барои серверҳои CloudFlare дар DNS мо ҳадди аққал ду сабт дорем - A ва TXT. Дар мисоли зер мо Google DNS-ро (бар HTTPS) дархост мекунем: 

А вуруд:

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 сабт, дархост мувофиқи қолаб тавлид мешавад _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."
}

Ҳамин тавр, аз нуқтаи назари DNS, мо бояд DoH-ро истифода барем (беҳтараш бо DNSSEC) ва ду вуруд илова кунем. 

Дастгирии муштариён

Агар мо дар бораи браузерҳо сухан ронем, пас дар айни замон дастгирӣ танҳо дар FireFox амалӣ карда мешавад. Ин аст, Дар ин ҷо дастурҳо оид ба фаъол кардани дастгирии ESNI ва DoH дар FireFox мавҷуданд. Пас аз танзим кардани браузер, мо бояд чунин чизеро бубинем:

Чӣ тавр вебсайти ҷамъиятии худро бо ESNI муҳофизат кунед

пайванд барои тафтиш кардани браузер.

Албатта, TLS 1.3 бояд барои дастгирии ESNI истифода шавад, зеро ESNI тамдиди TLS 1.3 мебошад.

Бо мақсади санҷиши пуштибонии пуштибонӣ бо дастгирии ESNI, мо муштариро дар он татбиқ кардем go, Аммо дар ин бора баъдтар.

Дастгирии тарафи сервер

Дар айни замон, ESNI аз ҷониби серверҳои веб ба монанди nginx/apache ва ғайра дастгирӣ намешавад, зеро онҳо бо TLS тавассути OpenSSL/BoringSSL кор мекунанд, ки расман ESNI-ро дастгирӣ намекунанд.

Аз ин рӯ, мо тасмим гирифтем, ки ҷузъи пешинаи худро (ESNI прокси баръакс) созем, ки қатъи TLS 1.3-ро бо ESNI ва трафики прокси HTTP(S) ба болооб, ки ESNI-ро пуштибонӣ намекунад, дастгирӣ мекунад. Ин имкон медиҳад, ки технология дар инфрасохтори мавҷуда бидуни тағир додани ҷузъҳои асосӣ, яъне бо истифода аз веб-серверҳои ҷорӣ, ки ESNI-ро дастгирӣ намекунанд, истифода шавад. 

Барои равшанӣ, ин диаграмма аст:

Чӣ тавр вебсайти ҷамъиятии худро бо ESNI муҳофизат кунед

Ман қайд мекунам, ки прокси бо қобилияти қатъ кардани пайвасти TLS бе ESNI, барои дастгирии мизоҷон бидуни ESNI тарҳрезӣ шудааст. Инчунин, протоколи иртибот бо болооб метавонад HTTP ё HTTPS бо версияи TLS камтар аз 1.3 бошад (агар болооб 1.3-ро дастгирӣ накунад). Ин схема чандирии максималиро медиҳад.

Амалисозии дастгирии ESNI дар go аз карз гирифтем CloudFlare. Ман мехоҳам фавран қайд намоям, ки худи татбиқ хеле ночиз аст, зеро он тағиротро дар китобхонаи стандартӣ дар бар мегирад крипто/тлс ва аз ин рӯ, "ҷасбкунӣ" -ро талаб мекунад Горот пеш аз чамъомад.

Барои тавлиди калидҳои ESNI мо истифода бурдем esnitool (инчунин ташаббуси CloudFlare). Ин калидҳо барои рамзгузории SNI/рамзкушой истифода мешаванд.
Мо сохтмонро бо истифода аз go 1.13 дар Linux (Debian, Alpine) ва MacOS озмоиш кардем. 

Якчанд сухан дар бораи хусусиятҳои амалиётӣ

Прокси баръакси ESNI ченакҳоро дар формати Prometheus таъмин мекунад, ба монанди rps, таъхири боло ва рамзҳои посух, дастфишориҳои ноком/муваффақи TLS ва давомнокии дастфишори TLS. Дар назари аввал, ин барои арзёбии он ки чӣ тавр прокси трафикро идора мекунад, кофӣ менамуд. 

Мо инчунин пеш аз истифода озмоиши сарборӣ кардем. Натиҷаҳои зерин:

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 

Мо барои муқоисаи схема бо истифода аз прокси баръакси ESNI ва бидуни он озмоиши сарбории сифатӣ анҷом додем. Мо трафикро ба таври маҳаллӣ "рехтем" бо мақсади бартараф кардани "дахолат" ба ҷузъҳои мобайнӣ.

Ҳамин тавр, бо дастгирии ESNI ва прокси ба боло аз HTTP, мо аз як мисол тақрибан ~ 550 rpps ба даст овардем, ки истеъмоли миёнаи CPU/RAM-и прокси баръакси ESNI:

  • 80% Истифодаи CPU (4 vCPU, 4 ГБ RAM, Linux)
  • 130 МБ хотираи RSS

Чӣ тавр вебсайти ҷамъиятии худро бо ESNI муҳофизат кунед

Барои муқоиса, RPS барои ҳамон nginx боло бе қатъшавии TLS (протоколи HTTP) ~ 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 

Мавҷудияти мӯҳлатҳо нишон медиҳад, ки норасоии захираҳо вуҷуд дорад (мо 4 vCPU, 4 ГБ ҳостҳои RAM, Linux истифода мебурдем) ва дар асл потенсиали RPS баландтар аст (мо дар бораи захираҳои пурқувваттар рақамҳои то 2700 RPS гирифтем).

Дар хотима кайд мекунам ки технологияи ESNI хеле умедбахш менамояд. Ҳанӯз бисёр саволҳои кушода мавҷуданд, масалан, масъалаҳои нигоҳдории калиди ҷамъиятии ESNI дар DNS ва гардиши калидҳои ESNI - ин масъалаҳо фаъолона муҳокима карда мешаванд ва версияи охирини лоиҳаи ESNI (дар вақти навиштан) аллакай 7.

Манбаъ: will.com

Илова Эзоҳ